thinking in java 4 extends 继承

继承是所有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()
*/

}


[size=x-small]总结继承的几个特点:[/size]
1.子类继承父类,则继承了父类的所有方法和属性([color=darkred]包括私有的[/color]);
2.子类不能访问父类的私有字段,可以通过父类的公用方法去访问;
3.子类中调用父类的构造方法,必须在子类的构造方法且第一行关键字super()调用;

4.子类定义的方法,同父类中方法一致(方法名,参数类型和个数,返回值),则覆盖父类方法,如果在子类中要调用父类的方法,super.方法名()显式调用,否则默认是子类方法this.方法名();

5.子类中字段名称同父类字段一致,虽合法但应避免这种用法,以免混淆;
6.子类同父类之间相互转换,实际是子类引用同父类引用转换.

[color=darkred][size=x-small]下面理解一下为什么子类可以继承父类的私有属性和方法:[/size][/color]
父类中的private属性和方法,子类虽然继承了,但这些属性和方法对子类是隐藏的,其访问权限仍然只局限在父类的CLASS内部,无法在子类中访问和重写。

这就好比孩子和爸爸,他们各需要有隐私一样,如果爸爸不想让孩子知道自己的银行帐号的密码,就可以把它设置成private属性,这样孩子就无法知道了。不然的话,如果儿女们胡来,把钱都取跑了,爸爸喝西北风?

如果爸爸去世了,就可以把银行帐号的密码设置成public属性,这样孩子们就可以取出钱分了

所以继承不等同继承遗产,孩子不能无权限的继承爸爸的所有东东,爸爸活着,银行帐号的密码是private,爸爸去世了,银行帐号的密码才是public.
爸爸可以通过private和public限制继承者有那些权限

那你也许就会说儿子其实没有继承爸爸的private属性和方法, 这样冒似更有说服力

但事实并非如此,这种继承的存在是事实.

否则的话,当儿子去调用爸爸的某个public方法,如果里边使用到某个private属性和方法,此时调用者是儿子而不是爸爸, 儿子如果没有继承爸爸的private属性和方法, 如何调用得到里边这个private属性和方法呢?此时,继承就体现出来了。


参考: thingking in java 4 ,感谢疯狂java联盟的annie
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值