Thinking in java 学习记录

组合模式
has-a,用于代码的复用,用其他类的对象,创建一个新类。

继承模式:
is-a
在继承中,将父类的数据成员指定为private,将父类的方法指定public。
一旦发生向上转型,则基类不能访问导出类的扩展部分。
Overload:(重载)方法名相同,参数不同,体现在参数个数和类型上的不同,发生在同一个类中。
Override:(覆写)
1、定义:1)方法名相同;2)参数相同;3)返回值类型相同
2、范围:发生在子类中

子类构造器会自动调用父类构造器。(无参)
如果有参数的话,需要调用super关键字。并在super中传入相应的参数。
关于组合模式和继承模式的选择:
Thinking in java 学习记录_第1张图片
Thinking in java 学习记录_第2张图片

组合是将原有类型作为新类型的一部分加以利用,而继承复用的是接口。

代理模式
Thinking in java 学习记录_第3张图片

接口默认是public
Thinking in java 学习记录_第4张图片

java存储方式:
Thinking in java 学习记录_第5张图片

Thinking in java 学习记录_第6张图片

对象的作用域和对象的引用的作用域是不一样的。引用可能在某个作用域之后就消失了,但是对象可能仍然占据内存空间。new出来的对象,只要需要就会一直保留下去。
类其实就是一种新的数据类型。
成员变量会被赋予默认值,但是局部变量并不会被赋予默认值。

static
Thinking in java 学习记录_第7张图片

final
final数据:final常量必须是基本类型数据。一个即是static又是final的域 只占据一段不能改变的存储空间。当一个引用被定义为final时,表示这个 引用恒定不变。(编译期常量)
对final的赋值必须在定义处或者是在构造器中
final参数:表示无法在方法中改变参数引用指向的对象
Thinking in java 学习记录_第8张图片

final方法:禁止继承类去修改(private默认是final的)

final类:表示该类禁止被继承

java中不会将自动将int转化为boolean

放入接口中的任何域都自动是final和static的。所以可以用这个方法来创建常量。
接口的所有成员自动被设置为public的。

this
this在方法内部使用,表示对“调用方法的那个对象”的引用。
在同一个类内部,不需要使用this
return this;表示返回当前对象的引用。
Thinking in java 学习记录_第9张图片
this可以在一个构造器中调用另外一个构造器
还可以用this.s=s;前一个表示数据成员,后一个表示参数。

成员的初始化:
局部变量的初始化,编译器会告诉我们。
成员变量会被赋予初值。
初始化的顺序:
按照定义的顺序,能够保证在任何方法被调用之前(包括构造方法),被正确的初始化。先初始化静态变量,然后在初始化非静态变量。
Thinking in java 学习记录_第10张图片

Thinking in java 学习记录_第11张图片

关于protected:用于继承,一般在父类中把数据成员设置成为private,把相应的方法设置为procted

类的初始化顺序
Thinking in java 学习记录_第12张图片
Thinking in java 学习记录_第13张图片
分析:首先当我们运行此程序的时候,主线程启动,编译器开始查找Beetle.class这个类,找到这个类后,开始加载这个类,在加载的过程发现有extends关键字,所以编译器开始去加载Insect.class这个类,(如果在加载这个类的时候如果发现这个类还有基类,那么Insect的直接基类就会被加载,如果还有基类,以此类推)此时因为insect没有基类了,所以不需要再加载,此时(加载insect类时)insect类的静态代码将执行(静态成员的初始化),所以此时打印出了 static Insect.x1 initialized, 当insect的静态代码执行完后, Beetle的静态代码开始执行 (初始化x2), 所以打印出:static Beetle.x2 initialized;
到现在为止,所有基类以及静态的初始化动作都已经执行完了,可以创建对象了。
这时候执行System.out.println(“Beetle constructor”);所以打印出:Beetle constructor;
下面开始执行Beetle b = new Beetle();此时首先为Beetle分配内存空间,并且都初始化为0,注意boolean类型变量初始化为false;
在Beetle内的代码执行前,首先会调用基类的构造器,在基类(insect)的构造器内的代码执行前,首先要执行基类的非静态成员的初始化,此时p被初始化为47,并且打印出:Insect.p initialized;当执行初始化后,基类的构造器里的代码System.out.println(“i = ” + i + “, j = ” + j)开始执行,所以打印出:i = 9, j = 0;此时j被初始化为39;
当基类的构造器的代码执行完后,首先要对Beetle类的非静态成员进行显示的初始化,此时K被初始化为47,并且打印出:Beetle.k initialized;等初始化完成后,Beetle构造器里的代码开始执行,所以打印出:K=47;J=39,
静态成员初始化是从最顶层的类开始的,因为子类成员的初始化可能回用到基类的成员。
所以类加载以及初始化的顺序是:类的静态成员初始化分配内存(有父类的先父类,然后自己)->然后main方法执行->类初始化{类非静态成员的初始化,然后执行构造器(有父类的先给父类的非静态成员初始化,然后父类的构造器)}

Thinking in java 学习记录_第14张图片
Thinking in java 学习记录_第15张图片

综合:类的静态成员初始化分配内存(有父类的先父类,然后自己)->然后main方法执行->父类的先给父类的非静态成员变量初始化,然后父类的构造器->类初始化{类非静态成员的初始化 ->调用成员的初始化方法(组合模式下) -> 然后执行构造器
多态
将变化的事物与没有变化的事物相分离。
缺点:Thinking in java 学习记录_第16张图片
只有普通的方法调用是可以多态的。
Thinking in java 学习记录_第17张图片
Thinking in java 学习记录_第18张图片
Thinking in java 学习记录_第19张图片
Thinking in java 学习记录_第20张图片
容器产生的原因,数组不能满足我们的需求,因为数组有固定的尺寸。

关于内部类
要想创建内部类的对象,不能用外部类的名字去创建,要使用外部类的对象去创建
eg:

class Out{
   class Inner{
         }
}
public static void mian (String [] args){
 // Inner in=new Out.Inner()(*)//这样是错误的;
Out out=new Out();
Inner in=out.new Inner();//正解
}

匿名内部类:
Thinking in java 学习记录_第21张图片

关于String
当改变字符串的内容时,String类的方法都会返回一个新的String对象,但是如果字符串的内容没有改变时,返回的是原对象的引用。

关于IO流
Thinking in java 学习记录_第22张图片
Thinking in java 学习记录_第23张图片

你可能感兴趣的:(java)