繼承性是java中的第二特性之一。而繼承性最為關鍵的地方為:代碼重用性的問題,利用繼承性可以從已有的類中繼續派生出新的子類,也可以利用子類擴展出更多的操作功能。
繼承性的實現代碼為:class 子類 ?extends ?父類{ }
有以下3點說明:
1、對于extends而言,需要不斷的開展開來,但是為了理解上的方便,這些統一稱之為:繼承;
2、子類又稱之為派生類;
3、父類又稱之為超類(Super class);
以下代碼為子類繼承父類的屬性及方法
class Person{
private String name;
private int age;
public Person() {}
public Person(String name,int age){
this.name = name;
this.age = age;
}
public void setName(String name){
this.name = name;
}
public void setAge(int age){
this.age = age;
}
public String getName(){
return this.name;
}
public int getAge(){
return this.age;
}
}
}
class Student extends Person {
private String school;
public void setSchool(String school){
this.school = school;
}
public String getSchool(){
return this.school;
}
}
public class School{
public static void main(String args[]){
Student stu = new Student();
stu.setName("zhangsan");
stu.setAge(123);
stu.setSchool("大學");
System.out.println("名字" + stu.getName() + ",年齡" + stu.getAge()+ stu.getSchool());
}
}
從這中間可以得到以個結論:
子類在實際中的運用中,是將父類定義得更加具體化的一種手段。
?
在繼承的使用中,有三大限制,這些在實際的運用及編寫代碼的時候需要多加注意:
一、繼承不可以多重繼承,但是可以多層繼承。
子類與父類的使用如下:
class A{
public void fun(){
System.out.println("這就是A");
}
}
class B extends A{
public void fun(){
System.out.println("這就是B");
}
}
class C extends A{
public void fun(){
System.out.println("這就是C");
}
}
class New1{
public static void main(String args[]){
B b1 = new B();
b1.fun();
C c1 = new C();
c1.fun();
}
}
二、在子類在繼承父類時,嚴格來說會繼承中,但是在父類多有的私有操作屬于中稱之為隱形繼承。所有的非私有操作屬于顯示屬性。
class A {
???????? private String msg;
???????? public void setMsg(String msg) {
???????? ??? this.msg = msg;
???????? }
???????? public String getMsg() {
???????? ??? return this.msg;
???????? }
}
class B extends A {??????????????????????????????????????????????????????????????? // 繼承自A類
}
public class Demo {
public static void main(String args[]) {
???????? ??? B b = new B();
???????? ??? b.setMsg("Hello");???????????????????????????????????????? // 設置msg屬性,屬性通過A類繼承
???????? ??? System.out.println(b.getMsg());?? // 通過子類對象取得msg屬性
}
}
三、在子類構造前一定會默認調用父類的構造(默認使用無參構造),以保證父類的對象先實例化,子類對象后實例化。
觀察實例化對象操作:
class A {
public A() { // 父類提供的無參構造方法
System.out.println("A、A類的構造方法!");
}
}
class B extends A { // B是子類繼承父類A
public B() { // 定義子類的構造方法
System.out.println("B、B類的構造方法!");
}
}
public class Demo {
public static void main(String args[]) {
new B(); // 實例化子類對象
}
}
子類隱含語句:
class B extends A { // B是子類繼承父類A
public B() { // 定義子類的構造方法
super() ; // 父類中有無參構造時加與不加無區別,如果編寫則必須出現在首行
System.out.println("B、B類的構造方法!");
}
父類不提供無參構造方法:
class A {
public A(String title) { // 父類提供的有參構造方法
System.out.println("A、A類的構造方法,title = " + title);
}
}
class B extends A { // 定義子類B
public B(String title) { // 子類提供有參構造
super(title); // 明確調用父類構造,否則將出現編譯錯誤
System.out.println("B、B類的構造方法!");
}
}
public class Demo {
public static void main(String args[]) {
new B("Hello"); // 實例化子類對象
}
}
?
方法覆寫:
特產主要特征:子類可以根據父類已有的功能進行功能的擴展,但是在子類定義屬性或方法時,可以出現定義的屬性或方法與父類同名的情況,這樣的操作成為覆寫。
class A {
???????? public void fun() {????????? // 在父類中定義的方法
?????????????????? System.out.println("A類中的fun()方法。") ;
???????? }
}
class B extends A {?????????????????????????? // 定義子類,此時沒有覆寫任何方法
???????? public void fun() {????????? // 此處為覆寫
?????????????????? System.out.println("B類中的fun()方法。") ;
???????? }
}
class C extends A {
???????? public void fun() {????????? // 此處為覆寫
?????????????????? System.out.println("C類中的fun()方法。") ;
???????? }
}
public class TestDemo {
???????? public static void main(String args[]) {
?????????????????? B b = new B() ;????????????? // 實例化子類對象
?????????????????? b.fun() ;???????????????????????? // 調用fun()方法,此時方法被覆寫,所以調用被覆寫過的方法
?????????????????? C c = new C() ;????????????? // 實例化子類對象
?????????????????? c.fun() ;????????????????????????? // 調用fun()方法,此時方法被覆寫所以調用被覆寫過的方法
???????? }
}
?
?
方法重載與重寫的區別
區別? 重載 ? 覆寫
英文單詞 Overloading ? ?? Override
發生 發生在一個類里面 發生在繼承關系中
定義 方法名稱相同、參數 方法名稱相同、參數類型、個數相同、方法返回值相同
? ?的類型及個數不同
極限 沒有權限的限制 被覆寫的方法不能擁有比父類更為嚴格的訪問控制限制
?
區別 this ? super
功能 調用本類構造,本類方法,本類屬性 子類調用父類構造,父類方法,父類屬性
形式 先查找本類中是否存在有指定的調用結構, 不查找子類,直接調用父類操作
特殊 表示本類的當前對象 空
?