java new對象的理解


new的解釋

java里的new的英文意思就是"新的"的意思。在JAVA里就是創建一個新的實例,或者說一個新的對象,一個普通類在沒有實例化之前,就是new之前,它的屬性,方法等等在內存中都是不存在的。只有使用new了以后,這個類的一些東西在內存中才會真的存在,也就是說只有new了之后,這個類才能用。

舉例說明:

Java中使用 new關鍵字 加上 構造方法,來創建一個對象,下面是一個名為Cat的類,public class Cat { public Cat() { System.out.println("這是構造方法"); }}使用new + 構造方法 來創建一個對象。

那么也就是Cat c = new Cat();前半部分,Cat c 的意思是,在內存中分配一個變量,名字叫c,這個變量是Cat類型的 是想創建的類型;后半部分,new Cat(); 這就是new關鍵字和構造方法來創建一個對象是實際給的類型,Cat()是構造方法的名字。

想造出一個對象來,需要運用;new Cat(); 說明 new這個Cat類的一個對象,程序運行的時候,會調用構造方法Cat(),等這個構造方法執行完了,這個Cat類型的對象也就造出來了,真正的出現在內存當中了。

使用new關鍵字造出來的對象,被分配在內存的堆區(heap),而且等這個對象真正出來之后,還會做一件重要的事情:new關鍵字創建出一個對象之后,會把這個對象在內存中的地址返回,通過這個地址就可以找到這個對象。

那么上面的寫法,Cat c = new Cat();意思就是說,把這個對象在內存中的地址 賦值 給變量c,這就是Java中引用概念,c就叫做引用,或者叫引用變量,或者直接叫變量,沒問題,都是它;c的值就是一個內存地址,或者叫引用地址。

通過這個地址,就可以准確的找到剛才創建出來的對象,以后我們要使用這個對象做一些事情,調用此對象的方法什么的,都用過這個引用。

 

 

java的父類聲明new子類對象 和子類聲明new子類對象

父類名 a = new 子類名()

子類名 b = new 子類名()

 

a只能調用父類有的函數和屬性,如子類有重寫則會輸出重寫的。不能調用子類自己的函數和屬性,除非用強轉。如為靜態的方法或屬性則是父類的。

((子類) a).子類自己的方法;
((子類) a).子類自己的屬性;

b可以調用父類的函數和屬性也可以調用子類的函數和屬性(子類有重寫則會輸出重寫的)。如為靜態的方法或屬性則是子類的。

(父類屬性一般都private,不能調用)

但是對構造函數的執行上二者是沒有區別的。

作用:

 這個父類引用可以指向任意一個子類對象,增加了靈活性,尤其是在作為參數傳遞給方法的時候。

java接口對象 = new 實現類 與 實現類 對象= new 實現類

接口類 a = new 實現類()

實現類 b = new 實現類()

和上面繼承的規則一樣

可以這樣總結,在調用成員變量以及靜態方法時,“編譯看左邊,運行看左邊”,即程序編譯時創建了一個Animal類型的對象,並且使用new Cat()對於這個Animal對象賦值,但最終得到的還是一個Animal類的對象,調用靜態方法或變量只需要看“=”左邊的Animal animal即可。

但是要調用非靜態方法時,由於Animal類的對象是用Cat()來實例化的,這個非靜態方法在運行時會被重寫,從而輸出子類中方法重寫后的結果。這就是“編譯看左邊,運行看右邊”。 

 

作用

實例化對象調用方法,你就會發現使用接口 對象名 = new 類名; 方式實例化的對象只能調用接口中有的方法,而不能調用類中特有的方法。而使用類名 對象名 = new 類名;方式創建出來的對象可以調用所有的方法

使用接口編程的好處是統一規范化。

你會發現無論多少個實現類,無論這些實現類有什么不同,使用接口 對象名 = new 類名; 方式實例化對象都可以調用接口中定義的方法,

 

在使用的時候,好像區別都不大。實例化對象調用方法,你就會發現使用接口 對象名 = new 類名; 方式實例化的對象只能調用接口中有的方法,而不能調用類中特有的方法。而使用類名 對象名 = new 類名;方式創建出來的對象可以調用所有的方法

但要是我不止一個實現類呢?如果A有實現類 B C D E。

用類名 對象名2 = new 類名;來寫的話,我們要寫5次,創建5個對象,如果用接口回調,我們只需要:

A a = new B(); a.方法名();

a=new C(); a.方法名()........來實現多態。

使用接口編程的好處是統一規范化。你會發現無論多少個實現類,無論這些實現類有什么不同,使用接口 對象名 = new 類名; 方式實例化對象都可以調用接口中定義的方法。

但是
    接口回調的最大作用並不僅僅是為了統一規范化。這里舉個例子:

public class work {
public static void main(String[] args) {
Phone A = new ClassA(); //Phone是父類,ClassA是實現類
CallUp(A);
A = new ClassB();
CallUp(A);

}

public static void CallUp(Phone phone) {
System.out.println(phone.call(phone.num));//num是父類的一個屬性
};


上面這里,Phone是一個基類,它代表所有的手機。

而ClassA和ClassB代表不同的手機型號,當然還有很多諸如iphone啊華為啊,小米啊之類的接口實現類。

現在我有一個打電話的功能叫做CallUp(),如果我們使用(實現類 a =new 實現類())的寫法,那每個手機型號,我都需要寫一個CallUp的方法來接收我的手機,每個手機的打電話方式(方法)都得不到統一。

如果我們使用接口回調,那我不管你是什么手機,反正只要能實現打電話的就行,所有的手機類型都可以放在Phone phone里面,我就不需要寫很多次方法,畢竟手機型號這么多,難道我還得每一個手機型號都為他寫一個方法?

 由此可見,接口回調(接口 a = new 接口),不僅僅是為了規范,他最致命的優點是可以統一化管理所有子類,只需要提供一個共有的方法

強制類型轉換

https://blog.csdn.net/chenssy/article/details/14111307


原文鏈接:https://blog.csdn.net/qq_39309348/article/details/88061031

 原文鏈接:https://blog.csdn.net/u012198209/article/details/80064049


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM