class Cleaner{
public Cleaner(int i) {
System.out.println("AAAAAAAAA");
}
public Cleaner() {//
System.out.println("BBBBBBBBBBB");//
}//
private String s="Cleaner";
public void append(String a){
s+=a;
}
public void dilute(){
append("dilute()");
}
public void apply(){
append("apply()");
}
public void scrub(){
append("scrub()");
}
public String toString(){
return s;
}
public static void main(String[] args) {
Cleaner x=new Cleaner(1);
x.dilute();x.apply();x.scrub();
System.out.println(x);
}
}
public class TestExtends extends Cleaner{
public TestExtends() {
System.out.println("CCCCCCCCCCCCCCCCCCC");
}
public TestExtends(int i) {
System.out.println("DDDDDDDDDDDDDDDDDDD");
}
public void scrub(){
append("TestExtends.scrub()");
super.scrub();
}
public void foam(){
append(" foam()");
}
public static void main(String[] args) {
TestExtends x=new TestExtends();
x.dilute();
x.apply();
x.scrub();
x.foam();
System.out.println(x);
System.out.println("aaaaaa");
Cleaner.main(args);
}
}
打印结果是:
BBBBBBBBBBB
CCCCCCCCCCCCCCCCCCC
Cleanerdilute()apply()TestExtends.scrub()scrub() foam()
aaaaaa
AAAAAAAAA
Cleanerdilute()apply()scrub()
这个类基本可以说明了继承。
class Cleaner{
public Cleaner(int i) {
System.out.println("CCCCCCC");
}
public Cleaner() {//
System.out.println("DDDDDDD");//
}//
}
public class TestExtends extends Cleaner{
public TestExtends() {
System.out.println("AAAAA");
}
public TestExtends(int i) {
super(1);
System.out.println("BBBBBB");
}
public static void main(String[] args) {
TestExtends x=new TestExtends();
TestExtends x1=new TestExtends(2);
}
}
打印为:
DDDDDDD
AAAAA
CCCCCCC
BBBBBB
关于继承的初始化,父类子类都是无参数的构造方法的时候,新建子类实例的时候先调用父类的默认无参构造方法,再调用子类的无参构造方法;要是父类有了需要传入参数的构造方法,子类有无参数的构造方法,当使用子类无参数的构造方法创建实例的时候,父类必须要声明无参的构造方法(如上代码//那几行没错的话TestExtends x=new TestExtends()这句将报错)。
到底是该用组合还是继承,一个最清晰的判断办法就是问一问自己是否需要从新类向基类进行向上转型。如果必须向上转型,则继承是必要的;但如果不需要,则应该好好考虑自己是否需要继承。