- 我勒個去,不要小看這一天的內容啊,真特麼多,看來我Java繼承還真挺通常的,還要繼續努力!
- 明天覆習這10天內容。
javac -d . test.java
這樣編譯後生成的class文件路徑將是com/heima/test.class
。.
表明當前目錄,這裏也能夠改爲別的目錄。package com.heima; public class test { }
package com.heima; import com.baidu.Person; class Test { public static void main(String[] args) { Person a = new Person(); System.out.println(a.getName()); } }
package com.baidu; class Person { private String name; public String getName(){ return name; } }
*
通配符開發通常不用,由於它須要檢索,挨個匹配,下降效率。本類 同一個包下(子類和無關類) 不一樣包下(子類) 不一樣包下(無關類) private Y 默認(default) Y Y protected Y Y Y public Y Y Y Y
成員方法:java
外部類要訪問內部類的成員,必須建立對象。程序員
外部類.內部類 p = 外部類對象.內部類對象
package test_heima_08; public class Test_Demo07 { public static void main(String[] args){ Outer.Inner p = new Outer().new Inner(); p.test(); } } class Outer { class Inner { public void test(){ System.out.println("Hello"); } } }
在外部類裏面建立一個成員方法,而後在該成員方法內建立對象調用內部類的方法。學習
package test_heima; public class Test_Demo08 { public static void main(String[] args){ Outer2 a = new Outer2(); a.kkk(); } } class Outer2 { private int age = 1; private class Inner2 { public void test(){ System.out.println("test"); } } public void kkk(){ Inner2 a = new Inner2(); a.test(); } }
package test_heima; public class Test_Demo09 { public static void main(String[] args){ //外部類.內部類 對象名 = 外部類名.內部類對象 //其實邏輯上應該是 Outer3.Inner oi = Outer3.new Inner(); //可是這樣寫不符合習慣,全部仍是把new放左邊了 Outer3.Inner oi = new Outer3.Inner(); oi.method(); //外部類名.內部類名.方法名 Outer3.Inner.method2(); } } class Outer3 { static class Inner { public void method() { System.out.println("非靜態方法調用"); } public static void method2() { System.out.println("靜態方法調用"); } } }
package test_heima; public class Test_Demo10 { public static void main(String[] args){ Outer4.Inner oi = new Outer4().new Inner(); oi.show(); } } class Outer4 { public int a = 3; class Inner { public int a = 2; public void show(){ int a = 1; System.out.println(a); System.out.println(this.a); System.out.println(Outer4.this.a); } } }
局部內部類裏面的方法調用方式this
package test_heima; public class Test_Demo11 { public static void main(String[] args){ Outer6 p = new Outer6(); p.method(); } } class Outer6 { public void method(){ class Inner { public void test(){ System.out.println("Hello"); } } Inner si = new Inner(); si.test(); } }
package test_heima; public class Test_Demo12 { public static void main(String[] args){ Outer7 a = new Outer7(); a.method(); } } class Outer7 { public void method(){ int a = 1; //在JDK1.7中這樣寫不行,須要加final,讓局部變量進入常量池,保證在方法彈棧後,對象依然能夠訪問。 class Inner { public void test(){ System.out.println(a); } } Inner si = new Inner(); si.test(); } }
格式:命令行
new 類名或者接口名(){ 重寫方法; }
package test_heima; public class Test_Demo13 { public static void main(String[] args){ Outer8 si = new Outer8(); si.method(); } } interface Inter { public void test(); } class Outer8 { class Inner implements Inter { public void test(){ System.out.println("Hello"); } } public void method(){ //如何調用test()? //法1:有名字a // Inner a = new Inner(); // a.test(); //法2:匿名 new Inter(){ public void test(){ System.out.println("Hello"); } }.test(); } }
匿名內部類適用於一次性使用,屢次調用建議使用有名的內部類。code
package test_heima; public class Test_Demo14 { public static void main(String[] args){ Outer11 si = new Outer11(); si.method(); } } interface Inter2 { public void print1(); public void print2(); } class Outer11 { public void method(){ //這樣屢次調用使用匿名內部類並不方便,建議屢次調用使用有名的內部類。 new Inter2(){ public void print1(){ System.out.println("print1"); } public void print2(){ System.out.println("print2"); } }.print1(); new Inter2(){ public void print1(){ System.out.println("print1"); } public void print2(){ System.out.println("print2"); } }.print2(); } }
能夠將父類引用指向子類對象,可是,因爲匿名對象沒類名,沒法實現向下轉型,因此沒法使用子類特有的方法。視頻
package test_heima; public class Test_Demo14 { public static void main(String[] args){ Outer11 si = new Outer11(); si.method(); } } interface Inter2 { public void print1(); public void print2(); } class Outer11 { public void method(){ Inter2 p = new Inter2(){ //這個匿名內部類其實至關於一個實現了Inter2接口的子類匿名對象 public void print1(){ System.out.println("print1"); } public void print2(){ System.out.println("print2"); } public void print3(){ //這個子類特有的方法無法使用 System.out.println("print3"); } }; p.print1(); p.print2(); //p.print3();//沒法使用子類特有方法 } }
package test_heima; //如何調用PersonDemo中的method方法 public class Test_Demo15 { public static void main(String[] args){ //法1:使用多態 // PersonDemo a = new PersonDemo(); // a.method(new Student()); //法2:使用匿名內部類 PersonDemo a = new PersonDemo(); a.method(new Person(){ public void talk(){ System.out.println("Hello1"); } }); } } abstract class Person { public void talk(){} } class PersonDemo { public void method(Person p){ p.talk(); } } //法1:使用多態 class Student extends Person { public void talk(){ System.out.println("Hello"); } }
package test_heima; public class Test_Demo16 { public static void main(String[] args){ Outer33.method().show(); } } interface Inter33 { void show(); } class Outer33 { //補齊代碼 public static Inter33 method(){ //返回Inter33接口的子類對象 return new Inter33(){ public void show(){ System.out.println("HelloWorld"); } }; } } //控制檯輸出"HelloWorld"