7.1 组合
将对象引用置于新类中。
package Cha7;
import static tools.Print.print;
class Soap{
private String s;
Soap(){
print("Soap()");
s = "Constructured";
}
public String toString(){
return s;
}
}
public class Bath {
private String s1="Happy", s2="Happy",s3,s4;
private Soap castille;
private int i;
private float toy;
public Bath(){
print("Inside Bath()");
castille = new Soap();
toy = 3.14f;
s3 = "joy";
}
{i=47;}
public String toString(){
if(s4==null)
s4 ="joy";
return s1+"\n"+s2+"\n"+s3+"\n"+s4+"\n"+i+"\n"+toy+"\n"+castille;
}
public static void main(String[] args) {
Bath b = new Bath();
// 打印对象b时,会调用类的toString。
print(b);
}
}
/*
Inside Bath()
Soap()
Happy
Happy
joy
joy
47
3.14
Constructured
*/
7.2 继承
为了继承,一般规则,所有数据成员为private,所有方法为public
当子类继承了某个类之后,便可以使用父类中的成员变量,但是并不是完全继承父类的所有成员变量。具体的原则如下:
1)能够继承父类的public和protected成员变量;不能够继承父类的private成员变量;
2)对于父类的包访问权限成员变量,如果子类和父类在同一个包下,则子类能够继承;否则,子类不能够继承;
3)对于子类可以继承的父类成员变量,如果在子类中出现了同名称的成员变量,则会发生隐藏现象,即子类的成员变量会屏蔽掉父类的同名成员变量。如果要在子类中访问父类中同名成员变量,需要使用super关键字来进行引用。
2.子类继承父类的方法
同样地,子类也并不是完全继承父类的所有方法。
1)能够继承父类的public和protected成员方法;不能够继承父类的private成员方法;
2)对于父类的包访问权限成员方法,如果子类和父类在同一个包下,则子类能够继承;否则,子类不能够继承;
3)对于子类可以继承的父类成员方法,如果在子类中出现了同名称的成员方法,则称为覆盖,即子类的成员方法会覆盖掉父类的同名成员方法。如果要在子类中访问父类中同名成员方法,需要使用super关键字来进行引用。
关于构造方法:见7.2.1节。
### 7.2.1 初始化基类
创建一个导出类对象时,该对象包含了一个基类的子对象。
对该基类子对象的初始化,是java自动在导出类的构造器中插入对基类构造器的调用。
1.基类构造器会调用基类构造方法。
2.没有显示调用就会调用无参构造方法。
3.基类不存在该构造方法,会出错。
package Cha7;
import static tools.Print.print;
class Art{
Art(){print("Art constructor");}
}
class Drawing extends Art{
Drawing(){
print("Drawing constructor");
}
}
public class Cartoon extends Drawing{
public Cartoon(){
print("Cartoon constructor");
}
public static void main(String[] args) {
Cartoon x = new Cartoon();
}
}
//构造方法不继承
/*Art constructor
Drawing constructor
Cartoon constructor*/
7.3 代理
新类中创建旧类私有成员变量,再在新类中提供public方法,方法中通过私有的成员调用方法。可以避免将旧类的所以成员变量和方法暴露。
7.4 结合使用组合和继承
7.6 protected 关键字
“就类用户而言,是private的,但对于任何继承于此类或其他任何位于一个包内的类来说,它却是可以访问的”。
7.7 向上转型
7.8 final 关键字
final 数据
static final 占据一段不能改变的储存空间。
final 基本类型,即 final int a = 1;必须定义时赋值。a的值不可改变。
final 对象引用。 final Integer a = new Integer(3); a指向这个引用后,无法再指向其他引用。可以对对象操作。
final 方法
锁定该方法,防止继承的覆盖。
private方法隐式指定为final
final 类
锁定类,不能继承。