這一節我們來說一說繼承中子父類中的成員變量有什么特征。
我們先看從一個例子說起:
~~~
class Father//父類
{
int age1 = 48;
}
class Son extends Father//子類
{
int age2 = 22;
public void printInfo()
{
System.out.println("父親的年齡:"+age1+"\n兒子的年齡:"+age2);
}
}
class ExtendTest2
{
public static void main(String[] args)
{
Son son = new Son();
son.printInfo();
}
}
~~~
我們上面的例子中有一個兒子類繼承了一個父親類,我們看到子類中訪問了父類的年齡這個成員變量,那么我們看下結果:

這時輸出了正確的結果。
但是我們會發現這兩個成員變量的名稱是不一樣的,那么我們來看一種特殊情況,當兩個成員變量名一樣時,會是什么樣子呢?
~~~
class Father//父類
{
int age = 48;
}
class Son extends Father//子類
{
int age = 22;
public void printInfo()
{
System.out.println("父親的年齡:"+age+"\n兒子的年齡:"+age);
}
}
~~~
此時我們再看結果:

我們發現父親和兒子的年齡都是兒子的年齡,這就出現了問題,當子父類中的成員變量名相同時,我們發現會直接使用子類中的成員變量。
那么怎么解決這個問題呢?
我們很自然想起前面學習時當一個類中成員變量和局部變量同名時,我們使用了this關鍵字進行了區分,那么這里有沒有一個標記讓我們區分子父類中的同名成員變量呢?
答案當然是肯定的,這個關鍵字就是super關鍵字。
我們來看例子:
~~~
class Father//父類
{
int age = 48;
}
class Son extends Father//子類
{
int age = 22;
public void printInfo()
{
System.out.println("父親的年齡:"+super.age+"\n兒子的年齡:"+this.age);
}
}
~~~
這時我們再看一下運行結果:

很顯然,結果就是我們想要的。所以我們看到一個新關鍵字super,當子父類中的成員變量同名時,我們用super關鍵字來區分。
同時,我們會發現,this關鍵字和super關鍵字的用法很相似,不過我們一定要明確的是,它們只是相似,而不是相同哦!
為什么這么說呢?我們來說一下兩個關鍵字的不同之處:
this關鍵字:代表一個本類對象的引用,這我們之前就已經學習了。
super關鍵字:并不代表父類對象,而代表一個父類的空間。因為我們這里根本就沒創建父類的對象,只有子類的對象。
下面我們再來看一個比較容易產生疑問的地方,就是父類中的私有成員,子類具有訪問權限嗎?
我們直接看例子:
~~~
class Father//父類
{
private int age = 48;
}
class Son extends Father//子類
{
int age = 22;
public void printInfo()
{
System.out.println("父親的年齡:"+super.age+"\n兒子的年齡:"+this.age);
}
}
~~~
我們把父類中的成員變量私有化,然后看運行結果:

我們會發現在編譯時就已經報了錯,很明顯我們在子類中是不能直接訪問父類中的私有內容。
那么我們要怎么訪問呢,我們可以用以下方法:
~~~
class Father//父類
{
private int age = 48;
public int getAge()
{
return this.age;
}
}
class Son extends Father//子類
{
int age = 22;
public void printInfo()
{
System.out.println("父親的年齡:"+super.getAge()+"\n兒子的年齡:"+this.age);
}
}
~~~
結果:

我們可以通過上面的方法去訪問一個類中的私有成員哦。
- 前言
- 1.1 基本常識
- 1.2 Java語言概述
- 1.3 Java語言的環境搭建
- 1.4 Java程序開發之初體驗--Hello World
- 2.1 關鍵字
- 2.2 標識符
- 2.3 注釋
- 2.4 常量
- 2.5 進制掃盲
- 2.6 變量和數據類型(1)
- 2.7 變量和數據類型(2)
- 2.8 運算符
- 3.1 if語句
- 3.2 switch語句
- 3.3 while和do-while語句
- 3.4 for語句
- 3.5 for循環的嵌套
- 3.6 break語句與continue語句
- 4.1 函數的定義
- 4.2 定義函數的兩個明確
- 4.3 函數的內存加載過程
- 4.4 函數的重載
- 5.1 數組的定義
- 5.2 數組的內存分配及特點
- 5.3 數組操作中常見問題
- 5.4 數組常用操作(1)
- 5.5 數組常用操作(2)
- 5.6 二維數組
- 6.1 面向對象的概述
- 6.2 類與對象的關系
- 6.3 對象的內存體現
- 6.4 成員變量與局部變量
- 6.5 類類型參數與匿名對象
- 6.6 基本數據類型參數與引用數據類型參數的傳遞過程
- 6.7 封裝
- 7.1 構造函數概述與默認構造函數
- 7.2 構造函數與一般函數的區別
- 7.3 構造函數的重載
- 7.4 構造函數的內存加載
- 7.5 構造函數需要注意的幾個細節
- 7.6 this關鍵字的原理
- 7.7 this關鍵字的細節與應用
- 8.1 static關鍵字之特點
- 8.2 成員變量與靜態變量的區別
- 8.3 static關鍵字使用的注意細節
- 8.4 main函數的解析與細節
- 8.5 static關鍵字的使用場景
- 8.6 靜態的內存加載
- 8.7 靜態代碼塊
- 8.8 構造代碼塊
- 9.1 繼承
- 9.2 單繼承與多重繼承
- 9.3 子父類中成員變量特征體現