java面向物件super,final,static,匿名物件,內部類學習
1、super();
//呼叫本類中的構造方法 this(實參列表); //呼叫父類中的空引數構造方法 super(); //呼叫父類中的有引數構造方法 super(實參列表);
①構造方法預設第一行都是super();
②預設的隱式super()語句在父類中沒有對應的構造方法,必須在構造方法中通過this或者super明確要呼叫的構造方法。
③第一行寫了this呼叫了本類其他構造方法,super呼叫父類的語句就沒有了。
2.final(太監類)
可以修飾類,類的成員,以及區域性變數,不能修飾構造方法
特點:
①final修飾類不能被繼承,但是可以繼承其他類
class Yy {} finalclass Fu extends Yy{} //可以繼承Yy類 class Zi extends Fu{} //不能繼承Fu類
②final修飾的方法不能被子類重寫,但父類中沒有被final修飾方法,子類重寫後可以加final
class Fu { // final修飾的方法,不可以被覆蓋,但可以繼承使用 public final void method1(){} public void method2(){} } class Zi extends Fu { //重寫method2方法 public final void method2(){} }
③final修飾的變數稱為常量,只能賦值一次
final int i = 20; i = 30; //賦值報錯,final修飾的變數只能賦值一次
④引用型別的變數值為物件地址值不能更改,地址內的物件屬性值可以修改
final Person p = new Person(); Person p2 = new Person(); p = p2; //final修飾的變數p,所記錄的地址值不能改變 p.name = "小明";//可以更改p物件中name屬性值
⑤修飾成員變數,需要在建立物件前賦值
class Demo { //直接賦值 finalint m = 100; //final修飾的成員變數,需要在建立物件前賦值,否則報錯。 final int n; public Demo(){ //可以在建立物件時所呼叫的構造方法中,為變數n賦值 n = 2016; } }
3.static 靜態修飾符
特點:
①被static修飾的成員變數屬於類
class Demo { public static int num = 100; } class Test { public static void main(String[] args) { Demo d1 = new Demo(); Demo d2 = new Demo(); d1.num = 200; System.out.println(d1.num); //結果為200 System.out.println(d2.num); //結果為200 } }
②被static修飾的成員可以通過類名直接訪問(建議這麼做 類名.靜態成員變數名;類名.靜態成員方法名(引數))
class Demo { //靜態成員變數 public static int num = 100; //靜態方法 public static void method(){ System.out.println("靜態方法"); } } class Test { public static void main(String[] args) { System.out.println(Demo.num); Demo.method(); } }
注意事項:
①靜態內容優先於物件存在,只能訪問靜態,不能使用this和super。靜態修飾的內容存於靜態區。
class Demo { //成員變數 public int num = 100; //靜態方法 public static void method(){ //this.num; 不能使用this/super。 System.out.println(this.num); } }
②同一個類中,靜態成員只能訪問靜態成員。
class Demo { //成員變數 public int num = 100; //靜態成員變數 public static int count = 200; //靜態方法 public static void method(){ //System.out.println(num); 靜態方法中,只能訪問靜態成員變數或靜態成員方法 System.out.println(count); } }
③main方法為靜態方法為程式執行入口,不屬於任何一個物件,可以定義在任意類中
④多型呼叫方法,編譯看等號左邊。靜態方法,執行父類中的靜態方法,非靜態方法,執行子類的重寫方法。成員變數,編譯執行全是父類
定義靜態常量:public static final 資料型別 變數名 = 值; 變數名用全部大寫,多個單詞使用下劃線連線
介面中的每個成員變數都預設使用public static final修飾,必須顯示賦值。可以直接用介面名訪問
interface Inter { public static final int COUNT = 100; } //訪問介面中的靜態變數 Inter.COUNT
4.匿名物件
建立物件時,只有建立物件的語句,例如:new Person();
new Person();
特點:
①建立匿名物件直接使用,沒有變數名
new Person().eat() //eat方法被一個沒有名字的Person物件呼叫了。
②匿名物件在沒有指定其引用變數時,只能使用一次
new Person().eat(); //建立一個匿名物件,呼叫eat方法 new Person().eat(); //想再次呼叫eat方法,重新建立了一個匿名物件
③匿名物件可以作為方法接收的引數、方法返回值使用
class Demo { public static Person getPerson(){ //普通方式 //Person p = new Person(); //return p; //匿名物件作為方法返回值 return new Person(); } public static void method(Person p){} } class Test { public static void main(String[] args) { //呼叫getPerson方法,得到一個Person物件 Person person = Demo.getPerson(); //呼叫method方法 Demo.method(person); //匿名物件作為方法接收的引數 Demo.method(new Person()); } }
5.內部類
在內部類中可以直接訪問外部類的所有成員
①成員內部類(定義在外部類中的成員位置):外部類名.內部類名 變數名 = new 外部類名().new 內部類名();
class Body {//外部類,身體 private boolean life= true; //生命狀態 public class Heart { //內部類,心臟 public void jump() { System.out.println("心臟噗通噗通的跳") System.out.println("生命狀態" + life); } } }
//訪問內部類 public static void main(String[] args) { //建立內部類物件 Body.Heart bh = new Body().new Heart(); //呼叫內部類中的方法 bh.jump(); }
②區域性內部類(定義在外部類方法中的區域性位置):在外部類方法中,建立內部類物件,進行訪問
class Party {//外部類,聚會 public void puffBall(){// 吹氣球方法 class Ball {// 內部類,氣球 public void puff(){ System.out.println("氣球膨脹了"); } } //建立內部類物件,呼叫puff方法 new Ball().puff(); } }
//訪問內部類 public static void main(String[] args) { //建立外部類物件 Party p = new Party(); //呼叫外部類中的puffBall方法 p.puffBall(); }