动手动脑第三波类与对象
1.不是static类型则需要定义一个对象变量,然后“创建(new)”一个对象,赋值给对象变量,现在就可以通过对象变量使用对象,主要方式有:(1)直接调用类的方法;(2)存取类的字段。
2.在定义变量时,Java要求必须显式初始化变量;对象变量如果不引用一个真实的对象,则必须声明为null。特殊值null:代表一个对象变量不引用任何对象
引用对象后的对象变量:MyClass obj=new MyClass();
3.可以使用final定义一个“常量”对象变量 final MyClass obj = new MyClass();
注意:“常量”对象变量不能指向另一个对象,但可以修改对象,比如设置它所引用对象的某公有字段值。
4.对于原始数据类型的变量(比如int),可以直接使用“==”判断两变量值是否相等
5.当“==”施加于原始数据类型变量时,是比较变量所保存的数据是否相等
当“==”施加于引用类型变量时,是比较这两个变量是否引用同一对象。
引用代表地址,所以“==”实际上相当于比较两个引用类型变量中保存的对象地址是否相同。
6.两个对象的“内容”,其实是指它们在某一时刻的所有字段的值,“内容相等”,其实是就“对应字段值”一致。
在Java中要比对两个对象的字段值,可以 “重写(override)”基类的equals()方法
7.当创建一个对象时,它的构造方法会被自动调用。构造方法与类名相同,没有返回值。
如果类没有定义构造函数,Java编译器在编译时会自动给它提供一个没有参数的“默认构造方法”
8. 如果类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法
执行类成员定义时指定的默认值或类的初始化块,到底执行哪一个要看哪一个“排在前面”。
执行类的构造函数。。
优先调用有参构造方法,然后无参的话取决于初始化块和字段的初始值谁在前谁在后,先调用后面的那个。
11.class Employee
{
String name;
long salary;
short employee_id;
static int total_employee_id;
...
}
可以用对象名或类名作为前缀访问静态数据
Employee newhire=new Employee();
newhire.total_employees=1;
Employee.total_employees=1;
推荐使用类名来直接访问静态字段。
12.静态初始化块只执行一次。
创建子类型的对象时,也会导致父类型的静态初始化块的执行。
13. 类的静态方法只能访问类的静态成员!
14. 总结出“静态初始化块的执行顺序”。
总结:对象的初始化顺序:首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,当子类的静态内容执行完毕之后,再去看父类有没有非静态代码块,如果有就执行父类的非静态代码块,父类的非静态代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。子类的非静态代码块执行完毕再去执行子类的构造方法。总之一句话,静态代码块内容先执行,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。
15. 静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法)?
只要定义一个类的对象在通过对象调用即可
类中静态的方法或者属性,本质上来讲并不是该类的成员,在java虚拟机装在类的时候,这些静态的东西已经有了对象,它只是在这个类中"寄居",不需要通过类的构造器(构造函数)类实现实例化;而非静态的属性或者方法,在类的装载是并没有存在,需在执行了该类的构造函数后才可依赖该类的实例对象存在。
在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。
静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制。
package 课下测试; public class Static { static int x;//静态变量x int y;//实例变量y static public int getX() { return x;} static public void setX(int newX) { x = newX;} public int getY() { return y; } public void setY(int newY) { y = newY; } public static void main(String[] args) { System.out.println("静态变量x="+Static.getX()); //System.out.println("实例变量y="+Static.getY());// 非法,编译时将出错 //why Static a= new Static(); Static b= new Static(); a.setX(1); a.setY(2); b.setX(3); b.setY(4); System.out.println("静态变量a.x="+a.getX()); System.out.println("实例变量a.y="+a.getY()); System.out.println("静态变量b.x="+b.getX()); System.out.println("实例变量b.y="+b.getY()); } }