Java探索之旅(6)——对象和类
1.知識要點
假設:
public ClassName{int data;String name;ClassName(){data=1;}public static int getdata(){return data;}}</span>? ??含main()的為主類。多個類放在一個文件中,只能有一個主類。
? ??類可以不定任何構造方法(函數),系統默認提供無參構造函數。當且僅當無任何無參構造函數時才提供。
? ??構造函數與類同名,無返回類型。
? ?對象聲明:ClassName objectRef=new ClassName(....) ? ? 實質上,obejectRef為一個包含對ClassName對象的引用變量。即為引用類型,簡稱為ClassName對象。? ??類似于匿名數組,也有匿名對象,如new ClassName()就可以直接用于參數或者輸出。因為此時對象不需要引用。
? ??類的數據域也可以是引用類型。例如name同樣為String引用類型,倘若其沒有引用任何變量,初始化為null。
? ??Java的類的數值域,數值類型默認0,引用類型默認null,boolean默認false,char默認‘\u0000’。但是局部變量沒有初始化值,比如在main中不要試圖定義變量,未經初始化輸出。
? ??不需要某個對象的時候。顯式的賦給null,其之前的引用的對象進入垃圾回收機制。
? ??類似數組,對象名之間的賦值,后者指向的對象進入垃圾回收機制,Java系統自動的收回所占空間。
2.靜態變量、常量與方法
? ??靜態變量(類變量):類的所有實例共享數據,存儲在公共地址,某對象修改,其他的對應修改。關鍵字static。可以使用類名(推薦)或者引用變量調用
? ??常量:關鍵詞final static。所有類的對象共享。推薦使用類名訪問,增加可讀性。
? ??靜態方法:靜態方法在前面添加static關鍵字。比如常用的Math.random
? 注意:
? ? 靜態變量和靜態實例可以在實例方法和靜態方法中使用。相反,實例方法和實例變量僅能使用于實例方法。因為靜態方法、變量不屬于某個特定的類。 ? ? 所謂實例方法和實例變量是依賴具體實例的,比喻半徑r依賴于某個圓實例,getArea()得到圓的面積,也是依賴實例。倘若不依賴,就可以定義為靜態方法或者靜態變量(比如 PI) package Study_Class; public class MyCircle {double radius;//實例變量static int j=2;final static double Pi=3.14159;MyCircle(){radius=1.0;}MyCircle(double r){if(r>0) radius=r;else radius=0; }public static void main(String[] args){//int k=j;//錯誤!!!,實例變量不在靜態方法中使用//getArea();//錯誤!!!,實例方法不能在今天方法中使用MyCircle circle1=new MyCircle(2.0);System.out.println("the area of circle is"+circle1.getArea());//實例方法使用實例來調用 }public double getArea()//實例方法{return Math.pow(radius, 2)*Pi;}}</pre><pre code_snippet_id="497932" snippet_file_name="blog_20141027_2_2668877" name="code" class="java">3.public和private修飾符以及數據域的封裝
? ??類、方法、數據域前面有public修飾符,表示可以被任何其他類(通過實例訪問,某個public類的public數據域和方法)訪問。
? ??如果不帶修飾符。代表可以被同一包類的任何一個類訪問(包私有)。即,同一個包的類,可以通過該public類實例訪問,public類的public類和方法,也通過實例訪問,不帶修飾符的數據域和方法。
? ??不同的包,只能通過實例訪問,public類的public數據域和方法。
? ??僅僅只有類內定義的對象,能夠訪問該類的私有方法和私有數據。包內,其他類都不可以。如果為了限制用戶創造實例,可將構造方法限定為私有。
? ??對于私有數據,可以用public接口方法(函數)修改。為了避免數據被篡改,推薦數據域聲明為私有。
簡而言之:
pravite限制訪問權限在類內,默認修飾符限制訪問權限在包內,public沒有限定權限。
package Study_Class; public class MyCircle {private double radius;//實例變量static int numberofObject=0;final static double Pi=3.14159;MyCircle(){radius=1.0;numberofObject++;}MyCircle(double r){if(r>0) radius=r;else radius=0;numberofObject++;}public void setRidus(double r){if(r>0) radius=r;else radius=0; }public void getArea()//實例方法{System.out.println("The area is --- "+Math.pow(radius, 2)*Pi);}void gerRadius(){System.out.println("The radius is--- "+radius);} }? ?在同一個包內使用上面定義的類如下:
package Study_Class; public class testCircle//同一個包類調用MyCircle類 {public static void main(String[] args){MyCircle circle1=new MyCircle(2.0);circle1.gerRadius();//無修飾符的方法circle1.getArea();//實例方法使用實例來調用circle1.setRidus(3.5);circle1.gerRadius();circle1.getArea();//實例方法使用實例來調用MyCircle circle2;//只是定義了引用變量System.out.println("The number is--- "+MyCircle.numberofObject);//1個實例circle2=new MyCircle();System.out.println("The number is--- "+MyCircle.numberofObject);//2個實例} } 注意: ①同一個包類,可以由實例調用public和無修飾符的方法和變量 ? ? ? ②可以由類名調用靜態變量 ? ? ? ③定義引用類型,實際沒有創造實例。4.對象參數和對象數組
package Study_Class; public class testCircle//同一個包 {public static void main(String[] args){MyCircle[] circle=new MyCircle[5];//每個均是默認null的引用變量for(int i=0;i<circle.length;i++)circle[i]=new MyCircle(i); print(circle);//靜態方法中使用靜態方法System.out.println("The number of Object is--- "+MyCircle.numberofObject);//2個}private static void print(MyCircle[] circle){for(MyCircle u:circle){u.gerRadius();u.getArea();}} }? 使用對象數組和給方法傳遞對象參數如上圖。
注意:
? ?①對象參數的實質仍舊為引用傳遞,而不是值傳遞。 ? ?②靜態方法中不能使用非靜態的數據和方法。如上圖的print應該定義為static. ? ?③對象存儲于堆中轉載于:https://www.cnblogs.com/engineerLF/p/5393095.html
總結
以上是生活随笔為你收集整理的Java探索之旅(6)——对象和类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STM32 HAL 硬件IIC+DMA+
- 下一篇: Javascript 调试技巧