Java学习笔记二
在Java中,任何變量在被使用前都必須先設置初值.Java提供了為類的成員變量賦初值的專門功能:構造方法(constructor)構造方法是一種特殊的成員方法,它的特殊性反映在如下幾個方面:
1.構造方法的名字必須與定義他的類名完全相同,沒有返回類型,甚至連void也沒有。
2.構造方法的調用是在創建一個對象時使用new操作進行的。構造方法的作用是初始化對象。
3.每個類可以有零個或多個構造方法.
4.不能被static、final、synchronized、abstract和native修飾。構造方法不能被子類繼承。
5.構造方法在創建對象時自動執行,一般不能顯式地直接調用.
構造方法可以被重載。沒有參數的構造方法稱為默認構造方法,與一般的方法一樣,構造方法可以進行任何活動,但是經常將他設計為進行各種初始化活動,比如初始化對象的屬性。
具體使用:分別計算長、寬為20、10和6、3的兩個長方形的面積。
classRectConstructor{
double length;
double width;
double area(){
returnlength*width;
}
RectConstructor(doublewidth,double length){//帶參數的構造方法
this.length=length;
this.width=width;
}
}
public classRectDemo{
public staticvoid main(String args[]) {
RectConstructorrect1=new RectConstructor(10,20);
RectConstructorrect2=new RectConstructor(3,6);
double ar;
ar=rect1.area();
System.out.println("第一個長方形的面積是"+ar);
ar=rect2.area();
System.out.println("第二個長方形的面積是"+ar);
}
} 26. //關于靜態代碼塊與構造方法; //首先二者是同級的,且都是先于普通方法執行的,static代碼塊在編譯生成類的時候就已經執行 //構造方法時在生成對象的時候被執行; //所以最先執行static代碼塊從父類到子類,二者的作用也大多是初始化;并且static代碼塊只能被執行一次; //當然,前提是該類被使用了! public class Test { ??????????????????????? public static void main (String[] args) ??????????????????????? { ???????????????????????????????????????????????? Child child = new Child(); ???????????????????????????????????????????????? ??????????????????????? } } class Parent { ??????????????????????? static ??????????????????????? { ???????????????????????????????????? System.out.println("static block!"); ??????????????????????? } ??????????????????????? public Parent () ??????????????????????? { ???????????????????????????????????????????????? System.out.println ("parent is running!"); ???????????????????????????????????????????????? ??????????????????????? } } class Child { ??????????????????????? public Child extends Parent () ??????????????????????? { ???????????????????????????????????????????????? System.out.println ("Child is running!"); ???????????????????????????????????????????????? ??????????????????????? } } 27. 我們不能在一個靜態的方法里面,訪問一個非靜態的變量 例如統一各類中定義了靜態方法static method 和非靜態屬性變量 int I; 那么在靜態方法中就不能引用 I ;但是如果i也是靜態的話,當然是可以引用的 public class Test { ??????????????????????? ??????????????????????? } class Parent { ??????????????????????? static int i = 10 ; ??????????????????????? public static void method? () ??????????????????????? { ???????????????????????????????????? i ++ ; ???????????????????????????????????? ??????????????????????? } ??????????????????????? } 靜態的方法只能訪問靜態的變量,非靜態的方法什么都可以訪問 28. 什么是jdk JDK(Java Development Kit)是Sun Microsystems針對Java開發員的產品。自從Java推出以來,JDK已經成為使用最廣泛的Java SDK。JDK 是整個Java的核心,包括了Java運行環境,Java工具和Java基礎的類庫。JDK是學好Java的第一步。而專門運行在x86平臺的Jrocket在服務端運行效率也要比Sun JDK好很多。從SUN的JDK5.0開始,提供了泛型等非常實用的功能,其版本也不斷更新,運行效率得到了非常大的提高 29. 類中的屬性不需要賦初值,而接口interface中的屬性必須要賦初值 因為interface中的成員變量都是終態的final的,因為接口無法實例化,無法為成員變量賦值 30. 記事本:notepad 31. 以下的聲明是否正確呢; public abstract final class Test { ? } 分析一下,這句話是把類Test定義成一個 抽象的 、最終的、這樣做行不行呢, 首先、abstract類是抽象類,抽象類是不能實例化,只能被子類所繼承,所以被abstract的類只能被子類繼承的份,而final類是最終類,意思是不能被繼承,那這二者顯然是矛盾的,所以這種語法組合肯定是錯誤的!; 32. 看一下圖書 java設計模式33.
1.單例模式:單例模式的意思就是只有一個實例。單例模式確保某一個類只有一個實例,而且自行實例化并向整個系統提供這個實例。這個類稱為單例類。
單例模式(singleton)顧名思義,就是只有一個實例。
??
作為對象的創建模式[GOF95],單例模式確保某一個類只有一個實例,而且自行實例化并向整個系統提供這個實例。這個類稱為單例類。
單例模式的要點
顯然單例模式的要點有三個;一是某個類只能有一個實例;二是它必須自行創建這個實例;三是它必須自行向整個系統提供這個實例。在下面的對象圖中,有一個"單例對象",而"客戶甲"、"客戶乙"和"客戶丙"是單例對象的三個客戶對象??梢钥吹?#xff0c;所有的客戶對象共享一個單例對象。而且從單例對象到自身的連接線可以看出,單例對象持有對自己的引用。
一些資源管理器常常設計成單例模式。
在計算機系統中,需要管理的資源包括軟件外部資源,譬如每臺計算機可以有若干個打印機,但只能有一個Printer Spooler, 以避免兩個打印作業同時輸出到打印機中。每臺計算機可以有若干傳真卡,但是只應該有一個軟件負責管理傳真卡,以避免出現兩份傳真作業同時傳到傳真卡中的情況。每臺計算機可以有若干通信端口,系統應當集中管理這些通信端口,以避免一個通信端口同時被兩個請求同時調用。
需要管理的資源包括軟件內部資源,譬如,大多數的軟件都有一個(甚至多個)屬性(properties)文件存放系統配置。這樣的系統應當由一個對象來管理一個屬性文件。
需要管理的軟件內部資源也包括譬如負責記錄網站來訪人數的部件,記錄軟件系統內部事件、出錯信息的部件,或是對系統的表現進行檢查的部件等。這些部件都必須集中管理,不可政出多頭。
這些資源管理器構件必須只有一個實例,這是其一;它們必須自行初始化,這是其二;允許整個系統訪問自己這是其三。因此,它們都滿足單例模式的條件,是單例模式的應用。
在java中,可以使用以下這種方式使用單例模式創建類的實例:
public classMyBean {
private staticMyBean instance = null;
privateMyBean(){
//do something
}
public staticsynchronized MyBean getInstance(){
if(instance ==null){
instance = newMyBean();
}
returninstance;
}
}
當一個類的實例可以有且只可以一個的時候就需要用到了。為什么只需要有一個呢?有人說是為了節約內存。本人對這個說法持保留態度。只有一個實例確實減少內存占用,可是我認為這不是使用單例模式的理由。我認為使用單例模式的時機是當實例存在多個會引起程序邏輯錯誤的時候。比如類似有序的號碼生成器這樣的東西,怎么可以允許一個應用上存在多個呢?
Singleton模式主要作用是保證在Java應用程序中,一個類Class只有一個實例存在。
一般Singleton模式通常有兩種形式:
第一種形式: 也是常用的形式。
public classSingleton {
private staticSingleton instance = null;
privateSingleton(){
//do something
}
//這個方法比下面的有所改進,不用每次都進行生成對象,只是第一次使用時生成實例,提高了效率
public staticSingleton getInstance(){
if(instance==null){
instance = newSingleton();
}
returninstance;
}
}
第二種形式:
public classSingleton {
//在自己內部定義自己的一個實例,只供內部調用
private staticSingleton instance = new Singleton();
privateSingleton(){
//do something
}
//這里提供了一個供外部訪問本class的靜態方法,可以直接訪問
public staticSingleton getInstance(){
returninstance;
}
}
34. 如何驗證單例模式 以前說過,一個對象可以生成多個實例,比如每次使用new來生成相同對象的實例,雖然每個實例都是指向同一個對象,但是各個實例之間是獨立的,也就是生成了兩個對象,這就不是單例模式了;可以通過boolean類型的輸出來驗證 public class BooleanTest { ?????????????????????????????? public static void main (String [] args) ?????????????????????????????? { ???????????????????????????????????????????????????????????? Parent parent1 = new Parent (); ???????????????????????????????????????????????????????????? Parent parent2 = new Parent (); ???????????????????????????????????????????????????????????? System.out.println (parent1 == parent2); ?????????????????????????????? } } class Parent { ?????????????????????????????? public void method () ?????????????????????????????? { ???????????????????????????????????????????????????????????? ?????????????????????????????? } } 輸出的結果是false;也就是生成的對象不是同一個對象; ? 使用private關鍵字和static來生成單例模式 面試的時候,寫個單例模式出來; public class SingletonTest {???????????????????????????? ?????????????????????????????? public static void main (String[] args) ?????????????????????????????? {????????? ?????????????????????????????? Parent parent1 = Parent.method (); ?????????????????????????????? Parent parent2 = Parent.method (); ?????????????????????????????? System.out.println (parent1 == parent2);//驗證是否為同一個對象 ?????????????????????????????? } ?????????????????????????????? } class Parent { ?????????????????????????????? static Parent parent = new Parent ();//知識點;這里將實例定義為static 是為了使下面的靜態方法可以訪問; ?????????????????????????????? //靜態的方法只能訪問靜態的變量 ?????????????????????????????? ?????????????????????????????? ?????????????????????????????? ?????????????????????????????? private? Parent() ?????????????????????????????? { ???????????????????????????????????????????????????????????? ?????????????????????????????? } ?????????????????????????????? ?????????????????????????????? public static Parent method ( )//定義一個返回類型為Parent的方法,將生成的Parent實例返回給主方法,這樣就避免了 ?????????????????????????????? //在主方法中生成對象;就完成了單例模式;通過驗證可以知道二者生成的對象是同一個對象,指向同一個對象; ?????????????????????????????? { ???????????????????????????????????????????????????????????? return parent; ?????????????????????????????? } } static可以不用生成對象,而直接使用類的名字去調用類中的方法; 35. 與原生數據類型相對的是引用類型,就是自定義類型 引用類型的默認值為 null 比如說 Parent parent ; 36. 如何更改cmd的路徑 cmd – cd + 你要的路徑; 換盤的話就輸入盤: cd\的意思是回到根目錄; 36.?
包(package)。用于將完成不同功能的類分門別類,放在不同的目錄(包)下。包的命名規則:將公司域名反轉作為包名。www.shengsiyuan.com,com.shengsiyuan(包名),對于包名:每個字母都需要小寫。如果定義類的時候沒有使用package,那么Java就認為我們所定義的類位于默認包里面(defaultpackage)。
在對java程序進行編譯的時候,含有包的java程序,是要對生成的類設置路徑的,如果沒有設置路徑,只是像平常一樣編譯,可以編譯,但生成的class文件在當前的目錄下,因為你使用了包package,在運行的時候,就會去找包所指定的目錄下的class文件,所以運行是通不過的,因為沒有生成包文件夾;使用-d 來指定生成的位置,(.)表示在當前目錄下生成,即 –d .? 在c盤就是c:\
packagecom.shengsiyuan.a.b.c.d ;
publicclass PackageTest
{
????????????? public static void main (String[]args)
????????????? {
??????????????????????????? System.out.println("Hello World !");
????????????? }
}
36.
用import關鍵字來導入類進行調用,要滿足的條件,要導入的類必須是公共的public的,類中的屬性或者方法必須是public的,因為會被調用;
packagecom.yongjian.test;
public? class Package
{
????????????? public static int i = 33;
}
? import com.yongjian.test.Package ;(先說明,要調用哪里的類) public class ImportTest { ?????????????????????????????? public static void main (String[] args) ?????????????????????????????? { ???????????????????????????????????????????????????????????? System.out.println (Package.i); ?????????????????????????????? } } 37. 在同一文件中可以使用多個import關鍵字,即可以導入多個包文件, 如import aa.bb.* ? import aa.bb.cc.* 38.?
?
如果兩個類在同一個包下面,那么則不需要導入,直接使用即可。
package com.jianjian ;
public?class Test1
{
????????????? publicstatic int i = 87 ;
}
?
package com.jianjian ;
public class Test
{
????????????? publicstatic void main (String[] args)
????????????? {
??????????????????????????? System.out.println(Test1.i);
????????????? }
}
輸入javac –d .Test.java
javac –d . Test1.java
javacom.jianjian.Test
39.
訪問修飾符(access modified)
默認的訪問修飾符,平常在方法和屬性上沒有生命方法和屬性的訪問性質,這就默認為
認修飾符;默認修飾符的訪問權限:
默認的(不加任何訪問修飾符):在類內部以及相同包下面的類所使用。
疑問:一定是在內部嗎?我平常寫程序的時候,在非主類中生命默認的方法,在主類中年聲稱對象后也是能訪問的啊?
這就是后面一句了,因為生成的類都在一個默認包文件中,當然是可以訪問的!
40.
?
java.lang.Object類。java.lang包在使用的時候無需顯式import導入,編譯時由編譯器自動幫助我們導入。
//importjava.lang.Object;有沒有這句都是一樣的
public classObjectTest
{
????????????? public static void main (String[]args)
????????????? {
??????????????????????????? Object object = newObject();
??????????????????????????? System.out.println(object);
????????????? }
}
總結
- 上一篇: Java学习笔记一和前言
- 下一篇: Java学习笔记三