一、類和對象的定義及關係
1、類是同一類別對象的抽象定義;可以理解爲是某一類具體對象的模子,確定對象將會擁有的特性,包括該類對象具備的屬性和方法。
2、對象是對類的一種具體化的客觀存在,是對類的具體實例化。要創建一個對象,必須基於類,即先要創建可描述該對象的類。
3、創建一個類
publicclass Telphone {
//屬性(成員變量):有什麼
float screen;
float cpu;
float mem;
//方法 :幹什麼
void call(){
System.out.println("Telphone有打電話的功能!");
}
void sendMessage(){
System.out.println("Telphone有發短信的功能!");
}
}
4、創建一個對象 針對上面代碼創建類的創建對象方法
Telphone myphone=new Telphone();
小編相信這裏有很多學習java的朋友,小編整理了一份java方面的學習資料,想要獲取的可以加我的java學習羣的喲,928204055。歡迎愛學習Java的你們。
5、對象的比較:
有兩種方法,分別爲“==”運算符和equals()方法,但兩者有本質的區別: (1)“==”運算符比較的是兩個對象引用的地址是否相同;
(2)equals()方法比較的是兩個對象引用所指的內容是否相同
publicclass ClassCompare {
publicstaticvoid main(String[] args) {
String c1=new String("abc");
String c2=new String("abc");
String c3=c1;
System.out.println("c2==c3的運算結果爲: "+(c2==c3));
System.out.println("c2.equals(c3)的運算結果爲: "+(c2.equals(c3)));
}
}
/*首先爲c1分配一塊內存區域存儲字符串abc,並將c1指向設爲該內存區域
*然後同樣爲c2分配另外一塊內存區域存儲字符串abc,並將c2指向設爲該內存區域
*最後把c3的引用指向c1的指向
*/
6、類的使用 同樣針對上面創建的Telphone類:
publicclass InitialTelphone {
publicstaticvoid main(String[] args) {
// TODO Auto-generated method stub
Telphone phone=new Telphone();
phone.sendMessage();
//這裏各實例屬性值在未初始化賦值的時候默認爲0
phone.screen=5.0f;
phone.cpu=1.4f;
phone.mem=2.0f;10 phone.sendMessage();
//賦值後的顯示
}
}
二、成員變量和局部變量
1、成員變量:在類中定義,用於描述對象的屬性;成員變量可以被本類的方法使用,也可以被其他類的方法使用(依據該成員變量定義時的修飾詞)。
2、局部變量:在類的方法中定義,在方法中臨時保存數據。局部變量只能在當前方法中使用。
3、區別:局部變量的作用域僅限於定義的方法內部;成員變量的作用域在整個類內部都是可見的。Java中會給成員變量賦初始值,但不會給局部變量默認賦初值,所以局部變量在使用前必須要賦值,否則會報錯。
4、同一個方法中不能用同名的局部變量;在不同的方法中,可以有同名局部變量。如果局部變量和成員變量同名,在定義該局部變量的方法內部局部變量有更高的優先級。
publicclass Telphone {
float screen;
float cpu;
float mem;
int var;
void call(){
int localVar=10;
System.out.println(var);
//可以調用類的成員變量var,默認值爲0
System.out.println("Telphone有打電話的功能!");
}
void sendMessage(){
System.out.println(localVar);
//調用call()方法中的局部變量會報錯
System.out.println("Telphone有發短信的功能!");
}
}
三、類的構造方法 1、構造方法是定義在Java類中的一個用來初始化對象的方法。構造方法與類同名,並且沒有返回值。
2、如果類定義中沒有設置無參數的構造方法,則系統會自動生成。
//設置無參數的構造方法
publicclass Telphone {
int sc=10; //定義成員變量
public Telphone(){
System.out.println("無參的構造方法執行了");
}
}
publicclass InitialTelphone {
publicstaticvoid main(String[] args) {
Telphone phone=new Telphone();
//可以看到構造方法執行了
System.out.println(phone.sc);
//可以看到輸出了成員變量sc的值爲10
//當沒有設置無參構造方法時,默認的無參構造方法會使對象擁有成員變量這個實例屬性
//當定義了無參構造方法時,即便沒有顯式的定義成員變量的賦值,對象也會擁有成員變量對應的實例屬性
}
}
3、有參數的構造方法通常只有一個目的:即給成員變量賦初值。
publicclass Telphone {
float screen;
float cpu;
float mem;
public Telphone(){
System.out.println("無參的構造方法執行了");
}
//有參構造方法與無參構造方法同名
public Telphone(float screen,float cpu,float mem){
screen=screen;
cpu=cpu;
mem=mem;
System.out.println("有參的構造方法執行了");
}
}
publicclass InitialTelphone {
publicstaticvoid main(String[] args) {
// TODO Auto-generated method stub
Telphone phone=new Telphone();
Telphone phone1=new Telphone(5.2f,1.4f,2.0f);
}
}
4、當類中定義了構造方法(不管是有參還是無參)時,系統都不會再默認生成無參的構造方法。
5、構造方法的重載:方法名相同,但參數不同的多個構造方法,調用時候會自動判斷、根據不同的參數組合選擇對應的構造方法。如上面代碼中無參和有參的構造方法爲同名,都可以使用。
6、構造方法中一般可以添加保證賦值合理的功能。
publicclass Telphone {
float screen;
float cpu;
float mem;
public Telphone(){
System.out.println("無參的構造方法執行了");
}
public Telphone(float screen,float cpu,float mem){
if(screen<3.5){
System.out.println("賦值不合理,已自動賦值screen爲3.5");
screen=3.5f;
}else{
screen=screen;
}
cpu=cpu;
mem=mem;
System.out.println("有參的構造方法執行了");
}
}
四、靜態變量和靜態方法
1、靜態變量:當同一個類的兩個或者多個對象需要在同一個內存區域共享一個數據時,可以通過定義類的靜態變量來實現。由static修飾的成員變量即是靜態變量。
靜態變量可以通過類名.靜態變量名,也可以通過實例對象名.靜態變量名來訪問,但因爲是同一類所有實例對象的共享,所以一般採用類名.靜態變量名的方式進行訪問。
2、靜態方法:對於方法的靜態修飾,與上述靜態變量規則一致。需要注意:
(1)靜態方法可以直接調用同一個類中的靜態成員(包括靜態變量和靜態方法),但不能直接調用非靜態成員。如果要調用一個類中的非靜態成員,則必須先實例化對象,通過實例對項目名.非靜態成員來調用。
(2)與靜態成員方法不一樣的是在普通成員方法中可以直接訪問同類的非靜態和靜態變量。
publicclass HelloWorld {
String name="imook";
static String hobby="java";
publicvoid show(){
System.out.println(name); //普通成員方法中可以使用非靜態成員
System.out.println(hobby); //也可以使用靜態成員
}
publicstaticvoid main(String[] args) {
System.out.println(name); //錯誤!靜態方法main中不能使用類中的非靜態成員
System.out.println(HelloWolrd.name); //錯誤同上
System.out.println(hobby);
//靜態方法中可以直接調用靜態成員
System.out.println(HelloWorld.hobby);
//也可以通過類名.靜態成員名進行調用 HelloWorld myHelloWorld=new HelloWorld();
//創建一個實例對象
System.out.println(myHelloWorld.name);
//可以通過實例對象名.非靜態成員名進行調用
System.out.println(myHelloWorld.hobby);
//也可以通過實例對象名.靜態成員名進行調用(但不推薦)
HelloWorld.show(); //錯誤!靜態方法main中不能使用類中的非靜態成員
show(); //錯誤同上!
myHelloWorld.show(); }}
3、通過 static 靜態初始化塊:靜態初始化塊只在類加載時執行,且只執行一次,並且靜態初始化塊只能給靜態變量賦值,不能給普通成員變量賦值。
publicclass HelloWorld {
int num1;
int num2;
staticint num3;
public HelloWorld(){
num1=11;
System.out.println("通過構造方法給num1賦初值!");
}
{//通過普通初始化塊給num2賦初值
num2=222;
System.out.println("通過構造方法給num2賦初值!");
}
static{ //通過靜態初始化塊給靜態變量num3賦初值
num3=3333;
System.out.println("通過構造方法給num3賦初值!");
}
publicstaticvoid main(String[] args) {
HelloWorld hello=new HelloWorld(); //構造方法創建類的實例對象hello
/*
* 本次使用構造方法時,程序第一次加載HelloWorld類,會先執行靜態初始化塊,對應給num3賦值3333,並輸出"通過構造方法給num3賦初值!"
* 再執行普通初始化塊,對應給num2賦值222並輸出"通過構造方法給num2賦初值!"
* 最後才執行構造方法,對應給num1賦值11並輸出"通過構造方法給num1賦初值!"
*/
System.out.println("hello的num1:"+hello.num1); //普通成員通過實例對象名訪問
System.out.println("hello的num2:"+hello.num2);
System.out.println("hello的num3:"+num3); //靜態成員直接訪問
HelloWorld hello2=new HelloWorld(); //構造方法創建類的實例對象hello2
/*因靜態初始化塊只在加載時執行一次,所以這次創建對象時不執行靜態初始化塊
* 這裏不執行也是可以理解的,因爲構造方法本身不包括靜態初始化塊,自然不會執行
* 前次創建hello對象時並不是因爲構造方法而去執行靜態初始化塊,而是加載類的時候執行
*/
}
}
五、訪問修飾符和this關鍵字
1、訪問修飾符包括 private\protected\public;其中private範圍對應爲本類;protected 範圍對應本類、子類和同包;public範圍爲本類、子類、同包及其他包。
如果沒有使用訪問修飾符,則默認的訪問範圍是本類和同包。
2、this關鍵字用於引用對象,實質上是對一個對象的引用。有些情況下可以省略this 關鍵字,如下例代碼:
privatevoid setName(String name){
this.name=name; //這裏可以省略this,寫成name=name;
}
在當需要返回一個類的對象時則必須顯式的使用this關鍵字:
/*創建一個返回類型爲Book類的方法 *方法名爲getBook */使用this引用對象將Book類的對象返回public Book getBook(){ return this; }
六、實例
//漢諾塔
publicclass HanoiTower {
publicstaticint moveTimes=0;//設置全類下的靜態變量,計步器
publicstaticvoid moveDish(int num,char a,char b,char c){
if(num==1){
System.out.println("Move dish from "+a+" to "+c);
moveTimes++;
}else{
moveDish(num-1,a,c,b);
//先把num-1個盤子從a通過c放到b;這裏不涉及具體的移動,而是調用方法,所以計步器不加
System.out.println("Move dish from "+a+" to "+c);
//然後再把a上剩餘的最後一個移動到c,這裏涉及到具體的移動步驟,所以計步器加1
moveTimes++;
moveDish(num-1,b,a,c);
//最後解決b上的num-1個盤子,通過a再移動到c
}
}
publicstaticvoid main(String[] args) {
// TODO Auto-generated method stub
int numTimes=12;
moveDish(numTimes,'A','B','C');
System.out.println("總共移動了"+moveTimes+"次!");
}
}