复用代码是Java中众多引人注目的功能之一。但要想成为极具革命性的语言,仅仅能够复杂代码并对之加以改变是不够的,它还要能够做更多的事。
继承和组合是利用现有的类来创建出新的类,提高代码复用。组合模式在设计模式中运用到更多。
1.组合
只需将对象的引用放进新类即可,有点和继承相似。
package com.myboy.refe;
import com.myboy.generic.Test3;
class TestDemo{
public TestDemo(){
System.out.println("TestDemo()");
}
@Override
public String toString() {
return "toString()";
}
}
public class Test4 {
public Test4(){
System.out.println("Test4()");
}
private TestDemo demo=new TestDemo();//无法阻止自动初始化,第六章初始化知识
/**
* private TestDemo demo;--->此时没有自动初始化.
*/
@Override
public String toString() {
return "demo:"+demo;//组合,直接在新类中对引用的类进行调用
}
public static void main(String[] args) {
Test4 test=new Test4();
System.out.println(test);
}
/**
* out :TestDemo()
Test4()
toString()
*
*/
}
2.继承语法
继承是所有OOP语言和Java语言不可缺少的组成部分。在继承中,父类所拥有能访问的权限的属性,方法都能被子类所看见。创建一个类时,总是在继承(隐式的继承Object类)。
在继承中,对基类子对象的初始化也是至关重要的。构建的过程是从基类"
向外扩展"
package com.myboy.extendstest;
class Test3{
public Test3(){
System.out.println("Test3()");
}
}
class Test2 extends Test3{
public Test2(){
System.out.println("Test2()");
}
}
public class Test1 extends Test2 {
public Test1(){
System.out.println("Test1()");
}
public static void main(String[] args) {
Test1 t1=new Test1();
}
/**
* out:Test3();
* Test2();
* Test1();
*/
}
3.代理(在设计模式中很常见)
第三种关系被称为代理,Java中并没有提供对它的直接支持。继承和组合的
"中庸之道".
因为我们将一个成员对象置于所要构造的类中(就像组合),但是在新类中我们暴露了该成员对象的所有方法(就像继承,但是比继承更厉害--"能直接调用该对象的
私有属性")
4.在论protected关键字
在理想世界里,仅靠关键字private就能实现了。但在实际项目中,经常会想要把某些事物尽可能的隐藏起来,但仍允许导出类(子类)可以使用。
protected 关键字:它指明:就客户而言,它是private的,但是对于其他基于子类的导出类和其他位于同一个包的类,他却是可以访问的。(protected提供了包级访问权限)。
5.向上转型
"为新的类方法"并不是继承技术中最重要的方面,其最重要的方面是表现新类(导出类)和基类之间的关系。这种关系是"
导出类是基类的一种类型"
我真的需要向上转型吗????????(如何选择继承和组合)