學習java也快一年多了,看過很多方面的書,也喜歡在網絡上學習優秀的java資料。但是每當自己打開myeclipse時,總是那麼的不自信…………,java基礎部分的內容自己以及掌握,並能很好運用,加油吧,多實踐,多總結,一定會有所突破的。老銀每天進步一點點。
今天就總結一下,自己看過的資料上好的列子。
1:java面向對象特徵:抽象,封裝,繼承,多態。
抽象:
封裝:
繼承:
多態:
寫一個類,來完成以上所包含的抽象,封裝,繼承內容
class LaoYin extends Thread implements Runnable{
private int Number=1111111;
private String name ="loayin";
@Override
public void run() {
System.out.println("java學習者");
}
}
java中通過重載,和重寫機制來實現多態。
/**
*
* @author YXP 小技巧:當我們想讓類中的私有變量讓外界訪問到:使用SET();GET().
* 簡單方法是選中這些變量,右鍵,source 然後Ganerate Gater and Seter,即可。
*
*/
public class DuoTai {
String name;
int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void cry(){
System.out.println("不知道怎麼叫");
}
public static void main (String[] args){
DuoTai an=new Cat();
an.cry();
DuoTai ni=new Dog();
ni.cry();
}
}
class Cat extends DuoTai{
public void cry(){
System.out.println("喵喵 ");
}
}
class Dog extends DuoTai{
public void cry(){
System.out.println("汪汪叫");
}
}
答案肯定是我們要的答案,父類調用子類的方法來爲自己聲明對象。
但是如果我們改變一下,關於類的成員變量,這裏有很大的樂趣………………
爲每一個類聲明一個一樣的成員變量 count
基類100,cat是5,dog是50;
通過多態給基類聲明對象,然後通過對象進行調用變量。我們瞧瞧看。
/**
*
* @author YXP 小技巧:當我們想讓類中的私有變量讓外界訪問到:使用SET();GET().
* 簡單方法是選中這些變量,右鍵,source 然後Ganerate Gater and Seter,即可。
*
*/
public class DuoTai {
String name;
int age;
int count=100;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void cry(){
System.out.println("不知道怎麼叫");
}
public static void main (String[] args){
DuoTai an=new Cat();
an.cry();
System.out.println(an.count);
DuoTai ni=new Dog();
System.out.println(ni.count);
ni.cry();
}
}
class Cat extends DuoTai{
int count=5;
public void cry(){
System.out.println("喵喵 ");
}
}
class Dog extends DuoTai{
int count=50;
public void cry(){
System.out.println("汪汪叫");
}
}
運行看看:F11
喵喵
100
100
汪汪叫
現在我們就可以很好的明白多態的機制了,但是我有點暈了,對於這個用多態實現的對象,它內存中是如何實現的呢
當然main棧區呢 有na ni
但堆內存中是什麼樣的內???
ni(棧內存) |
int count(自身的成員變量) | 上下 |
cry()子類覆寫的cry (如何現實的不造,原理) | 糾結的感覺 |
只能是父類引用子類的構造函數,反過來不行。
多態引用變量會調用子類的方法,但是堆內存上依然存儲的是自己的成員變量,只是方法指向了子類的方法嗎??。
如果是指向子類的方法,那麼子類必須要實現實例化,所以不成立
如果子類中有父類不曾有的方法,看看ni還能不能調用,即可知道。
答案不用說啦,編譯不能通過。
ok,我感覺自己有點明白了一些,多態就是用子類的調用方法,來將子類中重寫的父類方法,讓父類調用。即父類對象的框架上,將子類的覆寫方法覆蓋父類的方法,當然父類類上不存在的方法,對象沒有內存空間存放子類方法,編譯自然就有問題了。總之,多態就是與覆寫方法有關,與成員變量無關。