-------------------------关于对象的构造过程------------------------
若是类B继承了类A,那么当建立类B的实例时,遵循以下过程:
一、若是类A有静态的成员变量,初始化它
二、若是类A有静态代码块,执行它
三、若是类B有静态的成员变量,初始化它
四、若是类B有静态代码块,执行它
五、若是类A有非静态的成员变量,初始化它
六、若是类A有初始化代码块,就执行它
七、执行类A的构造函数
八、若是类B有非静态的成员变量,初始化它
九、若是类B有初始化代码块,就执行它
十、执行类B的构造函数
一个对象建立的大体过程:递归的构造父类对象,为对象分配内存空间,为实例变量赋初值,调用构造方法。
构造方法是对象被建立时由系统自动调用的,不能在其余方法中调用构造方法。
若是类B继承了类A,能够在类B的构造方法中调用类B的一个构造方法,但必须是在第一行中用this关键字进行调用(this指向当前的对象,若是掉用带参数的构造方法,则在this后面跟上参数)。类B能够经过super关键字调用类A的某个构造方法(若是是调用类A的带参数的构造方法,则在super后面跟参数,也就是说,super指向父类的对象),但super必须出如今类B构造函数的第一行。默认状况下,类B会隐式地经过super()来调用类A的默认构造方法。
类加载的原则:能不加载就不加载,而且类只加载一次。
一、第一次建立对象时,加载类;
二、经过类名调用静态变量或方法时,加载类
三、声明一个对象引用时,不加载类
四、经过子类访问父类的静态方法或属性时,只加载父类
五、加载子类前先加载父类
六、若是经过类名访问公开静态常量,那么若是编译器能在编译时肯定,那么类就不会被加载,不然加载。
--------------------------重载和多态-------------------------------
Java中,静态方法不存在多态。在任何一个类的方法中,都不能声明static变量
在JAVA的继承关系中,不能用非静态方法覆盖静态方法,反过来,也不能用静态方法覆盖非静态方法;但属性没有这个限制
若是有多个相匹配的重载方法,则调用精度最高的那个方法。
方法重载(overload)的原则:在同一个类中,方法名相同,但参数个数和参数类型至少有一项不一样。注意:不能按返回类型的不一样而区分不一样的方法!!!
方法重写(override)的原则:方法名相同,参数个数和参数类型也相同,返回类型兼容,抛出的异常不能更宽泛,不能下降方法的访问权限(但能够提升)
Java 中的方法中参数不能有默认值,JDK 5.0中增长了可变长数组,可是一个方法中只能有一个可变长数组,而且它必须放在方法参数列表的最右边
能够利用System类中的类方法gc()建议Java虚拟机回收内存(视乎JVM的实现),由于Java规范没有对垃圾回收机制的具体实现做出规定
--------------------fianl finally finalize---------------------
final 方法不能被重写(override),只能被继承或重载,
final 常量属性能够被继承和隐藏
final 类不能被继承
finally 用在try{...}catch{...}finally{...}中,注意:若是有try,就必需要有catch或finally,便可以try{..}finally{...}或try{...}catch{...}
finalize 是Object类的一个方法,当一个对象再也不被任何变量引用时,由对象的垃圾回收器在适当的时候调用此方法。子类能够重写 finalize 方法,以配置系统资源或执行其余清除。
另外,对于final的属性,能够直接赋值初始化,也能够在构造函数里初始化
final能够用来修饰属性,方法,类和块变量
--------------------------------接口和抽象类
抽象类能够有构造方法,可是接口没有
接口是特殊的抽象类,一个类能够同时继承一个类和实现多个接口;接口和接口之间能够多重继承
接口中的量被默认为final,public,static,接口中的方法被默认为public abstact
接口中的常量可直接经过接口名调用
若是一个类不实现该接口的全部方法,则该类必须被声明为抽象类
---------------------------关于继承
Java只支持单继承表明调用父类的构造方法
* 子类和父类在同一个包中的继承性:子类继承了其父类中不是private的成员变量和方法,而且访问权限保持不变
* 子类和父类不在同一个包中的继承性: 子类继承了父类的protected和public的成员变量和方法,而且访问权限不变
关键字private确保只有本类的方法能访问,其余类的方法不能访问(包括其子类的方法)
关键字public确保任何类的方法都能访问接
关键字friend和protected确保本类的方法或处于同一个包中的方法能访问
访问修饰符protected的进一步说明:
一个类中的protected成员变量和方法能够被它的直接子类和间接子类继承。
详见书本表格。。。。。。。。。。。。。。。。。。
-------------------------局部变量和实例变量,静态方法和非静态方法------------
实例变量在类中定义,能够不用初始化,由于默认值是null,他的寿命跟对象相同
局部变量定义在方法或块中,使用前必须初始化,不然会报错,由于局部变量没有默认值
静态方法中不能访问非静态的方法
------------------------关于内部类和内部接口---------------------------------------------
内部类分四种,[非静态]成员内部类(实例内部类),静态成员内部类,方法内部类(局部内部类),匿名内部类
(非静态)成员内部类:
定义在类(包括抽象类)中
四个访问权限修饰符均可以修饰成员内部类。
在建立成员内部类的实例时,外部类的实例必须存在。(例子)
成员内部类的实例自动持有外部类的实例的引用。
外部类实例与内部类实例之间是一对多的关系。即:一个内部类实例只会引用一个外部类实例,而一个外部类实例对应零个或多个内部类实例。在外部类中不能直接访问内部类的成员,必须经过内部类的实例去访问。可是内部类能够访问外部类的成员和方法!
成员内部类中不能定义静态成员,而只能定义实例成员!!
若是实例内部类B与外部类A包含同名的成员或方法(只要同名便可),那么类B的成员或方法会把类A的成员或方法屏蔽掉!!!
内部类和外部类在编译时是不一样的两个类,内部类对外部类没有任何依赖。最终会获得两个类文件,这两个类文件没有任何关系
静态成员内部类:
被冠以static的成员内部类
静态内部类的实例不会自动持有外部类的特定实例的引用,在建立内部类的实例时,没必要建立外部类的实例。
静态内部类能够直接访问外部类的静态成员和静态方法,若是访问外部类的实例成员和实例方法,就必须经过外部类的实例去访问!注意:静态成员内部类中能够覆盖外部类的成员和方法(只要同名便可)
在静态内部类中能够定义静态成员和实例成员!!
客户类能够经过完整的类名直接访问静态内部类的公有静态成员和公有静态方法!!!
注意:当类与接口(或者是接口与接口)发生方法命名冲突的时候,此时必须使用内部类来实现。
用接口不能彻底地实现多继承,用接口配合内部类才能实现真正的多继承。
局部内部类:
局部内部类只能在当前方法中使用,该类不能被public、protected、private修饰符修饰,也不能是静态的。
和实例内部类同样,不能包含静态成员。
在局部内部类中定义的内部类不能被public、protected、private访问控制修饰符,也不能是静态的。
局部内部类和实例内部类样,能够访问外部类的全部成员,此外,局部内部类还能够访问所在方法中的final类型的参数和变量(访问方法中的变量和方法参数必须是final的)。
若是要实例化局部内部类,则必须声明在前,实例化在后
匿名内部类
匿名类是一种特殊的局部内部类,这种类没有名字。
匿名类自己没有构造方法,可是会调用父类的构造方法.
匿名类尽管没有构造方法,可是能够在类中提供一段实例初始化代码,JVM会在调用父类的构造方法后,执行这段代码。
除了能够在外部类的方法内定义匿名类之外,还能够在声明一个成员变量时定义匿名类。
匿名类除了能够继承外,还能够实现接口
匿名类和局部内部类同样,能够访问外部类的全部成员,若是匿名类位于一个方法中,还能访问所在方法中的final类型的变量和参数。
局部内部类的名字在方法外是不可见的,所以与匿名类同样,可以起到封装类型名字的做用。
匿名内部类的初始化代码块只执行一次,即初始化一个实例
内部接口:
在一个类(包括抽象类)中也能够定义内部接口,该接口能够被四个访问修饰符修饰
在接口中能够定义静态内部类(该内部类默认是public static,也能够加上abstract修饰符,声明为抽象的),此时静态内部类位于接口的命名空间中。
在接口中还能够定义接口,这种接口默认也是public static 的,如Map.Entry就是这种接口
--------------------------------------