4.4 对象的周期
产生:声明初始化:分配内存空间初始化成员变量;执行类成员声明时的简单赋值;执行构造方法,对象变量的初始化
使用:对象变量的访问:get,set 方法
清除:自动回收,以及gc方法
4.5 类的继承与多态
子类不能继承的:带private;构造方法
this关键字,是声明实例变量,区别于类变量和构造方法里面的实例变量,在类的其他方法中调用构造方法用this;super关键字是调用父类的方法
继承的时候:子类对象继承与实例化
- 给子类对象分配空间;
- 从下往上一点点supre(父类),写出来的supre写在子类的构造方法首行,缺省supre调用父类的无参构造方法
- 自顶向下一点点地显示初始化父类,且执行父类的各种构造方法
对外一个接口,对内多种实现:进行通信的时候是用父类,但是具体的实现可以用子类。
对象类型的强制转换:将父类强制转换成子类:
5 java高级特性
5.1 static关键字(静态变量,方法)
静态变量只在系统加载其所在类的时候分配空间并初始化。在之后实例化之后不会再分配,一直用原来的地址。
静态变量可以用于实例之间通信和实例数目统计
静态变量和方法可以直接访问,不用实例化;如果不是静态方法就算在同一个类里面调用也需要实例化,然后用对象.方法来调用;但是静态方法就可以直接用。
在静态方法中非静态方法可以先实例化对象,注意静态方法没有this关键字, 因为静态变量和实例化无关。
类加载的意思是首次在程序中要用到类的地方,会进行初始化?。当再次获取的时候这时已经初始化结束?
class StaticInitDemo{ static i; static{ i=5; System.out.println(i++);}}public class TestStatic{ public static void main(String arg[]){ System.out.println(StaticInitDemo.i);}}
输出是i=5;i=6
5.2 final 关键字(成员变量,成员方法和类)
final修饰之后类不能派生子类
final关键字:保持 一致性很重要的时候,定义常量。final修饰成员变量的时候,在new对象的时候必须对其赋值,一旦赋值在当前对象中不可改变
5.3 abstrat抽象类
抽象方法里面不具体实现抽象方法,没有方法体。含有抽象方法的类叫做抽象类。抽象类也可以包含普通方法。
5.4 接口
接口:只是声明一个方法,而不实现方法体,是一种协议的规定。接口和抽象类的功能类似;
类继承接口之后必须实现接口里面所有的方法
要多重继承的时候:只容许继承一个父类;实现多个接口。所以父类和接口合并的时候只能有一个具体实现的细节,剩下的都是声明。
扩展接口:新继承一些接口。优点:接口可以抽象出很多不相关类的相似性。
5.6 泛型与多态
1 泛型的思想:类和方法的泛化,通过参数化实现,这个参数叫做类型参数,通过类型参数实现的方法或接口,可以在具体调用的时候进行抽象
简单理解就是,定义的时候定义成T(类型参数),在泛型类调用的时候给这个T一个具体的类型,这样不会出现传入类型错误时候编译检测不出错误。
this关键字只有在区分成员变量和局部变量的时候用,其他时候没有相同的成员变量名和局部变量名的时候可以不用this,直接用成员变量。
java里面有很多类是泛型类;自定义泛型类:泛型类的传参不再是一个对象而是一个类型。
//泛型类的定义public class box{ private T t; public void add(T t) { this.t=t; } public T get() { return t; }}//泛型类的调用public class MyBoxTest { public static void main(String args[]) { box mybox=new box (); mybox.add(new Integer(90)); Integer i=mybox.get(); System.out.println("The Integer is :"+i); }}
一个泛型l类可以有多个类型的参数,但是每个参数在泛型中应该 唯一。:MyBox<T,T>就不对但是MyBox<T,U>就可以
泛型在调用实例化时可以用父类作为类型参数,但是之后实例里面的参数使用的时候可以用子类。
调用的时候用Box<Number>,在实例中使用Box<Integer>,但是Box<Number>和Box<Integer>不是父类与子类的关系。
2 通配符(实现泛型的父类与子类)
通配符?,表明泛型是一种未知的类;受限通配符?extends ....super....,规定了泛型的上限和下限。这个通配符在调用的时候定义一大类泛型,是其他一些具体泛型的父类。
3 泛化方法
用泛型参数来泛化方法的时候要注意方法的定义:public <U> void inspect(U u){ }。这个定义里面类型是U