繼承性
一、繼承性
1.1, 繼承性的概念:
是指一個類可以基於另一個已經存在的類,也就是子類基於父類。
從而實現父類代碼的重用,子類可以調用父類的屬性和方法,並能擴展新的能力。
形式:【訪問權限修飾符】 【修飾符】子類名 extends 父類名{
子類體
}
1.2 作用
代碼的復用
1.3繼承在構造方法中的調用
1.子類構造方法總是先調用父類的構造方法
2.默認情況下,調用的是父類的無參的構造方法
3.可以在子類構造方法的第一行,使用super關鍵字調用父類的任意一個構造方法。
必須將調用父類構造方法的這條語句放在子類構造方法的第一條語句位置。如果第一條語句沒有調用父類的構造方法,系統將會自動地在這個位置上插入一條調用父類默認構造方法的語句
1.4子類構造方法的執行詳解
由於默認的構造方法不帶參數,所以,如果在父類中定義了帶參數的構造方法,而沒有定義不帶參數的構造方法將會出現編譯錯誤。這也正是建議大家在定義帶參數的構造方法時,一定要定義一個不帶參數的構造方法的原因所在。
父類中那些帶參數的構造方法,子類將不會自動地調用它們,必須人工地將調用它們的語句寫入子類的構造方法中。
1.5 this用途
this關鍵字代表自身,在程序中主要的用途
使用this關鍵字在自身構造方法內部引用其它構造方法
使用this關鍵字代表自身類的對象
直接使用this
1使用this關鍵字引用成員變量
2使用this關鍵字引用成員方法
this關鍵字必須放在非靜態方法裏面
1.使用this關鍵字引用成員變量
在一個類的方法或構造方法內部,可以使用“this.成員變量名”這樣的格式來引用成員變量名,常常用來區分同名的成員變量和局部變量。
public class ReferenceVariable {
private int a;
public ReferenceVariable(int a){
this.a = a;
}
public int getA(){
return a;
}
public void setA(int a){
this.a = a;
}
}
2.this引用構造方法
在一個類的構造方法內部,也可以使用
public class ReferenceConstructor {
int a;
public ReferenceConstructor(){
this(0);
}
public ReferenceConstructor(int a){
this.a = a;
}
}
3.this引用成員方法
在一個類的內部,成員方法之間的互相調用時也可以使用“this.方法名(參數)”來進行引用。
public class ReferenceObject {
ReferenceObject instance;
public void hello(){ System.out.println("helloWorld");
}
public void sayHello(){
this.hello();
}
}
4.this代表自身對象
在一個類的內部,也可以使用this代表自身類的對象,或者換句話說,每個類內部都有一個隱含的成員變量,該成員變量的類型是該類的類型,該成員變量的名稱是this
public class ReferenceObject {
ReferenceObject instance;
public ReferenceObject(){
instance = this;
}
public void test(){
System.out.println(this);
}
}
1.6 super
super關鍵字代表父類的引用,在程序中主要的用途
在子類構造方法中要調用父類的構造方法,需要註意:super語句只能出現在子類構造方法體的第一行。
當子類方法體中的局部變量或者子類的成員變量與父類成員變量同名時,即子類局部變量覆蓋父類成員變量時,用“super.成員變量名”來引用父類成員變量
當子類的成員方法覆蓋了父類的成員方法時,也就是子類和父類有完全相同的方法定義(方法體可以不同),此時,用“super.方法名(參數列表)”的方式訪問父類的方法。
與this的區別,this通常指代當前對象,super通常指代父類。
1.子類構造方法中要調用父類構造方法
class Base {
Base() {
System.out.println("Base");
}
}
public class Checket extends Base {
Checket() {
super();//調用父類的構造方法,一定要放在方法的首個語句
System.out.println("Checket");
}
public static void main(String argv[]) {
Checket c = new Checket();
}
}
2.super調用父類成員變量或方法
子類中的成員變量或方法與父類中的成員變量或方法同名。因為子類中的成員變量或方法名優先級高,所以子類中的同名成員變量或方法就隱藏了父類的成員變量或方法,但是我們如果想要使用父類中的這個成員變量或方法,就需要用到super。
class Country {
String name;
void value() {
name = "China";
}
}
******
class City extends Country {
String name;
void value() {
name = "Dalian";
super.value();//不調用此方法時,super.name返回的是父類的成員變量的值null
System.out.println(name);
System.out.println(super.name);
}
public static void main(String[] args) {
City c=new City();
c.value();
}
}
this通常指代當前對象,super通常指代父類對象
class Person {
public static void prt(String s) {
System.out.println(s);
}
Person() {
prt("A Person.");
}
Person(String name) {
prt("A person name is:" + name);
}
}
*****
public class Chinese extends Person {
Chinese() {
super(); // 調用父類無形參構造方法(1)
prt("A chinese.");// (4)
}
Chinese(String name) {
super(name);// 調用父類具有相同形參的構造方法(2)
prt("his name is:" + name);
}
Chinese(String name, int age) {
this(name);// 調用當前具有相同形參的構造方法(3)
prt("his age is:" + age);
}
public static void main(String[] args) {
Chinese cn = new Chinese();
cn = new Chinese("kevin");
cn = new Chinese("kevin", 22);
}
}
二、方法覆蓋
方法覆蓋的定義
子類可以重寫父類中某一個方法,稱為方法覆蓋,也稱方法重寫,是繼承中非常重要的知識點。如果子類需要修改從父類繼承到的方法的方法體,就可以使用方法覆蓋。
方法覆蓋的原則
同名
同參
同返回值
訪問權限不能縮小
三.Final
final修飾屬性、局部變量,值不能被修改
final修飾類,不能被繼承
final修飾方法,不能被子類覆蓋
繼承性