java 运行顺序、注意事项总结、基础概念

java 运行顺序、注意事项总结、基础概念


注意事项总结:
1.静态变量是属于整个类的变量而不是属于某个对象的。
2.注意不能把任何方法体内的变量声明为静态(方法体内定义静态变量会报错)
3.在Java中,类是按需加载,只有当需要用到这个类的时候,才会加载这个类,并且只会加载一次
4.在生成对象的过程中,会先初始化对象的成员变量,然后再执行构造器。
5.静态变量和静态语名块都在类加载的时候完成,而不是生成对象时完成
6.访问静态常量,如果编译器可以计算出常量的值,则不会加载类。即如果A类的静态常量值是通过B类的静态常量赋值,则不加载,否则需要加载A类。
7.访问静态常量,如果编译器可以计算出常量的值(就是值不会变化的),则不会加载类,否则会加载类
8.创建对象引用不加载类.(一个类里面定义另一个类的引用),引用就是定义变量
9.静态方法和静态语名块不能调用非静态变量和非静态方法
10.类的构造器实际上也是静态方法,即使没有显示地声明为static
11.变量不能被重写(覆盖),如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法
12.使用父类类型的引用子类对象时(只能调用父类的方法和变量,子类的新方法和变量就不行了),该引用调用的是父类中定义的方法和变量



对象生成:
类加载->初始化static成员变量->执行static语句块->初始化对象的成员变量->执行非静态语句块->执行构造器生成对象

父类static成员变量->父类static语句块->子类static成员变量->子类static语句块->
父类非静态成员变量->父类非静态语句块->父类构造器->子类非静态成员变量->子类非静态语句块->子类构造器

父类初始化->父类构造器->子类初始化->子类构造器



对象初始化:
1)对于  char、short、byte、int、long、float、double等基本数据类型的变量来说会默认初始化为0(boolean变量默认会被初始化为false);
2)对于引用类型的变量,会默认初始化为null。String 默认值为null
3)如果没有显示地定义构造器,则编译器会自动创建一个无参构造器,但是要记住一点,如果显式地定义了构造器,编译器就不会自动添加构造器。



java类加载顺序
1.首先加载类,执行static变量初始化,接下来执行对象的创建
2.java虚拟机要求所有的静态变量必须在对象创建之前完成
3.java常量放在内存中常量池,它的机制与变量是不同的,编译时,加载常量是不需要加载类的



初始化顺序:
需要生成某个类的对象,Java执行引擎会先检查是否加载了这个类,如果没有加载,
则先执行类的加载再生成对象,如果已经加载,则直接生成对象。

类的加载过程中,类的static成员变量会被初始化,如果类中有static语句块,则会
执行static语句块。static成员变量和static语句块的执行顺序同代码中的顺序一致。



子类调用父类的静态方法时
(1)当子类没有覆盖父类的静态方法时,只加载父类,不加载子类
(2)当子类有覆盖父类的静态方法时,既加载父类,又加载子类



static{}语句块的执行次序
(1)当一个类中有多个static{}的时候,按照static{}的定义顺序,从前往后执行;(编写顺序执行)
(2)先执行完static{}语句块的内容,才会执行主调用语句;



继承:
子类继承父类的方法(静态的、非静态的)
子类继承父类的成员变量(静态的、非静态的)
子类不继承构造器



隐藏:
子类继承父类的成员变量,不能够继承父类的private成员变量,子类中出现了同名称的成员变量,则会发生隐藏现象
即子类的成员变量会屏蔽掉父类的同名成员变量,如果要在子类中访问父类中同名成员变量,需要使用super关键字来进行引用。
静态方法和静态变量都会进行隐藏



覆盖:
子类继承父类的方法,不能够继承父类的private成员方法,子类中出现了同名称的成员方法,则称为覆盖,
即子类的成员方法会覆盖掉父类的同名成员方法。如果要在子类中访问父类中同名成员方法,需要使用super关键字来进行引用。



隐藏与覆盖的理解:
隐藏是针对成员变量和静态方法的,而覆盖是针对普通方法的(所以成员变量(静态、非静态)和静
态方法是调用你的引用变量类型的)

覆盖只针对非静态方法,也就是说只有覆盖方法才会进行动态绑定,而隐藏是不会发生动态绑定的。
在Java中,除了static方法和final方法,其他所有的方法都是动态绑定



this、super不能用到静态方法中:
this、super不能用到静态方法中,this是对当前对象的引用,super是指父类对象的引用。
如果静态方法中有this和super那么当静态方法被加载到内存中,其中的this和super也被加载到内存中,
但是对象还没创建this和super还没被初始化,所以加载时会报错。



构造器:
如果父类的构造器都是带有参数的,则必须在子类的构造器中显式地通过super关键字调用父类的构造器并配以适当的参数列表

如果父类有无参构造器,则在子类的构造器中用super关键字调用父类构造器不是必须的,如果没有使用super关键字,
系统会自动调用父类的无参构造器。



重写(Overriding)与重载(Overloading)的理解:
如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写(Overriding)。
子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。

如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。
Overloaded的方法是可以改变返回值的类型但同时参数列表也得不同。



接口与抽象类:
接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的,

实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法,
一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。

抽象类是据有一个或多个抽象方法的类,必须声明为抽象类。抽象类的特点是,不能创建实例。



方法调用的优先级:
优先级由高到低依次为:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。

先在本类中找有没有,再到父类中找,找到再看本类有没有重写,都没有再看参数变为父类(一级一级向上父类)找有没有
符合的方法,再参数变为父类到父类中找有没有(这样的顺序进行处理的)

猜你喜欢

转载自huangyongxing310.iteye.com/blog/2322139