繼承使用復(fù)用以前的代碼非常容易,能夠大大的縮短開發(fā)周期,降低開發(fā)成本,同時增加程序的易維護(hù)性
繼承使重一個類A能夠直接使用另外一個類B的屬性和方法的一種途徑
類A可以有自己的屬性和方法


package com.pb.person;/* * 父類 */public class Person { PRivate String name; //姓名 private String sex; //性別 private int age;//年齡 //設(shè)置getter和setter方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { if(sex.equals("男") || sex.equals("女")){ //設(shè)置性別限制,不合法的值將提示錯誤 this.sex = sex; }else{ System.out.println("性別不合法,性別只能是:男或者女"); } } public int getAge() { return age; } public void setAge(int age) { if(age>0 && age<=150){ //設(shè)置年齡限制 this.age = age; }else{ System.out.println("年齡只能在1-150歲之間"); } } public Person() { this.name = "無名氏"; this.sex = "男"; this.age = 22; } public Person(String name, String sex, int age) { this.name = name; this.sex = sex; this.age = age; } public void say(){ System.out.println("自我介紹:"); System.out.println("姓名:"+this.name); System.out.println("性別:"+this.sex); System.out.println("年齡:"+this.age); }}子類:
package com.pb.person;/* * 子類 */public class Student extends Person { private int stuNo ; //學(xué)號 private String specialty; //專業(yè) public Student() { } public Student(String name, String sex, int age,int stuNo,String specialty) { super(name, sex, age); this.stuNo=stuNo; this.specialty=specialty; } //getter/setter方法 public int getStuNo() { return stuNo; } public void setStuNo(int stuNo) { this.stuNo = stuNo; } public String getSpecialty() { return specialty; } public void setSpecialty(String specialty) { this.specialty = specialty; } }測試類
package com.pb.persontest;import com.pb.person.Student;public class Test { public static void main(String[] args) { Student stu=new Student("張三", "男", 22, 121, "計算機科學(xué)與技術(shù)") ; stu.say(); }}結(jié)果:
自我介紹:姓名:張三性別:男年齡:22
以下可以發(fā)現(xiàn),子類的學(xué)號,和專業(yè)并沒有輸出,
默認(rèn)調(diào)用的父類的say()方法
需要子類重寫父類的方法
三、方法的重寫方法的重寫是發(fā)生的子類對父類的過程中,是在2個類中,和方法重載是在一個類中
方法重寫有以下要求

Student類重寫Person類中的say()方法
package com.pb.person;/* * 子類 */public class Student extends Person { private int stuNo ; //學(xué)號 private String specialty; //專業(yè) public Student() { } public Student(String name, String sex, int age,int stuNo,String specialty) { super(name, sex, age); this.stuNo=stuNo; this.specialty=specialty; } //方法重寫 @Override public void say() { super.say(); System.out.println("學(xué)號是:"+this.stuNo); System.out.println("專業(yè)是:"+this.specialty); } //getter/setter方法 public int getStuNo() { return stuNo; } public void setStuNo(int stuNo) { this.stuNo = stuNo; } public String getSpecialty() { return specialty; } public void setSpecialty(String specialty) { this.specialty = specialty; } }測試類不變:
package com.pb.persontest;import com.pb.person.Student;public class Test { public static void main(String[] args) { Student stu=new Student("張三", "男", 22, 121, "計算機科學(xué)與技術(shù)") ; stu.say(); }}結(jié)果:
自我介紹:姓名:張三性別:男年齡:22學(xué)號是:121專業(yè)是:計算機科學(xué)與技術(shù)
重寫以后,調(diào)用的就是子類重寫后的方法
四、super關(guān)鍵字super必須是出現(xiàn)在子類中(子類的方法和構(gòu)造方法中),而不是其他位置,在構(gòu)造方法中必須出現(xiàn)在第一行
用以訪問父類的成員,例如:父類的屬性、方法、構(gòu)造方法
訪問權(quán)限的限制,例如無法通過super訪問private成員
五、繼承條件下構(gòu)造方法的調(diào)用規(guī)則規(guī)則一:如果子類的構(gòu)造方法中沒有通過super顯示調(diào)用父類的有參構(gòu)造方法,也沒有通過this顯式調(diào)用自身的其他構(gòu)造方法,則系統(tǒng)會默認(rèn)先調(diào)用父類的無參構(gòu)造方法
規(guī)則二:如果子類的構(gòu)造方法中通過super顯示調(diào)用父類的有參構(gòu)造方法,那將執(zhí)行父類的相應(yīng)的構(gòu)造方法,而不執(zhí)行父類無參數(shù)構(gòu)造方法
規(guī)則三:如果子類的構(gòu)造方法中通過this顯式調(diào)用自身的其他構(gòu)造方法,在相應(yīng)構(gòu)造方法中應(yīng)用以上2條規(guī)則
5.1、例一package compb.demo4;/* * 父類 */public class StaticSuper { public static String staticGet() { return "父類靜態(tài)方法"; } public String dynamicGet() { return "父類動態(tài)方法"; }}package compb.demo4;/* * 子類 */public class StaticSub extends StaticSuper{ //靜態(tài)方法不能重寫 public static String staticGet() { return "子類靜態(tài)方法"; } @Override public String dynamicGet() { return "子類動態(tài)方法重寫父類動態(tài)方法"; }}package compb.demo4;/* * 測試 */public class Test { public static void main(String[] args) { StaticSub s= new StaticSub(); //聲明子類對象 System.out.println(s.staticGet()); //調(diào)用子類靜態(tài)方法 System.out.println(s.dynamicGet()); //調(diào)用子類動態(tài)方法 }}結(jié)果:
子類靜態(tài)方法子類動態(tài)方法重寫父類動態(tài)方法
5.2、例二、package com.pb.demo5;/* * 父類 */public class VenderLate { public VenderLate() { System.out.print("VenderLate out"); } }package com.pb.demo5;public class MoveGoods extends VenderLate{ public MoveGoods( ) { System.out.println("MoveGoods out!"); } public MoveGoods(String s) { System.out.println(s); } }package com.pb.demo5;/* * 測試類 */public class Test { public static void main(String[] args) { MoveGoods m=new MoveGoods(); MoveGoods g=new MoveGoods(" child"); }}結(jié)果:
VenderLate outMoveGoods out!VenderLate out child
5.3 、例三package com.pb.demo4;/* * 父類 */public class SuperClass { private String name; public SuperClass() { System.out.println("父類的無參數(shù)構(gòu)造方法"); } public SuperClass(String name) { System.out.println("父類有一個參數(shù)的構(gòu)造方法:"+name); } //setter/getter方法 public String getName() { return name; } public void setName(String name) { this.name = name; } }子類
package com.pb.demo4;public class SubClass extends SuperClass { private String name; private int count; public SubClass() { System.out.println("子類無參數(shù)構(gòu)造方法"); } public SubClass(int count) { System.out.println("子類有一個參數(shù)構(gòu)造方法:"+count); } //調(diào)用父類有參數(shù)的構(gòu)造方法 public SubClass(String name) { super(name); this.name=name; System.out.println("調(diào)用子類有一個參數(shù)構(gòu)造方法,同時使用super顯示調(diào)用"+name); }//setter/getter方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getCount() { return count; } public void setCount(int count) { this.count = count; }}測試類:
package com.pb.demo4;public class Test { public static void main(String[] args) { System.out.println("*******調(diào)用子類無參數(shù)構(gòu)造方法**********"); SubClass s1=new SubClass(); System.out.println("*******調(diào)用子類有一個參數(shù)構(gòu)造方法但是沒有使用super顯示調(diào)用**********"); SubClass s2=new SubClass(34); System.out.println("*******調(diào)用子類有一個參數(shù)構(gòu)造方法,同時使用super顯示調(diào)用**********"); SubClass s3=new SubClass("張三"); }}結(jié)果:
*******調(diào)用子類無參數(shù)構(gòu)造方法**********父類的無參數(shù)構(gòu)造方法子類無參數(shù)構(gòu)造方法*******調(diào)用子類有一個參數(shù)構(gòu)造方法但是沒有使用super顯示調(diào)用**********父類的無參數(shù)構(gòu)造方法子類有一個參數(shù)構(gòu)造方法:34*******調(diào)用子類有一個參數(shù)構(gòu)造方法,同時使用super顯示調(diào)用**********父類有一個參數(shù)的構(gòu)造方法:張三調(diào)用子類有一個參數(shù)構(gòu)造方法,同時使用super顯示調(diào)用張三六、Object類
所有的有類都自動繼承java.lang包中的Object類
Object類是所有類的父類(基類)
在定義一個類時如果沒有使用extends關(guān)鍵字,則默認(rèn)繼承Object類
Object常被重寫的方法:

新聞熱點
疑難解答