生活随笔
收集整理的這篇文章主要介紹了
java中抽象类与抽象方法的使用问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
從面向對象設計的角度來說,抽象類與抽象方法,接口都是必不可少的內容,正是這些概念以及實際運用,夠成了java面向對象的核心與強大,抽象類,方法是和多態密不可分的設計范式....
何為多態?簡單的說就是一類事物的多種形態,基本類型有多種形態(類型自動轉換),方法有多種形態(重載:同名不同參),引用類型的多態則相對復雜,比如說,一個描述人類的類,里面有個方法叫說話,不同語言的人說出來是不一樣的,中國人說漢語,外國人說我聽不懂的鳥語...在人類這個類中怎么實現說話呢?可想而知是不現實的,最好的方法就是把這個說話的方法設計成抽象方法,不提供具體實現,讓繼承人類的子類去重寫(重寫:同名,同參,同返回,范圍不能變小,異常不能變大)這個方法...
何為抽象類?抽象類是從其他若干個具有相同屬性與行為的類中進一步抽象出來的類,可以設計方法,屬性,如果把類設計為抽象類,那么這個類是不能被實例化的,只能被繼承的子類(子類也可以為抽象類,也可以不是)間接使用,抽象類有構造,是一個完整的類,抽象類中可以包含抽象方法,也可以不含,那么問題來了,既然把類設計成抽象,肯定是用于設計多態用的,一般都會包含抽象方法:
子類繼承了抽象類,如果抽象類中含有抽象方法,那么子類也繼承了抽象方法,包含抽象方法的類必須是抽象類,不然子類就必須重寫抽象方法,就是提供具體實現,完成多態,
?
下面3條原則保證了抽象方法必須重寫:
1、必須用public abstract修飾抽象方法,private ,static 都不能用于修飾
2、包含抽象方法的類必須是抽象類
3、抽象類可以不含抽象方法
?
代碼示例:
?
[java] view plaincopyprint?
<SPAN?style="FONT-SIZE:?18px">package?OOTest;??public?abstract?class?Human?{??????private?final?int?time=++count;??????private?static?int?count;????????????private?String?name;??????private?int?age;??????private?String?sex;??????????????????public?String?getName(){??????????return?this.name;??????}??????public?void?setName(String?name){?????????? ??????????if(name.length()==0){??????????????System.out.println("姓名不能為空");??????????}??????????else?if(this.isWrongName(name)){??????????????System.out.println("非法姓名,不能包含數字");??????????}??????????else{??????????????this.name=name;??????????}??????}??????private?boolean?isWrongName(String?name){??????????char[]?ch=name.toCharArray();??????????????for(int?i=0;i<ch.length;i++){??????????????????try{??????????????????????int?s=Integer.parseInt(String.valueOf(ch[i]));??????????????????????s++; ??????????????????????return?true;??????????????????}??????????????????catch(Exception?e){??????????????????????continue;??????????????????}??????????????????}??????????return?false;??????}??????public?int?getAge(){??????????return?this.age;??????}??????public?void?setAge(int?age){??????????if(age<=0){??????????????System.out.println("年齡有誤");??????????}??????????else{??????????????this.age=age;??????????}??????}??????public?String?getSex(){??????????return?this.sex;??????}??????public?void?setSex(String?sex){??????????if(sex.length()>1||sex.length()==0){??????????????System.out.println("性別設定錯誤");??????????}??????????else?if(sex.toCharArray()[0]=='男'||sex.toCharArray()[0]=='女'){??????????????this.sex=sex;??????????}??????????else{??????????????System.out.println("性別設定錯誤");??????????}??????}??????????????public?Human(){??????????this("無1名氏",25,"男");??????}??????public?Human(String?name,int?age,String?sex){??????????this.setName(name);??????????this.setAge(age);??????????this.setSex(sex);??????}??????????????public?abstract?void?speak();??????public?abstract?void?work();??????public?abstract?void?eat();??????????????????public?int?getHumanClassUseTimes(){??????????return?this.time;??????}??}??</SPAN>??
package OOTest;
public abstract class Human {//抽象父類private final int time=++count;//對象計數器private static int count;//靜態池//屬性封裝private String name;//封裝三步:隱藏屬性,提供getter與setter方法,構造中調用setter初始化private int age;private String sex;//getter&&setterpublic String getName(){return this.name;}public void setName(String name){//處理代碼:姓名不能為空,且不能包含數字if(name.length()==0){System.out.println("姓名不能為空");}else if(this.isWrongName(name)){//調用私有方法處理System.out.println("非法姓名,不能包含數字");}else{this.name=name;}}private boolean isWrongName(String name){//判斷非法姓名輸入(私有)char[] ch=name.toCharArray();for(int i=0;i<ch.length;i++){try{int s=Integer.parseInt(String.valueOf(ch[i]));s++;//廢return true;}catch(Exception e){continue;//出錯就繼續下一次循環轉換}}return false;//先返回錯誤}public int getAge(){return this.age;}public void setAge(int age){if(age<=0){System.out.println("年齡有誤");}else{this.age=age;}}public String getSex(){return this.sex;}public void setSex(String sex){if(sex.length()>1||sex.length()==0){System.out.println("性別設定錯誤");}else if(sex.toCharArray()[0]=='男'||sex.toCharArray()[0]=='女'){this.sex=sex;}else{System.out.println("性別設定錯誤");}}//構造public Human(){//無參this("無1名氏",25,"男");}public Human(String name,int age,String sex){//全參this.setName(name);this.setAge(age);this.setSex(sex);}//抽象方法public abstract void speak();//說話public abstract void work();//工作public abstract void eat();//獲取對象創建數目public int getHumanClassUseTimes(){return this.time;}
}
子類:
[java] view plaincopyprint?
<SPAN?style="FONT-SIZE:?18px">package?OOTest;????public?class?Chinese?extends?Human?{????????public?Chinese()?{????????????????}????????public?Chinese(String?name,?int?age,?String?sex)?{??????????super(name,?age,?sex);????????????????}????????public?void?eat()?{??????????System.out.println(this.getName()+"中國人用筷子吃飯");??????}????????public?void?speak()?{??????????System.out.println("中國人說漢語"+this.getSex());??????}????????public?void?work()?{??????????System.out.println("中國人干活踏實勤快"+this.getAge());??????}????}??</SPAN>??
package OOTest;public class Chinese extends Human {public Chinese() {// TODO Auto-generated constructor stub}public Chinese(String name, int age, String sex) {super(name, age, sex);// TODO Auto-generated constructor stub}public void eat() {System.out.println(this.getName()+"中國人用筷子吃飯");}public void speak() {System.out.println("中國人說漢語"+this.getSex());}public void work() {System.out.println("中國人干活踏實勤快"+this.getAge());}}
測試類:
[java] view plaincopyprint?
<SPAN?style="FONT-SIZE:?18px">package?OOTest;????public?class?Test?{??????public?static?void?main(String[]?args)?{??????????Human?h=new?Chinese();??????????h.eat();??????????h.speak();??????????h.work();??????????System.out.println("Human類被實例化:"+h.getHumanClassUseTimes()+"次");??????????Human?h1=new?Chinese();??????????System.out.println("Human類被實例化:"+h1.getHumanClassUseTimes()+"次");??????}??}</SPAN>??
package OOTest;public class Test {public static void main(String[] args) {Human h=new Chinese();h.eat();h.speak();h.work();System.out.println("Human類被實例化:"+h.getHumanClassUseTimes()+"次");Human h1=new Chinese();System.out.println("Human類被實例化:"+h1.getHumanClassUseTimes()+"次");}
}
?
運行結果:
非法姓名,不能包含數字
null中國人用筷子吃飯
中國人說漢語男
中國人干活踏實勤快25
Human類被實例化:1次
非法姓名,不能包含數字
Human類被實例化:2次
總結
以上是生活随笔為你收集整理的java中抽象类与抽象方法的使用问题的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。