第七章 复用类

 

复用

    两种方式:组合,继承

    继承和组合优先考虑组合,在使用继承之前自问一句:我真的需要向上转型吗?

 

惰性初始化(delayed initialization):

    在正需使用对象之前对其进行的初始化。在生成对象不值得及不必每次都生成对象的情况下,这种方式可以减少额外的负担。

    if(s==null){

        s = "joy";

    }

 

'+'和'+='被java设计者重载用以处理String对象

 

@override:

    @override注解可以防止你在不想重载时而意外进行了重载

    当你在子类中想要重载父类的方法时,有可能会进行覆盖,此时最好显示的在此方法之前加上@override 关键字来告诉编译器你要做什么

 

final:

    向编译器告知一块数据是恒定不变的。比如1.一个用不改变的编译时常量。2.一个在运行时被初始化的值,而你不希望它被改变(如 final int i = rand.nextInt(20));

    对于基本数据类型,final使得该值恒定不变;而对于对象的引用,final使得该引用恒定不变,但是却可以修改该对象的属性值(a[i]++)

    //TODO: 将类中的一个属性声明为final,在子类中尝试改变它

 

空白final:

    private final int j; //被声明为final但又未被指定初值的final变量叫空白final

    空白final必须在构造器中进行初始化,否则将不能通过编译,不信你可以做下尝试

 

final参数:

    形参被声明为fianl时,将无法更改形参引用所指向的对象

    void f(final Apple apple){

        //apple = new Apple();  //Illegal

    }

 

final方法:

    方法锁定,以防任何继承类修改它的含义(即不能被覆盖)

 

final和private:

    类中所有的private方法都隐示的被指定为final

 

final类:

    被声明为final的类不能被继承

 

初始化及加载:

    类的代码在初次使用时才被加载,即加载发生于创建类或该类的子类的第一个对象之时,但是当访问static域时,也会发生加载(构造器也是static方法)

 

在命令行中执行 java Beetle之后发生的事:

    1.试图访问Beetle.main()方法,即入口,但发现此时并未加载Beetle

    2.找出Beetle的class文件,执行加载过程,如果已被加载,则跳过加载

    3.如果Beetle是某个类的子类,首先去加载其父类

    4.父类加载完成后执行初始化,此时static 变量会被初始化

    5.子类的加载和子类的static初始化

    6.加载全部完成,执行main方法

    7.如果在main中创建对象,将进行成员的初始化,见P96

    备注:加载类的动作仅发生一次

 

你可能感兴趣的:(java,apple,String,Class,编译器,initialization)