Java學習日記基礎篇(四)——類,對象之成員變量,成員方法,構造方法


面向對象(Object Oriented)

一、面向對象雜談

面向對象(Object Oriented),我的翻譯是以物體為目標的,就是說編程的時候是建立一個物體,然后對這個物體進行操作。

Java語言是面向對象的(有95%都是面向對象的內容),C++是基於對象的

計算機語言的發展向接近人的思維方式演變

  • 匯編語言        [面向機器]
  • c語言           [面向過程]
  • java語言        [面向對象]
  • spring         [面向切面]———— 把類在進行切分

二、類和對象的關系————(類class,對象object)

三、創建一個簡單的類

class Cat		//類名首字母要大寫
{
	int age;
	String name;
	String color;
}

四、類和對象的區別和聯系

  • 類是抽象的,概念的,代表一類事物——只能找到人,找不到人類
  • 對象是具體的,實際的,代表一個具體的事物
  • 類是對象的模板,對象是類的一個個體,實例  

五、定義一個全面的類 —— 一個全面的類定義比較復雜

package 包名;
class 類名 extends 父類 implements
接口名{
    成員變量;
    構造方法;
    成員方法;
}

類——類的成員變量

成員變量是類的一個組成部分,一般是基本數據類習慣,也可是引用類型。比如我們前面定義貓類的 int age 就是實例變量,屬於成員變量。

實例變量、類變量、常量都是屬於成員變量的,成員變量又被稱為全局變量

   引用類型是什么呢?

    假如說貓要有一個主人,這個主人也有年齡,身高等信息

    通俗來講就是類指向另外一個類,叫做引用,例如:

class Cat
{
	int age;
	String name;
	String color;                    //其實它也是一個引用類型,Java中String本身就是一個類
	    
	Myster myMaster;            //這就是一個引用類型
}
class Master
{
	int age;
	String name;
	String address;
}    

類與對象

一、創建對象的兩種方法

  • 1、先聲明再創建——沒人用了! 
  • 2、一步到位法  
1、先聲明再創建
	對象聲明:類名  對象名
	對象創建:對象名 = new 類名()
	
	Cat cat1=new Cat();

2、一步到位法
	類名 對象名 = new 類名();
	
	Cat cat1;
	cat1 = new Cat;

Java對象及其引用詳解

二、如何 訪問/使用 對象的成員變量

對象名.變量名

cat1.age=3;
cat1.name="小白";
cat1.color="黃色";

思考:

public class Demo6
{
	public static void main(String []args)
	{
		Person a=new Person();
		a.age = 10;
		a.name="小明";
		
		Person b;
		b = a;
		//問b.age是多少??
		System.out.println("b.age="+b.age);
		
		Person c;
		c = a;
		c.age = 9;		//問改變c.age的值,a.age和b.age的值會變嗎??
		System.out.println("a.age="+a.age);
		System.out.println("b.age="+b.age);
		System.out.println("c.age="+c.age);
		
	}
}
class Person
{
	int age;
	String name;
}


運行結果:
D:\myJavaDemo>java Demo6
b.age=10
a.age=9
b.age=9
c.age=9

原理:創建對象a的時候開辟了一塊內存,之后相當於讓b和c的地址也指向了那塊地址,所以對c.age進行操作時,a.age和b.age的值也跟着變化了

三、對象在內存中的存在形式

我們用new這個方法創造的對象,放到了內存中

了解一下:java的垃圾回收機制,如果對象沒有人指向,就認為這個對象是垃圾,在適當的時候去回收。

類的成員方法

在某些情況下我們需要定義類的成員方法。比如人類:

  • 除了有一些屬性外(例如:成員變量表示的年齡,姓名等)
  • 我們人類還有一些行為比如:可以說話,跑步
  • 通過學習我們還可以做算術題
  • 這時就要用成員方法才能完成

現在我們來對Person類完善

  1. 添加speak  成員方法,輸出——我是一個好人
  2. 添加jisuan  成員方法,可以計算從1+..+1000的結果
  3. 修改jisuan  成員方法,該方法可以接受一個數n,計算從1+..+n的結果
  4. 添加add  成員方法, 可以計算兩個數的和

成員方法的定義

成員方法也叫成員函數

public 返回數據類型 方法名 (參數列表)
{
	語句;   //函數(方法)主體
}


/*
1. 參數列表: 表示成員函數輸入
2. 數據類型(返回類型): 表示成員函數輸出
3. 函數主體: 表示為了實現某一功能代碼塊
*/

speak成員方法

 1 public class Demo6
 2 {
 3     public static void main(String []args)
 4     {
 5         //使用成員方法
 6         Person p1=new Person();
 7         p1.speak();            //調用speak方法
 8     }
 9 }
10 class Person
11 {
12     int age;
13     String name;
14 
15     //定義成員方法
16     public void speak()
17     {
18         System.out.println("我是一個好人");
19     }
20     
21 }
speak成員方法(函數)

jisuan成員方法  

注:類名的首字母是大寫的,方法名的首字母是小寫的,常用的命名方法有

  • 駝峰法(匈牙利法)——myCry
  • 下划線法——my_cry
 1 public class Demo6
 2 {
 3     public static void main(String []args)
 4     {
 5         //使用成員方法
 6         Person p1=new Person();
 7         p1.jiSuan();            //調用jisuan方法
 8     }
 9 }
10 class Person
11 {
12     int age;
13     String name;
14     
15     //計算方法
16     public void jiSuan()
17     {
18         int result = 0;
19         for (int i=1;i<=1000;i++)
20         {
21             result+=i;
22         }
23         //輸出結果
24         System.out.println(result);
25     }
26     
27 }
jisuan成員方法(函數)

 強換版計算成員方法

 1 public class Demo6
 2 {
 3     public static void main(String []args)
 4     {
 5         //使用成員方法
 6         Person p1=new Person();
 7         p1.jiSuan();
 8         p1.jiSuan(8);            //調用jisuan方法
 9     }
10 }
11 class Person
12 {
13     int age;
14     String name;
15     //jisuan成員方法
16     public void jiSuan()
17     {
18         int result = 0;
19         for (int i=1;i<=1000;i++)
20         {
21             result+=i;
22         }
23         //輸出結果
24         System.out.println(result);
25     }
26     
27     //帶參數的成員方法
28     public void jiSuan(int n)
29     {
30         int result = 0;
31         for (int i=1;i<=n;i++)
32         {
33             result+=i;
34         }
35         //輸出結果
36         System.out.println(result);
37     }    
38 }
帶參數的成員方法(函數)

  從中可以看出兩個問題,

  • 第一個是:定義兩個成員方法時都使用了result這個變量,但不會引起沖突,因為作用域不同
  • 第二個是:兩個成員方法的名字相同都是 jiSuan ,但不會報錯,因為區別是一個帶參數,另一個不帶

函數調用的原理圖

  注意:如果語句三也調用了一個函數,則它也會開辟一個新的函數棧,這也解釋了為什么兩個函數中都有result

add成員方法

 1 public class Demo6
 2 {
 3     public static void main(String []args)
 4     {
 5         //使用成員方法
 6         Person p1=new Person();
 7         p1.jiSuan();
 8         p1.jiSuan(20);
 9         p1.add(20,35);
10     }
11 }
12 class Person
13 {
14     int age;
15     String name;
16     
17     //jisuan成員方法
18     public void jiSuan()
19     {
20         int result = 0;
21         for (int i=1;i<=1000;i++)
22         {
23             result+=i;
24         }
25         //輸出結果
26         System.out.println(result);
27     }
28     
29     //帶參數的成員方法
30     public void jiSuan(int n)
31     {
32         int result = 0;
33         for (int i=1;i<=n;i++)
34         {
35             result+=i;
36         }
37         //輸出結果
38         System.out.println(result);
39     }
40     
41     //計算兩個數的和
42     public void add(int num1,int num2)
43     {
44         int result = 0;
45         result = num1+num2;
46         System.out.println(result);
47     }    
48 }
add成員方法(函數)

把add成員方法也改名為jiSuan

 1 /*
 2 作者:侯召暉
 3 日期:28.9.6
 4 功能:找貓問題
 5 */
 6 public class Demo6
 7 {
 8     public static void main(String []args)
 9     {
10         //使用成員方法
11         Person p1=new Person();
12         p1.jiSuan();
13         p1.jiSuan(20);
14         p1.jiSuan(20,35);
15     }
16 }
17 class Person
18 {
19     int age;
20     String name;
21     
22     //jisuan成員方法
23     public void jiSuan()
24     {
25         int result = 0;
26         for (int i=1;i<=1000;i++)
27         {
28             result+=i;
29         }
30         //輸出結果
31         System.out.println(result);
32     }
33     
34     //帶參數的成員方法
35     public void jiSuan(int n)
36     {
37         int result = 0;
38         for (int i=1;i<=n;i++)
39         {
40             result+=i;
41         }
42         //輸出結果
43         System.out.println(result);
44     }
45     
46     //計算兩個數的和
47     public void jiSuan(int num1,int num2)
48     {
49         int result = 0;
50         result = num1+num2;
51         System.out.println(result);
52     }    
53 }
三個方法都是jiSuan,但參數分別為0個1個2個

帶返回結果的成員方法

 1 public class example1
 2 {
 3     public static void main(String []args)    
 4     {
 5         Person p1 = new Person();
 6         int res = p1.add(12,24);
 7         System.out.println(res);
 8         System.out.println(p1.add(12,24));
 9     }
10 }
11 
12 
13 class Person
14 {
15     //返回類型一定要和public后的返回數據類型一致
16     public int add(int num1,int num2)
17     {
18         return num1 + num2;        //返回結果
19     }
20 }
帶返回值的成員方法(函數)

  注意:

  • 兩個成員方法如果只有返回類型不同的話,是不能通過編譯的
  • 不能將空類型進行賦值
  • returen 的作用是把表達式的值返回給注調用方法,當然也可以返回

類成員方法的聲明

類成員方法——聲明

public  int  test ( int a );
//方法聲明

方法聲明和定義的區別是,方法聲明沒有函數體,聲明只是說明有這個函數

//聲明的格式
 public      int      test      (int  a);
訪問修飾符 數據類型 函數名 (參數列表);

 類的成員方法的——特別說明

一、方法的參數列表可以是多個,並且參數列表的類型也可以是任意的

二、調用某個成員方法的時候,傳入的實參要和形參的類型相匹配

例如:

 1 public class example1
 2 {
 3     public static void main(String []args)    
 4     {
 5         Person p1 = new Person();
 6         System.out.println(p1.add(2,2.3,4.5));
 7     }
 8 }
 9 
10 
11 class Person
12 {
13     //public double add(int num1.float num2,float num3)
14     //會報錯,因為穿的參數是2,2.3和4.5,小數默認是double類型,損失精度報錯
15     public double add(int num1,double num2,double num3)
16     {
17         return num1+num2+num3;
18     }
19 }
參數列表是多個不同的參數

 練習:

  • 1、編寫一個成員函數,從鍵盤輸入一個整數(1 - 9),打印出對應的乘法表
  • 2、編寫函數,使給定的一個二維數組(3 x 3)轉置(橫坐標和縱坐標對調)
    1   2   3           ——>        1   4   7
    4   5   6           ——>        2   5   8
    7   8   9           ——>        3   6   9
  • 3、設計計算機類
  • 4、模擬一下馬里奧

 

構造方法(函數)

構造方法使類的一種特殊方法,它的主要作用是完成對新對象的初始化(闖進新對象時,給新對象幾個默認值)。它有幾個特點

  1. 方法名和類名相同
  2. 沒有返回值
  3. 在創建一個類的新對象是,系統會自動調用該類的構造方法完成對新對象的初始化
 1 public class example1
 2 {
 3     public static void main(String []args)    
 4     {
 5         //Person p = new Person();
 6         //在加入了構造方法后,不加參數的聲明會報錯
 7         Person p1 = new Person(1,"rotk");
 8         System.out.println(p1.age);
 9         System.out.println(p1.name);
10     }
11 }
12 
13 
14 class Person
15 {
16     int age;
17     String name;
18     public Person(int age,String name)
19     {
20         age=age;    //前面是成員屬性,后面是傳進來的值
21         name=name;
22     }
23     
24 }
構造方法

注意:一個類可以指定多個不同的構造方法,例如

 1 public class example1
 2 {
 3     public static void main(String []args)    
 4     {
 5         //因為有兩個構造方法,所以調用哪個構造方法是由傳遞幾個參數決定的
 6         Person p1 = new Person(7);
 7         Person p2 = new Person(2,"小白");
 8     }
 9 }
10 
11 
12 class Person
13 {
14     int age;
15     String name;
16     //構造方法一
17     public Person(int age,String name)
18     {
19         System.out.println("我是構造一");
20         age=age;    //前面是成員屬性,后面是傳進來的值
21         name=name;
22     }
23     //構造方法二
24     public Person(int age)
25     {
26         System.out.println("我是構造二");
27         age = age;
28     }
29     
30 }
類中有兩個構造方法

默認構造方法

如果程序員沒有定義構造方法,系統會自動生成一個默認的構造方法。

//Person類中的默認構造方法
Person ()
{
	//nothing	
}

//當創建一個Person對象時 Person perl=new Person;
//默認的構造方法(函數)就會被自動調用

如果程序員寫了一個構造方法后,這個默認的構造方法就沒了,但可以自己把這個默認構造方法寫回來,就可以不加參數創建對象了

構造方法小節  

  1. 構造方法名和類名相同,如果不相同就不是構造方法
  2. 構造方法沒有返回值,如果有返回值就不是構造方法
  3. 主要作用是完成新對象的初始化
  4. 在創建新對象時,系統自動的調用該類的構造方法
  5. 一個類可以有多個構造方法,但是不能完全相同
  6. 每個類都有一個默認的構造方法

一般來說構造方法的作用就是去初始化你的成員變量,不干別的事

 


免責聲明!

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



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