- 浏览: 90881 次
文章分类
最新评论
一、类的创建及初始化
类通常是一类事物的抽象,如人就是一个类,你、我、他是这个类的具体实例,也就是对象。在Java中我们可以通过形如:class A {}来创建一个类,我们说过Java是面向对象的语言,每个对象都应该拥有它自己的属性和方法,就拿人来说,肤色、身高等是人的属性,吃、喝、玩等都是方法,也就是说属性描绘了类的特点,而方法描述了类的功能,体现在Java的类中就像下面的代码这样:
class People{
private int age;
eat();
}
在面向对象的思想中,一切皆对象,我们以对象为单位进行编程,将这个对象所有的属性方法包装在一起,就是封装。一般情况,我们通过类的构造器来创建类对象,构造器是一个拥有和类名同样的名字的方法,我们可以对它传递参数,进行一些初始化工作,如,当我们需要在创建对象的时候,初始化其姓名及年龄,我们 可以这样来做:
class People{
private name;
private age;
public People(String name,int age){
this.name=name;
this.age=age;
}
}
测试类:
public class Test{
public static main(String[] args){
People person=new People("skx",28);
}
}
new 操作符会为我们在内存中开辟空间(后面会详细讲解堆栈内存),person是对象名,也是引用,在栈上分配,指向由new在堆上分配的内容,具体由JVM内存管理,这里不深讲。我们再来分析一下这个过程:当调用new Person()时,编译器首先检查下原类Person中是否有Person()构造方法,此处因为有public Person(String name,int age),所以new的时候,直接调用的该方法,但是很多时候,我们并没有显示声明构造方法,此时,编译器在调用的new Person()的时候,会自动为我们的Person类添加一个无参的空Person()构造方法:Person(){},来执行类的构造过程。
&&:变量无论放在什么地方,都会先于任意一个方法的执行前执行,包括构造方法,而构造方法是一个类(创建时)必须会执行的方法,不需要显示的进行调用。同时,不论变量在哪儿分布,只要在方法外部,就一定先于方法初始化。
public class Person {
public Person(int id) {
System.out.println("person(" + id + ")");
}
//静态方法优先于普通方法(赋值,实例是普通方法);
public static void main(String[] args) {
Build b = new Build();
}
}
class Build {
//p1是Build的属性,优先于构造方法Build()执行,将执行Person(1);
Person p1 = new Person(1);
public Build() { //在这里,将最后执行
System.out.println("this is build's block!");
Person p2 = new Person(2);
}
//p3是Build的属性,优先于构造方法Build()执行,将执行Person(3);
Person p3 = new Person(3);
}
另一个关键的知识点静态块和非静态块。二者都有很简单的声明方式,只需一对大括号{}就行,静态块的话,在前面加static关键字,我们写个小程序来看看:
public class Person {
/*静态块,与主静态方法依顺序执行,只执行一次*/
static{
System.out.println("this is static block!");
}
/*非静态块,执行2次*/
{
System.out.println("this is non-static block!");
}
public Person(int id) {
System.out.println("person(" + id + ")");
}
public static void main(String[] args) {
Person p1 = new Person(1);
Person p2 = new Person(2);
}
}
该程序输出:
this is static block!
this is non-static block!
person(1)
this is non-static block!
person(2)&&:静态块是在类装载时执行的(编译成.class文件,第一次被调用、应用时),且只执行一次。而非静态块是在调用构造方法之前执行的,每生成一个实例对象,就会调用一次非静态块。
Java代码 收藏代码
class A{
static{
System.out.println("1111");
}
{
System.out.println("3333");
}
static void print(){
System.out.println("jjjjjjj");
}
}
public class Extends extends A{
public static void main(String[] args){
System.out.println("22");
}
}
输出结果:
1111
22
这里没有调用A的构造函数,只是对A.class进行了加载,所以只运行A的静态块;而静态方法[实例调用才会执行]和非静态块[也需要实例调用时执行]没有被执行。
此处,我想引入一个很重要的知识点:static关键字。一般来说,被声明为static的变量或者方法,或者前面说的块,都属于静态属性、静态方法(有时称:类属性、类方法),属于类级属性(想象为类的原型属性,在方法区分配内存)。如静态块一样,其它的静态属性也具有这个特点:初始化只在类装载的时候执行一次。对于类变量和类方法,还有一个重要的特点就是,外部对象对他们的引用可以直接通过类名来调用。
除了使用new操作符,我们还有一些其它方法来创建类,如Java的反射机制,后面会有专门的文章来介绍相关的知识点。
public class A{
public static void main(String[] args){
A a=new A();
]
}
主方法可以放在在其他任意类中,可以理解为主方法在另外一个class B中定义的,要调用A的属性,先声明创建A实例;
总体来说执行顺序为:静态块,静态属性->非静态块,属性->构造器;对于静态块和静态属性或者非静态块和属性,初始化顺序决定于它们在代码中的顺序。
接下来我们分析一下类的属性和方法
属性:
类中的属性一般分为类属性(静态属性)、实例属性(全局变量)、局部属性(局部变量)。
类属性:前面已经说过就是那些声明为static的属性,在整个过程中只进行一次初始化,在内存中只开辟一个空间,不论在哪儿调用,值保持一致。一旦被修改,所有引用它的地方都会跟着修改。一般直接通过类名进行调用。
实例属性:实例变量是可以不进行初始化(只声明),比如一个整型没有初始化,则默认值为0,String为null;而局部变量假如不赋初值语法上是通过的,但是在使用这个变量是程序就报错了。基本数据类型在栈中分配内存,引用数据类型在堆栈中都分配内存,在堆当中分配的是对象本身,而栈中则是对这个对象的引用。
局部属性:局部变量是在方法内部声明的变量,生命期仅在方法内,方法结束后变量就消失了;局部变量必须初始化再使用,否则会报错,也就是说,假如你在方法内定义了一个局部变量,并且没有赋值,那么你在使用这个变量的时候一定得赋值,不然就报错了。同时,局部变量可屏蔽全局变量。
方法:
方法就是类的行为,形如:public void say(){ dosomething...};由方法头和方法体构成,方法头包括:访问控制符(如public private等)、返回类型(取决于方法返回值类型)、方法名、参数列表组成。声明为void的方法,返回值为空。在特殊的情况 下,我们可以为方法添加一些特殊的关键字以实现特殊的功能,如synchronized、final、static、abstract等等。两个重要的方面:重载(Overload)和重写(Override也称覆写)。
重载:
是指在同一个类中,具有相同的方法名,不同的参数列表的方法之间的一种机制。参数列表的不同体现在:类型不同、个数不同、顺序不同,只要满足任一一个,就可以进行方法重载。
若用同一个方法名print,同步传入不同的参数,实现不同的功能,这就是方法重载,用这样的机制有什么好处?个人感觉就是在模型上的一种统一,同样的功能,调用同样的方法,只需传入不同的参数,增强了程序的可读性和易于维护,当有很多个功能相似的方法的时候,如果我们为多个方法只设计了一个名称,想通过名称来区分它们的话,会很糟糕,而且会让人觉得程序的可读性差,设计不够巧妙!此处问题来了:我们可不可通过方法的返回值来区别方法重载?
&&:当调用两个不同返回类型,其他参数相同的方法时,并不会先得到他们的返回值,返回值只有在方法执行完毕才返回,在调用之初,编译器无法判断他们的区别,所以只能当同名方法来处理:报错!所以试图通过返回值来进行方法重载是不正确的!
重写:
重写是在继承中存在的,在两个类(子类和父类之间存在的关系)中,子类重写父类的方法,方法名相同,参数也相同的一种机制。
当子类继承了父类后,想对父类的方法功能进行扩展,就可以使用重写,这样做的目的就是:当你需要扩展新的功能的时候,不需要新建方法,在父类的方法中进行补充,这样一种面向对象思维的体现,不用重写同样可以达到这样的效果,但是用了重写更加符合OO思想。子类覆写父类方法,才能被识别;
&&:向上转型时,被覆写的方法,子类的方法优先于父类方法执行,但是,父类的属性不受影响!(详见后面的继承)
不定参数方法
有的时候,我们不能确定方法的参数个数,我们可以采取这种机制(String ... args)或(String[] args),如下面的代码:
Java代码 收藏代码
public class Extends {
public static void print(String...args){
for(int i = 0;i<args.length;i++){
System.out.print(args[i]+" ");
}
}
public static void main(String[] args){
print("sd","ew","we","dd");
}
}
类通常是一类事物的抽象,如人就是一个类,你、我、他是这个类的具体实例,也就是对象。在Java中我们可以通过形如:class A {}来创建一个类,我们说过Java是面向对象的语言,每个对象都应该拥有它自己的属性和方法,就拿人来说,肤色、身高等是人的属性,吃、喝、玩等都是方法,也就是说属性描绘了类的特点,而方法描述了类的功能,体现在Java的类中就像下面的代码这样:
class People{
private int age;
eat();
}
在面向对象的思想中,一切皆对象,我们以对象为单位进行编程,将这个对象所有的属性方法包装在一起,就是封装。一般情况,我们通过类的构造器来创建类对象,构造器是一个拥有和类名同样的名字的方法,我们可以对它传递参数,进行一些初始化工作,如,当我们需要在创建对象的时候,初始化其姓名及年龄,我们 可以这样来做:
class People{
private name;
private age;
public People(String name,int age){
this.name=name;
this.age=age;
}
}
测试类:
public class Test{
public static main(String[] args){
People person=new People("skx",28);
}
}
new 操作符会为我们在内存中开辟空间(后面会详细讲解堆栈内存),person是对象名,也是引用,在栈上分配,指向由new在堆上分配的内容,具体由JVM内存管理,这里不深讲。我们再来分析一下这个过程:当调用new Person()时,编译器首先检查下原类Person中是否有Person()构造方法,此处因为有public Person(String name,int age),所以new的时候,直接调用的该方法,但是很多时候,我们并没有显示声明构造方法,此时,编译器在调用的new Person()的时候,会自动为我们的Person类添加一个无参的空Person()构造方法:Person(){},来执行类的构造过程。
&&:变量无论放在什么地方,都会先于任意一个方法的执行前执行,包括构造方法,而构造方法是一个类(创建时)必须会执行的方法,不需要显示的进行调用。同时,不论变量在哪儿分布,只要在方法外部,就一定先于方法初始化。
public class Person {
public Person(int id) {
System.out.println("person(" + id + ")");
}
//静态方法优先于普通方法(赋值,实例是普通方法);
public static void main(String[] args) {
Build b = new Build();
}
}
class Build {
//p1是Build的属性,优先于构造方法Build()执行,将执行Person(1);
Person p1 = new Person(1);
public Build() { //在这里,将最后执行
System.out.println("this is build's block!");
Person p2 = new Person(2);
}
//p3是Build的属性,优先于构造方法Build()执行,将执行Person(3);
Person p3 = new Person(3);
}
另一个关键的知识点静态块和非静态块。二者都有很简单的声明方式,只需一对大括号{}就行,静态块的话,在前面加static关键字,我们写个小程序来看看:
public class Person {
/*静态块,与主静态方法依顺序执行,只执行一次*/
static{
System.out.println("this is static block!");
}
/*非静态块,执行2次*/
{
System.out.println("this is non-static block!");
}
public Person(int id) {
System.out.println("person(" + id + ")");
}
public static void main(String[] args) {
Person p1 = new Person(1);
Person p2 = new Person(2);
}
}
该程序输出:
this is static block!
this is non-static block!
person(1)
this is non-static block!
person(2)&&:静态块是在类装载时执行的(编译成.class文件,第一次被调用、应用时),且只执行一次。而非静态块是在调用构造方法之前执行的,每生成一个实例对象,就会调用一次非静态块。
Java代码 收藏代码
class A{
static{
System.out.println("1111");
}
{
System.out.println("3333");
}
static void print(){
System.out.println("jjjjjjj");
}
}
public class Extends extends A{
public static void main(String[] args){
System.out.println("22");
}
}
输出结果:
1111
22
这里没有调用A的构造函数,只是对A.class进行了加载,所以只运行A的静态块;而静态方法[实例调用才会执行]和非静态块[也需要实例调用时执行]没有被执行。
此处,我想引入一个很重要的知识点:static关键字。一般来说,被声明为static的变量或者方法,或者前面说的块,都属于静态属性、静态方法(有时称:类属性、类方法),属于类级属性(想象为类的原型属性,在方法区分配内存)。如静态块一样,其它的静态属性也具有这个特点:初始化只在类装载的时候执行一次。对于类变量和类方法,还有一个重要的特点就是,外部对象对他们的引用可以直接通过类名来调用。
除了使用new操作符,我们还有一些其它方法来创建类,如Java的反射机制,后面会有专门的文章来介绍相关的知识点。
public class A{
public static void main(String[] args){
A a=new A();
]
}
主方法可以放在在其他任意类中,可以理解为主方法在另外一个class B中定义的,要调用A的属性,先声明创建A实例;
总体来说执行顺序为:静态块,静态属性->非静态块,属性->构造器;对于静态块和静态属性或者非静态块和属性,初始化顺序决定于它们在代码中的顺序。
接下来我们分析一下类的属性和方法
属性:
类中的属性一般分为类属性(静态属性)、实例属性(全局变量)、局部属性(局部变量)。
类属性:前面已经说过就是那些声明为static的属性,在整个过程中只进行一次初始化,在内存中只开辟一个空间,不论在哪儿调用,值保持一致。一旦被修改,所有引用它的地方都会跟着修改。一般直接通过类名进行调用。
实例属性:实例变量是可以不进行初始化(只声明),比如一个整型没有初始化,则默认值为0,String为null;而局部变量假如不赋初值语法上是通过的,但是在使用这个变量是程序就报错了。基本数据类型在栈中分配内存,引用数据类型在堆栈中都分配内存,在堆当中分配的是对象本身,而栈中则是对这个对象的引用。
局部属性:局部变量是在方法内部声明的变量,生命期仅在方法内,方法结束后变量就消失了;局部变量必须初始化再使用,否则会报错,也就是说,假如你在方法内定义了一个局部变量,并且没有赋值,那么你在使用这个变量的时候一定得赋值,不然就报错了。同时,局部变量可屏蔽全局变量。
方法:
方法就是类的行为,形如:public void say(){ dosomething...};由方法头和方法体构成,方法头包括:访问控制符(如public private等)、返回类型(取决于方法返回值类型)、方法名、参数列表组成。声明为void的方法,返回值为空。在特殊的情况 下,我们可以为方法添加一些特殊的关键字以实现特殊的功能,如synchronized、final、static、abstract等等。两个重要的方面:重载(Overload)和重写(Override也称覆写)。
重载:
是指在同一个类中,具有相同的方法名,不同的参数列表的方法之间的一种机制。参数列表的不同体现在:类型不同、个数不同、顺序不同,只要满足任一一个,就可以进行方法重载。
若用同一个方法名print,同步传入不同的参数,实现不同的功能,这就是方法重载,用这样的机制有什么好处?个人感觉就是在模型上的一种统一,同样的功能,调用同样的方法,只需传入不同的参数,增强了程序的可读性和易于维护,当有很多个功能相似的方法的时候,如果我们为多个方法只设计了一个名称,想通过名称来区分它们的话,会很糟糕,而且会让人觉得程序的可读性差,设计不够巧妙!此处问题来了:我们可不可通过方法的返回值来区别方法重载?
&&:当调用两个不同返回类型,其他参数相同的方法时,并不会先得到他们的返回值,返回值只有在方法执行完毕才返回,在调用之初,编译器无法判断他们的区别,所以只能当同名方法来处理:报错!所以试图通过返回值来进行方法重载是不正确的!
重写:
重写是在继承中存在的,在两个类(子类和父类之间存在的关系)中,子类重写父类的方法,方法名相同,参数也相同的一种机制。
当子类继承了父类后,想对父类的方法功能进行扩展,就可以使用重写,这样做的目的就是:当你需要扩展新的功能的时候,不需要新建方法,在父类的方法中进行补充,这样一种面向对象思维的体现,不用重写同样可以达到这样的效果,但是用了重写更加符合OO思想。子类覆写父类方法,才能被识别;
&&:向上转型时,被覆写的方法,子类的方法优先于父类方法执行,但是,父类的属性不受影响!(详见后面的继承)
不定参数方法
有的时候,我们不能确定方法的参数个数,我们可以采取这种机制(String ... args)或(String[] args),如下面的代码:
Java代码 收藏代码
public class Extends {
public static void print(String...args){
for(int i = 0;i<args.length;i++){
System.out.print(args[i]+" ");
}
}
public static void main(String[] args){
print("sd","ew","we","dd");
}
}
发表评论
-
28、ide---helper
2015-04-13 10:03 01、Eclipse 安装反编译插件jadclipse(经验总结 ... -
Private2、Map --->Model
2015-04-04 09:22 01、mybatis --->interface Ma ... -
Private1、Javabean <---->json
2015-04-04 08:30 01、简单生成 ---- jsonTree easyUI- ... -
lll.单列
2015-03-11 13:32 0概括起来,要实现“单子设计模式”,可以利用下面的方式来完成: ... -
####.Java分隔符
2015-03-11 13:21 01.分号 在Java中语句的 ... -
JSF1.1和JSF1.2之间表达式语言的变化(转)
2015-03-09 21:11 0JavaServer Faces 1.1和1,.2版之间最基本 ... -
27、Java加密技术(九)——SSL(CA)
2015-04-02 11:39 445<转>http://snowolf.iteye.c ... -
26、Java加密技术(八)——数字证书
2015-03-31 14:40 473<转>http://snowolf.iteye.c ... -
25、Java加密技术(七)——非对称加密算法最高级ECC
2015-03-31 14:40 683<转>http://snowolf.iteye.c ... -
24、Java加密技术(六)——数字签名算法DSA
2015-03-31 14:40 580<转>http://snowolf.iteye.c ... -
23、Java加密技术(五)——非对称加密算法的由来DH
2015-03-31 14:39 532<转>http://snowolf.iteye.c ... -
22、Java加密技术(四)——非对称加密算法RSA
2015-03-31 14:39 577<转>http://snowolf.iteye.c ... -
21、Java加密技术(三)——PBE算法
2015-03-12 15:19 778<转>http://snowolf.iteye.c ... -
20、Java加密技术(二)——对称加密算法DES&AES
2015-03-09 10:39 540<转>http://snowolf.iteye.c ... -
18、byte数据类型
2015-03-09 09:33 463-2^7 - 2^7-1(-128 ~ 127) ... -
17、String <--->基本数据类型
2015-03-09 09:33 488基本类型 <--> String转换 int ... -
19、java加密技术(一)-BASE64与单向加密算法MD5&SHA&MAC
2015-03-09 10:15 443<转>http://snowolf.iteye.c ... -
16、switch用法
2015-03-06 07:57 445Java 语言怎样对字符串进行switch多项判断操作? 换j ... -
lll.Q&A
2015-03-05 13:16 01、interface 为什么不能实例化对象? -
lllll、Exception
2015-03-04 13:12 468web.xml The reference to entity ...
相关推荐
JAVA类与对象及数组习题 JAVA类和对象及数组是JAVA编程语言的基础概念。下面是关于JAVA类和对象及数组的习题,涵盖了构造方法、继承、多重继承、变量声明、数组初始化等方面的知识点。 1. 构造方法的调用方式: ...
在本实验“Java类与对象”中,我们深入学习了Java面向对象编程的基本概念和实践。面向对象编程(OOP)是一种程序设计思想,它强调数据和操作数据的方法结合在一起,形成一个独立的对象,以此来组织和管理代码。与...
在“java类与对象教学(2)”中,我们将深入探讨几个关键知识点:对象重构、`this`关键字、静态变量与静态方法,以及对象的进一步讨论和包的使用。 1. **对象重构**: 重构是改进代码结构的过程,不改变其外部行为,...
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,被广泛用于前后端交互,而Java作为后端开发的主要语言,常常需要将JSON格式的数据与Java类对象进行相互转换,以便于数据的处理和传输。Jackson库是...
Java 面向对象编程练习题与答案 本资源摘要信息涵盖了 Java 面向对象编程的多个知识点,包括 Font 类、Toolkit 类、包机制、抽象类、数组操作等。 1. Font 类: Font 类是 Java 中的一个类,用于设置程序中的字体...
类是创建对象的根源,它定义了同一类对象共有的属性和方法。类中的属性(Attribute)可以理解为对象所拥有的变量,而方法(Method)则是对象可以执行的操作或行为。 对象(Object)是类的实例(Instance),是具有...
要将XML转换为Java对象,首先需要一个对应的Java类,该类的字段与XML元素对应。JAXB通过注解这些字段来完成映射,如`@XmlElement`、`@XmlAttribute`等。以下是一个简单的例子: ```java import javax.xml.bind....
在Java编程语言中,"类"与"对象"是核心概念,它们构成了面向对象编程的基础。本文将深入探讨这两个概念,以及如何在实际编程中应用它们。 首先,我们需要理解"类"。在Java中,类可以看作是蓝图或者模板,它定义了一...
1. 编写一个类实现复数的运算。 复数类ComplexNumber的属性: m_dRealPart:实部,代表复数的实数部分。 m_dImaginPart:虚部,代表复数的...2. 编写Java Application程序使用上题定义的类,检查类定义是否正确。
在实验中,我们没有直接使用数组,但是我们使用了对象数组对 Customer 类对象进行存储。在 Cmanage 类中,我们可以使用对象数组来存储多个 Customer 对象,并提供了插入、修改、删除、查询等操作。 三、掌握 Java ...
在Java编程语言中,类与对象是核心概念,它们构成了面向对象编程的基础。这篇博文将深入探讨这两个概念,以及它们如何在实际编程中发挥作用。 首先,我们来理解什么是类。在Java中,类可以被看作是蓝图或者模板,它...
1. **类与对象**:Java中的基本构建块是类,它代表了现实世界中的事物或概念。对象则是类的实例,具有类定义的属性和行为。学习如何创建和使用类及对象,是理解Java面向对象编程的关键。 2. **封装**:封装是面向...
面向对象的基本概念 类声明、对象创建 参数传递 this引用 类的管理(包和JAR文件) 字符串类 数组
1. **类与对象**:在Java中,类是创建对象的模板,对象则是程序运行时的实体。学习者应理解如何定义类,包括属性(成员变量)和方法(成员函数),以及如何实例化对象。 2. **封装**:封装是隐藏对象内部的细节,只...
2. **面向对象与面向过程的区别** - **面向过程**关注解决问题的步骤,通过一系列函数调用来逐步实现任务,更注重执行流程。 - **面向对象**关注功能模块,通过类来组织代码,每个类代表一个功能或对象,强调功能...
此外,Java支持封装,这意味着类可以隐藏其内部细节,仅通过公共方法与外部交互,确保数据的安全性。 3. 对象(Object): 对象是类的实例,它具有类定义的属性和行为。每个对象都有自己的状态和可以执行的操作。...
本实验指导将深入讲解如何在Java 2(通常指的是Java SE 2)环境中,通过上机实践来理解和运用类与对象,以及如何有效地组织代码,例如使用package和import语句。 一、类与对象 1. **类的定义**:类是对象的模板或...
在Java中,我们需要创建一个Java类,该类包含一个或多个被声明为native的方法。例如: ```java public class JniWrapper { static { System.loadLibrary("cppLibrary"); } public native void callCppMethod()...