第7章 复用类
1.组合语法
在新类中产生现有类的对象。由于新类是由现有类的对象组成的,所以这种方法称为组合。
2.继承语法
按照现有类的类型来创建新类,无需改变现有类的形式,采用现有类的形式并在其中添加新代码。
除非已经明确从其他类中继承,否则就是隐式的从Object中继承。
+= 操作符被重载用来处理String对象,另一个是 +。
2.1初始化基类
当创建了一个子类的对象时,该对象中包含了基类的子对象,这个子对象被包装在子类对象内部。
Java会自动在子类的构造器中插入对基类的默认构造器的调用。但是如果基类没有默认构造器,就必须在子类构造器中显式的调用基类的带参构造器。
public class A {
public A(int a){
System.out.println(a);
}
}
public class B extends A {
public B(int a){
super(a);//显式调用基类带参构造器
}
}
3.名称屏蔽
Java不会屏蔽父类的同名方法,子类可以调用自己重载的方法。
public class Homer {
char doh(char c){
System.out.println("char:"+c);
return c;
}
float doh(float f){
System.out.println("float:"+f);
return f;
}
}
public class Milhouse {}
public class Bart extends Homer {
void doh(Milhouse m){
System.out.println("doh(Milhouse)");
}
}
public class Hide {
public static void main(String[] args) {
Bart b = new Bart();
b.doh('c');
b.doh(new Milhouse());
b.doh(1.3f);
b.doh(1);
}
}
//输出
//char:c
//doh(Milhouse)
//float:1.3
//float:1.0
重写与重载的区别:
方法签名:方法名称和参数类型。
重写:
①方法签名一样。参数列表必须一样,但是返回类型可以是父类方法返回类型的子类。
②权限子类不能小于父类。
③final、static方法不能被重写,但static方法可以被重新声明。
④子类抛出的检查异常不能比父类大。
⑤构造方法不能被重写。构造器其实是类的静态方法。
重载:
①有不同的参数列表。
②返回的类型可以相同。
③权限不作限制。
④抛出的异常不收限制。
4.final关键字
4.1final变量
4.1.1 final成员变量
①final修饰基本数据类型,会使其数值恒定不变,而且必须赋初值,可在构造器中或初始化块中赋值。
②修饰引用类型,会使其指向的引用不变即不能再指向另一个引用,但引用的对象可以修改,必须赋初值,可在构造器中或初始化块中赋值。
③被final修饰的变量不能被
/*
* 1所有的byte型. short型和char型将被提升到int型(例外: final修饰的short, char变量相加后不会被自动提升。)
* 2如果一个操作数是long形 计算结果就是long型;
* 3如果一个操作数是float型,计算结果就是float型;
* 4如果一个操作数是double型,计算结果就是double型;
*/
byte a = 1;
int b = 1;
byte in = a+b;//报错
final byte a = 1;
byte in = a + b;//不报错
4.1.2 final局部变量
①使用final修饰局部变量时,既可以在定义时指定默认值,也可以不指定默认值。
②给局部变量赋初始值时,只能一次,不能重复。
4.2final方法
final修饰的方法不能被继承。
类中所有的 private方法被隐式的指定为final,但是如果覆盖一个private方法编译器并不会报错。原因如下:
①覆盖只有在某方法是基类的接口的一部分的时候才会发生。
②如果方法是private,则不是基类的一部分。
4.3final类
将类定义为 final,以为这你对该类的设计永远不需要做任何改动,也不能有子类。
4.4final参数
方法体内不能修改参数的值。参数的值在方法体内是不能被修改的。
需要注意的是被匿名内部类访问的成员变量和参数需要加上final。原因见:匿名内部类访问的变量final修饰符问题
5.类的初始化与加载
类在初次使用时才会被初始化。初次使用有以下几种情况:
①new 关键字,但 A a = new A[2]这种并不会导致初始化,只是表示开辟空间。
②访问静态变量、方法,访问静态常量并不会导致初始化。
③对类进行反射操作如: Class.forName()。
类的加载:
1.加载
2.连接: ①验证 ②准备 ③解析
3.初始化
类的加载是双亲委派机制。