導航:首頁 > 編程語言 > java父類賦值子類

java父類賦值子類

發布時間:2022-08-20 06:21:15

java如何在子類里為父類屬性賦值

非private 的,可以使用super的。

樓主,你這個語句不是在方法中使用,不用這樣調用的。要在方法體內使用。如

//子類
public class Son extends father{
public Son(){
super.i=1; //給父類中i賦值
}
}

Ⅱ java父類對象給子類對象賦值強制轉換後子類對象的屬性是怎麼一回事

代碼要寫在代碼塊、方法裡面。
class c{
public static void main(String args[]){
a a1, a2=new a();
b b1.b2=new b();
b1=(b)a2;
System.out.println(b1.b);
}
}

但還不能用的,因為

b1=(b)a2; /// a2本來是a的實例,轉換失敗。

Ⅲ java里在父類里定義的成員變數如果在其兩個子類中給其賦不同的值賦值語句怎麼寫

classParent{

protectedinta;

publicParent(){
this.a=1;
}
}

classChild1extendsParent{

publicChild(){
//這里直接其賦
this.a=4;
}

//輸出
publicvoidprint(){
System.out.println("a="+this.a);
}
}

classChild2extendsParent{

publicChild(){
//這里直接其賦
this.a=8;
}

//輸出
publicvoidprint(){
System.out.println("a="+this.a);
}
}

Ⅳ java怎麼將父類的屬性給子類

父類非private修飾的屬性和方法子類都是可以直接使用的,就像使用子類自己的方法屬性那樣去調用

Ⅳ java語言中,子類如何覆寫父類所定義的值

你父類的的屬性用的private(私有),這個是沒辦法直接繼承使用的,有三種方法修改
一:你可以把修飾改為public(公有),這樣在子類中就可以直接修改,如下:
Digimon:
public class Digimon {
public String mon;
public String name;
}
Patamon:
public class Patamon extends Digimon{
public Patamon(){
mon="Angemon";
}
}
二:給父類添加get,set方法,如下:
Digimon:
public class Digimon {
private String mon;
private String name;
public String getMon() {
return mon;
}
public void setMon( String mon ) {
this.mon = mon;
}
public String getName() {
return name;
}
public void setName( String name ) {
this.name = name;
}
Patamon:
public class Patamon extends Digimon{

public Patamon(){
setMon( "Angemon" );
}
}
}
三:給父類添加參數構造器(也需要添加get,set不然賦值了你也獲取不到),如下:
Digimon:
public class Digimon {
private String mon;
private String name;
public Digimon() {
super();
}
public Digimon( String mon, String name ) {
super();
this.mon = mon;
this.name = name;
}
public String getMon() {
return mon;
}
public void setMon( String mon ) {
this.mon = mon;
}
public String getName() {
return name;
}
public void setName( String name ) {
this.name = name;
}
}
Patamon:

public class Patamon extends Digimon{

public Patamon(){
//調用父類構造器
super( "Angemon", "豆豆" );
}
}

Ⅵ java中父類對象引用指向子類對象

這個是我很早之前學習到「多態」時候整理的筆記。
送你了!希望對你有用!

Java的多態性

面向對象編程有三個特徵,即封裝、繼承和多態。

封裝隱藏了類的內部實現機制,從而可以在不影響使用者的前提下改變類的內部結構,同時保護了數據。

繼承是為了重用父類代碼,同時為實現多態性作準備。那麼什麼是多態呢?

方法的重寫、重載與動態連接構成多態性。Java之所以引入多態的概念,原因之一是它在類的繼承問題上和C++不同,後者允許多繼承,這確實給其帶來的非常強大的功能,但是復雜的繼承關系也給C++開發者帶來了更大的麻煩,為了規避風險,Java只允許單繼承,派生類與基類間有IS-A的關系(即「貓」is a 「動物」)。這樣做雖然保證了繼承關系的簡單明了,但是勢必在功能上有很大的限制,所以,Java引入了多態性的概念以彌補這點的不足,此外,抽象類和介面也是解決單繼承規定限制的重要手段。同時,多態也是面向對象編程的精髓所在。

要理解多態性,首先要知道什麼是「向上轉型」。

我定義了一個子類Cat,它繼承了Animal類,那麼後者就是前者是父類。我可以通過

Cat c = new Cat();
實例化一個Cat的對象,這個不難理解。但當我這樣定義時:

Animal a = new Cat();
這代表什麼意思呢?

很簡單,它表示我定義了一個Animal類型的引用,指向新建的Cat類型的對象。由於Cat是繼承自它的父類Animal,所以Animal類型的引用是可以指向Cat類型的對象的。那麼這樣做有什麼意義呢?因為子類是對父類的一個改進和擴充,所以一般子類在功能上較父類更強大,屬性較父類更獨特,

定義一個父類類型的引用指向一個子類的對象既可以使用子類強大的功能,又可以抽取父類的共性。

所以,父類類型的引用可以調用父類中定義的所有屬性和方法,而對於子類中定義而父類中沒有的方法,它是無可奈何的;

同時,父類中的一個方法只有在在父類中定義而在子類中沒有重寫的情況下,才可以被父類類型的引用調用;

對於父類中定義的方法,如果子類中重寫了該方法,那麼父類類型的引用將會調用子類中的這個方法,這就是動態連接。

看下面這段程序:

class Father{
public void func1(){
func2();
}
//這是父類中的func2()方法,因為下面的子類中重寫了該方法
//所以在父類類型的引用中調用時,這個方法將不再有效
//取而代之的是將調用子類中重寫的func2()方法
public void func2(){
System.out.println("AAA");
}
}

class Child extends Father{
//func1(int i)是對func1()方法的一個重載
//由於在父類中沒有定義這個方法,所以它不能被父類類型的引用調用
//所以在下面的main方法中child.func1(68)是不對的
public void func1(int i){
System.out.println("BBB");
}
//func2()重寫了父類Father中的func2()方法
//如果父類類型的引用中調用了func2()方法,那麼必然是子類中重寫的這個方法
public void func2(){
System.out.println("CCC");
}
}

public class PolymorphismTest {
public static void main(String[] args) {
Father child = new Child();
child.func1();//列印結果將會是什麼?
}
}
上面的程序是個很典型的多態的例子。子類Child繼承了父類Father,並重載了父類的func1()方法,重寫了父類的func2()方法。重載後的func1(int i)和func1()不再是同一個方法,由於父類中沒有func1(int i),那麼,父類類型的引用child就不能調用func1(int i)方法。而子類重寫了func2()方法,那麼父類類型的引用child在調用該方法時將會調用子類中重寫的func2()。

那麼該程序將會列印出什麼樣的結果呢?

很顯然,應該是「CCC」。

對於多態,可以總結它為:

一、使用父類類型的引用指向子類的對象;

二、該引用只能調用父類中定義的方法和變數;

三、如果子類中重寫了父類中的一個方法,那麼在調用這個方法的時候,將會調用子類中的這個方法;(動態連接、動態調用)

四、變數不能被重寫(覆蓋),」重寫「的概念只針對方法,如果在子類中」重寫「了父類中的變數,那麼在編譯時會報錯。

****************************************************************************************************************************

多態詳解(整理)2008-09-03 19:29多態是通過:
1 介面 和 實現介面並覆蓋介面中同一方法的幾不同的類體現的
2 父類 和 繼承父類並覆蓋父類中同一方法的幾個不同子類實現的.

一、基本概念

多態性:發送消息給某個對象,讓該對象自行決定響應何種行為。
通過將子類對象引用賦值給超類對象引用變數來實現動態方法調用。

java 的這種機制遵循一個原則:當超類對象引用變數引用子類對象時,被引用對象的類型而不是引用變數的類型決定了調用誰的成員方法,但是這個被調用的方法必須是在超類中定義過的,也就是說被子類覆蓋的方法。

1. 如果a是類A的一個引用,那麼,a可以指向類A的一個實例,或者說指向類A的一個子類。
2. 如果a是介面A的一個引用,那麼,a必須指向實現了介面A的一個類的實例。

二、Java多態性實現機制

SUN目前的JVM實現機制,類實例的引用就是指向一個句柄(handle)的指針,這個句柄是一對指針:
一個指針指向一張表格,實際上這個表格也有兩個指針(一個指針指向一個包含了對象的方法表,另外一個指向類對象,表明該對象所屬的類型);
另一個指針指向一塊從java堆中為分配出來內存空間。

三、總結

1、通過將子類對象引用賦值給超類對象引用變數來實現動態方法調用。

DerivedC c2=new DerivedC();
BaseClass a1= c2; //BaseClass 基類,DerivedC是繼承自BaseClass的子類
a1.play(); //play()在BaseClass,DerivedC中均有定義,即子類覆寫了該方法

分析:
* 為什麼子類的類型的對象實例可以覆給超類引用?
自動實現向上轉型。通過該語句,編譯器自動將子類實例向上移動,成為通用類型BaseClass;
* a.play()將執行子類還是父類定義的方法?
子類的。在運行時期,將根據a這個對象引用實際的類型來獲取對應的方法。所以才有多態性。一個基類的對象引用,被賦予不同的子類對象引用,執行該方法時,將表現出不同的行為。

在a1=c2的時候,仍然是存在兩個句柄,a1和c2,但是a1和c2擁有同一塊數據內存塊和不同的函數表。

2、不能把父類對象引用賦給子類對象引用變數

BaseClass a2=new BaseClass();
DerivedC c1=a2;//出錯

在java裡面,向上轉型是自動進行的,但是向下轉型卻不是,需要我們自己定義強制進行。
c1=(DerivedC)a2; 進行強制轉化,也就是向下轉型.

3、記住一個很簡單又很復雜的規則,一個類型引用只能引用引用類型自身含有的方法和變數。
你可能說這個規則不對的,因為父類引用指向子類對象的時候,最後執行的是子類的方法的。
其實這並不矛盾,那是因為採用了後期綁定,動態運行的時候又根據型別去調用了子類的方法。而假若子類的這個方法在父類中並沒有定義,則會出錯。
例如,DerivedC類在繼承BaseClass中定義的函數外,還增加了幾個函數(例如 myFun())

分析:
當你使用父類引用指向子類的時候,其實jvm已經使用了編譯器產生的類型信息調整轉換了。
這里你可以這樣理解,相當於把不是父類中含有的函數從虛擬函數表中設置為不可見的。注意有可能虛擬函數表中有些函數地址由於在子類中已經被改寫了,所以對象虛擬函數表中虛擬函數項目地址已經被設置為子類中完成的方法體的地址了。

4、Java與C++多態性的比較

jvm關於多態性支持解決方法是和c++中幾乎一樣的,
只是c++中編譯器很多是把類型信息和虛擬函數信息都放在一個虛擬函數表中,但是利用某種技術來區別。

Java把類型信息和函數信息分開放。Java中在繼承以後,子類會重新設置自己的虛擬函數表,這個虛擬函數表中的項目有由兩部分組成。從父類繼承的虛擬函數和子類自己的虛擬函數。
虛擬函數調用是經過虛擬函數表間接調用的,所以才得以實現多態的。

Java的所有函數,除了被聲明為final的,都是用後期綁定。

四. 1個行為,不同的對象,他們具體體現出來的方式不一樣,
比如: 方法重載 overloading 以及 方法重寫(覆蓋)override
class Human{
void run(){輸出 人在跑}
}
class Man extends Human{
void run(){輸出 男人在跑}
}
這個時候,同是跑,不同的對象,不一樣(這個是方法覆蓋的例子)
class Test{
void out(String str){輸出 str}
void out(int i){輸出 i}
}
這個例子是方法重載,方法名相同,參數表不同

ok,明白了這些還不夠,還用人在跑舉例
Human ahuman=new Man();
這樣我等於實例化了一個Man的對象,並聲明了一個Human的引用,讓它去指向Man這個對象
意思是說,把 Man這個對象當 Human看了.

比如去動物園,你看見了一個動物,不知道它是什麼, "這是什麼動物? " "這是大熊貓! "
這2句話,就是最好的證明,因為不知道它是大熊貓,但知道它的父類是動物,所以,
這個大熊貓對象,你把它當成其父類 動物看,這樣子合情合理.

這種方式下要注意 new Man();的確實例化了Man對象,所以 ahuman.run()這個方法 輸出的 是 "男人在跑 "

如果在子類 Man下你 寫了一些它獨有的方法 比如 eat(),而Human沒有這個方法,

在調用eat方法時,一定要注意 強制類型轉換 ((Man)ahuman).eat(),這樣才可以...

對介面來說,情況是類似的...

實例:

package domatic;

//定義超類superA
class superA {
int i = 100;

void fun(int j) {
j = i;
System.out.println("This is superA");
}
}

// 定義superA的子類subB
class subB extends superA {
int m = 1;

void fun(int aa) {
System.out.println("This is subB");
}
}

// 定義superA的子類subC
class subC extends superA {
int n = 1;

void fun(int cc) {
System.out.println("This is subC");
}
}

class Test {
public static void main(String[] args) {
superA a = new superA();
subB b = new subB();
subC c = new subC();
a = b;
a.fun(100);
a = c;
a.fun(200);
}
}
/*
* 上述代碼中subB和subC是超類superA的子類,我們在類Test中聲明了3個引用變數a, b,
* c,通過將子類對象引用賦值給超類對象引用變數來實現動態方法調用。也許有人會問:
* "為什麼(1)和(2)不輸出:This is superA"。
* java的這種機制遵循一個原則:當超類對象引用變數引用子類對象時,
* 被引用對象的類型而不是引用變數的類型決定了調用誰的成員方法,
* 但是這個被調用的方法必須是在超類中定義過的,
* 也就是說被子類覆蓋的方法。
* 所以,不要被上例中(1)和(2)所迷惑,雖然寫成a.fun(),但是由於(1)中的a被b賦值,
* 指向了子類subB的一個實例,因而(1)所調用的fun()實際上是子類subB的成員方法fun(),
* 它覆蓋了超類superA的成員方法fun();同樣(2)調用的是子類subC的成員方法fun()。
* 另外,如果子類繼承的超類是一個抽象類,雖然抽象類不能通過new操作符實例化,
* 但是可以創建抽象類的對象引用指向子類對象,以實現運行時多態性。具體的實現方法同上例。
* 不過,抽象類的子類必須覆蓋實現超類中的所有的抽象方法,
* 否則子類必須被abstract修飾符修飾,當然也就不能被實例化了
*/
以上大多數是以子類覆蓋父類的方法實現多態.下面是另一種實現多態的方法-----------重寫父類方法

1.JAVA里沒有多繼承,一個類之能有一個父類。而繼承的表現就是多態。一個父類可以有多個子類,而在子類里可以重寫父類的方法(例如方法print()),這樣每個子類里重寫的代碼不一樣,自然表現形式就不一樣。這樣用父類的變數去引用不同的子類,在調用這個相同的方法print()的時候得到的結果和表現形式就不一樣了,這就是多態,相同的消息(也就是調用相同的方法)會有不同的結果。舉例說明:
//父類
public class Father{
//父類有一個打孩子方法
public void hitChild(){
}
}
//子類1
public class Son1 extends Father{
//重寫父類打孩子方法
public void hitChild(){
System.out.println("為什麼打我?我做錯什麼了!");
}
}
//子類2
public class Son2 extends Father{
//重寫父類打孩子方法
public void hitChild(){
System.out.println("我知道錯了,別打了!");
}
}
//子類3
public class Son3 extends Father{
//重寫父類打孩子方法
public void hitChild(){
System.out.println("我跑,你打不著!");
}
}

//測試類
public class Test{
public static void main(String args[]){
Father father;

father = new Son1();
father.hitChild();

father = new Son2();
father.hitChild();

father = new Son3();
father.hitChild();
}
}
都調用了相同的方法,出現了不同的結果!這就是多態的表現!

****************************************************************************************************************************

Ⅶ java父類轉換子類是什麼意思

這個就是關於java的上轉型和下轉型。上轉型就是將子類賦值給父類,形如:
Customer
c=new
Customer();
Object
o=c;
下轉型就是將父類再轉換成子類,形如:
Customer
other=(Object)o;
這就類似與封裝,把一個對象封裝在一個大箱子中,這樣有利於運輸或保存。
不知道我這樣說你能明白多少。

Ⅷ java中子類如何對父類中的變數進行賦值並引用

用super關鍵字啊
比如你父類又一個int的實例變數i
在子類里用
super.i=10;
這樣就行

閱讀全文

與java父類賦值子類相關的資料

熱點內容
隨車拍app綁定什麼設備 瀏覽:893
方維團購系統源碼 瀏覽:988
linux反彈shell 瀏覽:152
列印機介面加密狗還能用嗎 瀏覽:299
二板股票源碼 瀏覽:446
度人經pdf 瀏覽:901
怎麼配置android遠程伺服器地址 瀏覽:959
java程序員看哪些書 瀏覽:942
什麼app可以免費和外國人聊天 瀏覽:795
pdf手寫筆 瀏覽:182
別永遠傷在童年pdf 瀏覽:990
愛上北斗星男友在哪個app上看 瀏覽:421
主力散戶派發源碼 瀏覽:671
linux如何修復伺服器時間 瀏覽:61
榮縣優途網約車app叫什麼 瀏覽:479
百姓網app截圖是什麼意思 瀏覽:229
php如何嵌入html 瀏覽:817
解壓專家怎麼傳輸 瀏覽:745
如何共享伺服器的網路連接 瀏覽:136
程序員簡易表白代碼 瀏覽:170