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()
           */

}


总结继承的几个特点:
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

你可能感兴趣的:(java,单元测试,oop)