继承是所有OOP语言和java语言不可缺少的组成部分。当创建一个类时,总是在继承,因此,处非已明确指出要从其他类中继承,否则就是在隐式地从Java的标准根类Object进行继承。这样会得到基类中所有的域和方法。
eg:
//写一个父类
public class Cleanser {
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; }
//test
public static void main(String[] args) {
Cleanser x = new Cleanser();
x.dilute(); x.apply(); x.scrub();
System.out.println(x);
}
}
//写一个子类继承上面的父类
public class Detergent extends Cleanser{
//重写了父类的scrub()
public void scrub()
{
append("Detergent.scrub()");
super.scrub();//调用父类的方法用super(),区分重写的方法
}
public void foam()
{
append("foam()");
}
//可以为每个类都创建main方法,这样使每个类的单元测试
//都变得简单易行,完成单元测试后,也无需删除该main方法
public static void main(String[] args) {
Detergent x = new Detergent();
//子类可以继承父类的私有属性和方法,但不能访问或者使用.
//但可以通过继承过来的父类中的公共方法访问父类中继承过来的
//私有属性,私有的属性和方法在子类中也存在一份,但是不可见的
x.dilute;
x.apply();
x.scrub();
x.foam();
System.out.println(x);
System.out.println("Testing base class:");
Cleanser.main(args);//调用父类的静态入口
}/*Output:
Cleaner dilute() apply()Detergent.scrub() scrub()foam()
Testing base class:
Cleaner dilute() apply() scrub()
*/
}
总结继承的几个特点:
1.子类继承父类,则继承了父类的所有方法和属性(
包括私有的);
2.子类不能访问父类的私有字段,可以通过父类的公用方法去访问;
3.子类中调用父类的构造方法,必须在子类的构造方法且第一行关键字super()调用;
4.子类定义的方法,同父类中方法一致(方法名,参数类型和个数,返回值),则覆盖父类方法,如果在子类中要调用父类的方法,super.方法名()显式调用,否则默认是子类方法this.方法名();
5.子类中字段名称同父类字段一致,虽合法但应避免这种用法,以免混淆;
6.子类同父类之间相互转换,实际是子类引用同父类引用转换.
下面理解一下为什么子类可以继承父类的私有属性和方法:
父类中的private属性和方法,子类虽然继承了,但这些属性和方法对子类是隐藏的,其访问权限仍然只局限在父类的CLASS内部,无法在子类中访问和重写。
这就好比孩子和爸爸,他们各需要有隐私一样,如果爸爸不想让孩子知道自己的银行帐号的密码,就可以把它设置成private属性,这样孩子就无法知道了。不然的话,如果儿女们胡来,把钱都取跑了,爸爸喝西北风?
如果爸爸去世了,就可以把银行帐号的密码设置成public属性,这样孩子们就可以取出钱分了
所以继承不等同继承遗产,孩子不能无权限的继承爸爸的所有东东,爸爸活着,银行帐号的密码是private,爸爸去世了,银行帐号的密码才是public.
爸爸可以通过private和public限制继承者有那些权限
那你也许就会说儿子其实没有继承爸爸的private属性和方法, 这样冒似更有说服力
但事实并非如此,这种继承的存在是事实.
否则的话,当儿子去调用爸爸的某个public方法,如果里边使用到某个private属性和方法,此时调用者是儿子而不是爸爸, 儿子如果没有继承爸爸的private属性和方法, 如何调用得到里边这个private属性和方法呢?此时,继承就体现出来了。
参考: thingking in java 4 ,感谢疯狂java联盟的annie