java學習中,面向對象的三大特性:封裝、承繼、多態 以及 super關鍵字和辦法的重寫(java 學習中的小記載)。本站提示廣大學習愛好者:(java學習中,面向對象的三大特性:封裝、承繼、多態 以及 super關鍵字和辦法的重寫(java 學習中的小記載))文章只能為提供參考,不一定能成為您想要的結果。以下是java學習中,面向對象的三大特性:封裝、承繼、多態 以及 super關鍵字和辦法的重寫(java 學習中的小記載)正文
java學習中,面向對象的三大特性:封裝、承繼、多態 以及 super關鍵字和辦法的重寫(java 學習中的小記載)
作者:王可利(Star·星星)
封裝
權限修飾符:public 公共的,private 公有的
封裝的步驟:
1.運用private 修飾需求封裝的成員變量。
2.提供一個地下的辦法設置或許訪問公有的屬性
設置 經過set辦法,命名格式: set屬性名(); 屬性的首字母要大寫
訪問 經過get辦法,命名格式: get屬性名(); 屬性的首字母要大寫
1 //姓名設置器辦法 2 public void setName(String name){ 3 this.name = name; 4 } 5 //姓名訪問器辦法 6 public String getName(){ 7 return name; 8 }
代碼書寫的標准:java開發中普通類成員變量(屬性),都是封裝起來的 。
問題:是不是一切的屬性都需求運用 set 和 get 辦法?
不一定,依照需求來定。
封裝的作用:1. 框架 2. 工具類
封裝的益處:1. 進步了數據的平安性 2. 操作復雜 3. 隱藏了辦法的完成。
1 class Student{ 2 private String name;//成員變量被修飾之後只能在本類中停止訪問了,公有的了。 3 private String sex;//假如需求在內部停止訪問,就需求訪問辦法了 set 和 get 辦法。 4 private int age;//需求搜集,但是不地下,age 就只需求一個set辦法就可以了 5 6 //兩個參數的結構辦法 7 public Student (String name,String sex){ 8 this.name=name; 9 if(sex.equals("男")||sex.equals("女")){ 10 this.sex = sex; 11 } 12 } 13 //普通辦法 14 public void study(){ 15 System.out.println(name+"在學習"); 16 } 17 //性別設置器辦法 18 public void setSex(String sex){ 19 if(sex.equals("男")||sex.equals("女")){ 20 this.sex = sex; 21 }else{ 22 System.out.println("你的輸出不合法,請重新輸出.."); 23 } 24 } 25 //性別訪問器辦法 26 public String getSex(){ 27 return sex; 28 } 29 //姓名設置器辦法 30 public void setName(String name){ 31 this.name = name; 32 } 33 //姓名訪問器辦法 34 public String getName(){ 35 return name; 36 } 37 //age設置器 38 public void setAge(int age){ 39 this.age = age; 40 } 41 } 42 public class fengzhuang { 43 44 public static void main(String[] args) { 45 Student star = new Student("星星","性別");//性別 是不合法的操作 46 star.study(); 47 System.out.println(star.getSex());//性別 null 48 } 49 }
承繼
特點:承繼父類的屬性和辦法。 特性:辦法的復寫(重寫) 單承繼(多層承繼)不是多承繼,c++才是多承繼一個子類N個父類。
java 中的承繼 和 OC中一樣。
承繼的作用:優化代碼,增加代碼的反復運用
A:B OC中承繼的寫法,java中如何表現承繼關系,用關鍵字 extends 表示承繼。
承繼中留意事項:
1.不要為了承繼而承繼,千萬不要為了節省代碼,任何關系都承繼,這樣就不三不四了。
2.父類的公有成員變量是不可以被承繼的。
3.父類的結構辦法是不能被承繼的。
4.父類的公有辦法不能被承繼。
5.子類調用自己的結構辦法時,會默許調用父類中的無參結構辦法。
6.子類不可以承繼不在一個包中默許權限的成員變量。
為什麼會調用父類的結構辦法?
子類在創立對象的時分初始化父類的變量。
技巧:畢竟這兩個屬性是從父類下面承繼上去的,初始化交給父類會好一點。。
super(name,sex);//普通由自己指定(定義),假如自己指定了上面的 super()就不可以調用了。
super();//調用的是父類的結構辦法
this();//調用的是自己的結構辦法
承繼代碼如下:
1 package 面向對象的三大特性; 2 3 class Person{ 4 String name;//默許權限 friendly(敵對的) private、public、protected 5 String sex; 6 Dog dog;//人和狗樹立了 關聯關系 全體->局部 7 public void eat(){ 8 System.out.println(name+"在吃飯"); 9 } 10 } 11 12 //定於學生類承繼父類 13 class Student extends Person{ 14 int age; 15 public void study(){ 16 System.out.println(name+"在學習"); 17 } 18 } 19 20 public class jicheng { 21 22 public static void main(String[] args) { 23 Student s = new Student(); 24 s.name = "WKL";//name 自己沒有 父類有 25 s.age = 20;//age 自己有的 26 System.out.println(s.name+"往年"+s.age+"歲了.."); 27 } 28 }
關聯關系(不是承繼):
1 class person{ 2 String name; 3 String sex; 4 Dog dog;//人和狗樹立了 關聯關系 全體->局部 5 public void eat(){ 6 System.out.println(name+"在吃飯"); 7 } 8 } 9 10 class Dog{ 11 String name; 12 public void cry(){ 13 System.out.println(name+"在叫"); 14 } 15 } 16 17 18 public class jicheng { 19 20 public static void main(String[] args) { 21 person star = new person(); 22 star.name = "星星"; 23 Dog dog = new Dog(); 24 dog .name = "小白"; 25 26 star.dog = dog;//把狗這個對象 給 star的dog對象成員屬性 27 /*dog.cry();*/ 28 star.dog.cry();//星星的狗在叫 29 star.dog = null; 30 star.eat(); 31 } 32 }
super關鍵字(指向父類對象的援用空間)
作用:
1.當子類和父類存在同名的成員變量時,會先在子類外面找默許有一個this(this.name),可以經過super來調用父類的成員變量(super.name)。
2.super可以用來調用父類的結構辦法。
super運用的留意的中央:
1.用super調用父類結構辦法,必需是結構辦法中的第一個語句。
2.super只能呈現在子類的辦法或許結構辦法中。
3.super 和 this 不可以同時調用結構辦法。(由於this也是在結構辦法的第一個語句)
總結:super 和 this 的區別:
1.代表的事物不一樣:
this:代表所屬辦法的調用者對象。
super:代表父類對象的援用空間。
2.運用前提不分歧:
this:在非承繼的條件下也可以運用。
super:只能在承繼的條件下才干運用。
3.調用結構辦法:
this:調用本類的結構辦法。
super:調用的父類的結構辦法
辦法的復寫(重寫)
作用:父類的辦法滿足不了子類的完成,這個時分就需求經過復寫(重寫)辦法再完成父類的行為。
辦法的復寫運用留意事項:
1.辦法重寫的時分,必需存在承繼關系。
2.辦法重寫的時分,辦法名和方式參數 必需跟父類是分歧的。
3.辦法重寫的時分,子類的權限修飾符必需要大於或許等於父類的權限修飾符。( private < protected < public,friendly < public )
4.辦法重寫的時分,子類的前往值類型必需小於或許等於父類的前往值類型。( 子類 < 父類 ) 數據類型沒有明白的上上級關系
5.辦法重寫的時分,子類的異常類型要小於或許等於父類的異常類型。
辦法的重載:辦法名是一樣的,只是參數列表的個數,類型,順序不一樣。
多態(一個對象同品種型不同表現形狀)
父類的援用類型指向了子類的對象。
多態運用留意事項:
1.多態狀況下,父類 和 子類存在同名的成員變量,無論是靜態的還是非靜態的變量,默許訪問的是父類中的成員變量。
2.多態狀況下,父類 和 子類存在同名的非靜態辦法,訪問的是子類的非靜態辦法。
3.多態狀況下,父類 和子類存在同名的靜態辦法,訪問的是父類的靜態辦法。
4.多態狀況下,不能訪問子類特有的屬性、辦法。
5.多態滿足的條件:必需要有承繼關系。
總結:多態狀況下,子類 和 父類假如存在同名的成員,訪問的都是父類,除了同名的非靜態變量訪問的才是子類。
java 編譯器編譯原理招致的。
編譯看右邊,運轉不一定看左邊。
編譯看右邊的意思:java 編譯器在編譯的時分會檢測援用類型中含有指定的成員,假如沒有就會報錯。
1 package study; 2 3 abstract class Animal{ 4 String name; 5 static String color = "植物色"; 6 7 public abstract void run(); 8 9 public void eat(){ 10 System.out.println("這個是父類中的辦法"); 11 } 12 } 13 14 class Dog extends Animal{ 15 static String color = "黃色"; 16 //重寫父類中的辦法 17 public void run(){ 18 System.out.println(name+"用四條腿在跑步"); 19 } 20 //重寫父類中的eat辦法 21 public void eat(){ 22 System.out.println("這個是子類中的辦法"); 23 } 24 } 25 26 class Fish extends Animal{ 27 28 //重寫父類的辦法 29 public void run(){ 30 System.out.println(name+"在無拘無束地游泳"); 31 } 32 } 33 34 public class star { 35 public static void main(String[] args) { 36 37 Animal a = new Dog();//Animal 指針指向 Dog 38 a.name = "小黃"; 39 a.run(); 40 41 a.eat(); 42 System.out.println(a.color); 43 44 // a = new Fish();//Animal 指針指向 Fish 45 // a.name = "小黃"; 46 // a.run(); 47 } 48 }
多態運用的場景:
1.多態可以用於做方式參數,可以讓辦法接納更多的類型。
2.多態用於前往類型,可以前往更多的數據類型。
問題:
我前往的是圓的對象,不能用圓的援用變量來接納:前往的圖形 -> 圓的父類
根本數據類型的轉換:大的數據 -> 小的接納(強迫轉換)
1 package study; 2 3 //需求1:定義一個辦法可以接納恣意類型 的圖形對象,求面積和周長。 4 //需求2:定於一個辦法可以前往恣意類型的圖形。 5 abstract class MyShape{ 6 //定義兩個辦法求面積和周長。 7 public abstract void getArea(); 8 public abstract void getLength(); 9 } 10 11 class Circle extends MyShape{ 12 int r; 13 final double PI = 3.14; 14 15 //重寫父類中的辦法 16 public void getArea(){ 17 System.out.println("圓的面積"); 18 } 19 public void getLength(){ 20 System.out.println("圓的周長"); 21 } 22 } 23 24 class Rect extends MyShape{ 25 26 public void getArea(){ 27 System.out.println("矩形的面積"); 28 } 29 public void getLength(){ 30 System.out.println("矩形的周長"); 31 } 32 } 33 34 public class star { 35 public static void main(String[] args) { 36 37 //需求1:定義一個辦法可以接納恣意類型 的圖形對象,求面積和周長。 38 getAreaAndLength(new Circle()); 39 getAreaAndLength(new Rect()); 40 41 //需求2:定於一個辦法可以前往恣意類型的圖 42 MyShape a = getMyShape(0);//圓 43 /*getAreaAndLength(a);//在這裡拿到的是哪個型就計算哪個的面積和周長。*/ 44 45 Circle c = (Circle)a;//援用數據類型的強迫轉換 46 getAreaAndLength(c);//在這裡拿到的是哪個型就計算哪個的面積和周長。 47 } 48 49 public static void getAreaAndLength(MyShape ms){//這個參數拿到的是父類的對象,但凡屬於這個父類的都可以運用這個辦法。假如是圓就只能接納圓的 50 ms.getArea(); 51 ms.getLength(); 52 } 53 54 public static MyShape getMyShape(int i){ 55 if (i == 0) { 56 return new Circle();//圓 57 }else if (i == 1) { 58 return new Rect();//矩形 59 } 60 return null; 61 } 62 }