组合:在一个新类中建立另外一个已有类的对象。 java
继承:是全部OOP语言不可缺乏的组成部分,会自动获得基类中全部的域和方法,extendsapp
package sixth; class Art{ Art(){System.out.println("JiLei1");} } class Drawing extends Art{ Drawing(){ System.out.println("extends JiLei 2"); } } public class ExtendsD extends Drawing{ public static void main(String[] args){ new ExtendsD(); } }/*JiLei1 extends JiLei 2*/
代理ide
代理是组合和继承的中庸之道函数
package sixth; //代理是组合和继承的中庸之道 class Cleaner{ private String s = "Cleaner"; public void append(String a){System.out.println(s += a);} public void apply(){append("apply()");} public void scrub(){append("scrub()");} public String toString(){return s;} } //将一个成员对象置于所要构建的类中private Cleaner cle = new Cleaner();像组合 /*同时在新类中暴露该对象的全部方法public void append(String a){cle.append(a);} //public void apply(){cle.apply();} //public void scrub(){cle.scrub();} //public String toString(){System.out.println(s);return s;}像继承*/ public class DaiLi { private String s = "DaiLi"; private Cleaner cle = new Cleaner(); public void append(String a){cle.append(a);} public void apply(){cle.apply();} public void scrub(){cle.scrub();} public String toString(){System.out.println(s);return s;} public static void main(String[] args){ DaiLi dL = new DaiLi(); dL.append("12"); dL.apply(); dL.scrub(); dL.toString(); } }/*使用代理 Outputs: Cleaner12 Cleaner12apply() Cleaner12apply()scrub() DaiLi*/
初始化顺序spa
package sixth; class Insect { private static int si = numOfLegs("Static si Insect"); protected int j; private int i = 0; public Insect() { // j并未初始化 System.out.println("Insect Constructor: i = " + i + " j = " + j); j = 10; } protected static int numOfLegs(String s) { System.out.println(s); return 4; } } class Beetle extends Insect { private static int si = numOfLegs("Static si Beetle"); private int i = numOfLegs("Beetle"); // 并未显示调用Insect的构造函数 public Beetle() { System.out.println("Beetle Constructor: i = " + i + " si = " + si); } } public class Cockroach extends Beetle { private static int si = numOfLegs("Static si Cockroach"); private int i = numOfLegs("Cockroach"); // 并未显示调用Insect的构造函数 public Cockroach() { System.out.println("Cockroach Constructor: i = " + i + " si = " + si); } public static void main(String[] args) { System.out.println("Cockroach Construct"); Cockroach b = new Cockroach(); // 构造引发静态变量初始化 System.out.println(Cockroach.si); // 调用静态变量 } } /* * Static si Insect //根基类的static先被加载 Static si Beetle //基类的static被加载 Static si Cockroach //导出类 static加载 Cockroach Construct //进入main() Insect Constructor: i = 0 j = 0//根基类的构造器加载,对象中的基本类型被初始化 j被初始化为0,对象的引用被初始化为null Beetle //基类方法 Beetle Constructor: i = 4 si = 4 //导出类构造器 Cockroach Cockroach Constructor: i = 4 si = 4 4*/
final和private代理
package sixth; class WithFinals{ private final void f(){ System.out.println("WithFinals f()"); }//与不加final是同样的,private方法隐含是final的 protected void g(){ System.out.println("WithFinals g()"); } } final class OverridePrivate extends WithFinals{ //@Override private方法没法覆盖 private void f(){ System.out.println("OverridePrivate f()"); } @Override protected void g(){ System.out.println("OverridePrivate g()"); } } //final类不能被继承 /*class OverridePrivate2 extends OverridePrivate{ //@Override public final void f(){ System.out.println("OverridePrivate2 f()"); } @Override public void g(){ System.out.println("OverridePrivate2 g()"); } }*/ public class FinalMethod { public static void main(String[] args){ //OverridePrivate2 op2 = new OverridePrivate2(); //op2.f(); //op2.g(); //OverridePrivate op = op2; //op.f(); 没法调用 //op.g(); WithFinals wf = new WithFinals(); wf.g(); //wf.f(); 没法调用the method f() from WithFinals is not visible //private方法当作他所属的类的组织结构的缘由而存在 无其余意义 } }
static finalcode
一个既是static又是final的域占据一段不能改变的存储空间,定义为static强调只有一份,定义为final说明是一个常量。对象
向上转型继承
导出类是基类的一个超集,可能含有比基类更多的方法,但至少具有基类的方法,在向上转型过程当中可能会丢失方法。it
package sixth; class Amphibian{ public void say(Amphibian a){ System.out.println(a + " say hi"); } } class Frog extends Amphibian{ } public class XiangShangZhuanXing { public static void say(Amphibian a){ System.out.println(a + " say hello"); } public static void main(String[] args){ Frog frog = new Frog(); frog.say(frog); say(frog); } } /*sixth.Frog@19e0bfd say hi 基类的方法 sixth.Frog@19e0bfd say hello*/