动手动脑第三波类与对象

 

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());
    }
}

 

posted @ 2018-10-21 11:23  云破月来花弄影  阅读(130)  评论(0编辑  收藏  举报