
這節開始我們將進入類與物件的學習從這之后的難度會直線飆升,希望大家可以好好理解,并運用起來,好啦廢話不多說,開始我們類與物件的學習
類與物件
- 1.什么是類和物件呢?
- 2. 類和類的實體化
- 3.類的成員
- 3.1欄位/屬性/成員變數
- 3.1.1認識 null
- 3.1.2欄位的初始化
- 3.2 方法 (method)
- 3.3 static 關鍵字
- 4.1 private實作封裝
- 4.2 getter和setter方法
1.什么是類和物件呢?
想必大家都學過c語言把,c語言是一種面向程序的語言,就比如你有一個冰箱,我們要放我們喜歡的肥宅快樂水,我們要分三步吧,第一步,先打開冰箱門,第二步把快樂水放進去,第三步關閉冰箱門,可是java中,我們是面向物件的,冰箱它是一個物件
所以只要操作冰箱所具備的功能,都要定義在冰箱中,打開,放東西,關閉全是我們對它的操作,(如果這塊不理解那就往下看,下面我們會通過例子讓你感覺到區別)
2. 類和類的實體化
類就是一類物件的統稱,
物件就是這一類具體化的一個實體,簡單的例子:我們做月餅的模子就是一個類,而通過這個模子可以做出月餅,那么在這個例子當中,類就是那個模子,而月餅就是那個物件,所以月餅就是一個物體,一個模子可以實體化無數個物件,
實作代碼如下`
// 創建類class <class_name>{
field;//成員屬性
method;//成員方法
}
// 實體化物件
<class_name> <物件名> = new <class_name>();
具體例子:
class Person {
public int age;
//成員屬性 實體變數
public String name;
public String sex;
public void eat() {
//成員方法
System.out.println("吃飯!");
}
public void sleep() {
System.out.println("睡覺!");
}
}
除此之外我們可以定義多個物件
public class Main{
public static void main(String[] args) {
Person person = new Person();//通過new實體化物件
person.eat();//成員方法呼叫需要通過物件的參考呼叫
person.sleep(); //產生物件 實體化物件
Person person2 = new Person();
Person person3 = new Person();
}
}
3.類的成員
類的成員可以包含以下:欄位、方法、代碼塊、內部類和介面等,
3.1欄位/屬性/成員變數
在類中, 但是方法外部定義的變數. 這樣的變數我們稱為 “欄位” 或 “屬性” 或 “成員變數”(三種稱呼都可以, 一般不會嚴格區分).用于描述一個類中包含哪些資料.
class Person {
public String name; // 欄位
public int age;
}
class Test {
public static void main(String[] args) {
Person person = new Person();
System.out.println(person.name);
System.out.println(person.age);
}
}// 執行結果null0
默認值規則
對于各種數字型別, 默認值為 0.
對于 boolean 型別, 默認值為 false.
對于參考型別(String, Array,
以及自定制類), 默認值為 null
3.1.1認識 null
null 在 Java 中為 “空參考”, 表示不參考任何物件. 類似于 C 語言中的空指標. 如果對 null 進行 . 操作就會引發例外.
class Person {
public String name;
public int age;
}
class Test {
public static void main(String[] args) {
Person person = new Person();
System.out.println(person.name.length());// 獲取字串長度
}
}
// 執行結果Exception in thread "main" java.lang.NullPointerException at Test.main(Test.java:9)
上述情況我們就對空指標進行了操作,導致出現了空指標例外,
3.1.2欄位的初始化
class Person {
public String name = "大傻";
public int age = 18;
}
class Test {
public static void main(String[] args) {
Person person = new Person();
System.out.println(person.name);
System.out.println(person.age);
}
}
// 執行結果
大傻
18
3.2 方法 (method)
就是我們曾經講過的方法.用于描述一個物件的行為.就好比上面我們對冰箱的三個操作,
class Person {
public int age = 18;
public String name = "張三";
public void show() {
System.out.println("我叫" + name + ", 今年" + age + "歲");
}
}
class Test {
public static void main(String[] args) {
Person person = new Person();
person.show();
}
}
//
執行結果
我叫張三, 今年18歲
我們再定義另外一個物件
Person person2 = new Person();
person2.name = "李四";
person2.age = 20;person2.show()
// 執行結果
我叫李四, 今年20歲
還有一種方法是構造方法,在實體化物件的時候會被自動呼叫到的方法, 方法名字和類名相同, 用于物件的初始化.雖然我們前面已經能將屬性就地初始化, 但是有些時候可能需要進行一些更復雜的初始化邏輯, 那么就可以使用構造方法.我們學了鏈表就可以知道啦,鏈表就在類和物件的下一節,
3.3 static 關鍵字
1、修飾屬性
2、修飾方法
3、代碼塊(本課件中會介紹)
4、修飾類(后面講內部類會講到)
(a) 修飾屬性,Java靜態屬性和類相關, 和具體的實體無關. 換句話說, 同一個類的不同實體共用同一個靜態屬性,比如我們定義了冰箱類然后每個冰箱的都可以用,
class TestDemo{
public int a;
public static int count;
}
public class Main{
public static void main(String[] args) {
TestDemo t1 = new TestDemo();
t1.a++;
TestDemo.count++;
System.out.println(t1.a);
System.out.println(TestDemo.count);
System.out.println("============");
TestDemo t2 = new TestDemo();
t2.a++;
TestDemo.count++;
System.out.println(t2.a);
System.out.println(TestDemo.count);
}
}
以上代碼的結果是:
1
1
============
1
2
由此我們可以看出來被static修飾的成員變數不會跟著成員的名字變化,是唯一的
,無論哪個物件呼叫這個物件都是一樣的,
count被static所修飾,所有類共享,且不屬于物件,訪問方式為:類名 . 屬性,
(b) 修飾方法
如果在任何方法上應用static關鍵字,此方法稱為靜態方法,靜態方法屬于類,而不屬于類的物件,可以直接呼叫靜態方法,而無需創建類的實體,靜態方法可以訪問靜態資料成員,并可以更改靜態資料成員的值,
class TestDemo{
public int a;
public static int count;
public static void change() {
count = 100;
//a = 10; error 不可以訪問非靜態資料成員
}
}
public class Main{
public static void main(String[] args) {
TestDemo.change();
//無需創建實體物件 就可以呼叫
System.out.println(TestDemo.count);
}
}
我們仔細觀察這個main里面的方法他沒有創建一個新的物件,而是直接使用,
4.1 private實作封裝
private/ public 這兩個關鍵字表示 “訪問權限控制” .
被 public 修飾的成員變數或者成員方法, 可以直接被類的呼叫者使用.
被 private 修飾的成員變數或者成員方法, 不能被類的呼叫者使用.
class Person {
private String name = "張三";
private int age = 18;
public void show() {
System.out.println("我叫" + name + ", 今年" + age + "歲");
}
}
class Test {
public static void main(String[] args) {
Person person = new Person();
person.show();
}
}
// 執行結果 我叫張三, 今年18歲
此時欄位已經使用 private 來修飾. 類的呼叫者(main方法中)不能直接使用. 而需要借助 show 方法. 此時類的使用者就不必了解 Person 類的實作細節.
同時如果類的實作者修改了欄位的名字, 類的呼叫者不需要做出任何修改(類的呼叫者根本訪問不到 name, age這樣的欄位).
4.2 getter和setter方法
由于我們的成員變數被封裝了,我們不能給封裝的變數賦值,所以有了getter和setter方法,
class Person {
private String name = "張三";
private int age = 18;
public void show() {
System.out.println("我叫" + name + ", 今年" + age + "歲");
}
}
class Test {
public static void main(String[] args) {
Person person = new Person();
person.age = 20;
person.show();
}
}
// 編譯出錯 Test.java:13: 錯誤: age可以在
Person中訪問private person.age = 20; ^ 1 個錯誤
此時如果需要獲取或者修改這個 private 屬性, 就需要使用 getter / setter 方法
class Person {
private String name;
//實體成員變數 private int age;
public void setName(String name){
//name = name;//不能這樣寫 this.name = name;//this參考,表示呼叫該方法的物件 }
public String getName(){
return name;
}
public void show(){
System.out.println("name: "+name+" age: "+age);
}
}
public static void main(String[] args) {
Person person = new Person();
person.setName("caocao");
String name = person.getName();
System.out.println(name);
person.show();
}
// 運行結果 caocao name: caocao age: 0
getName 即為 getter 方法, 表示獲取這個成員的值.
setName 即為 setter 方法, 表示設定這個成員的值.
當set方法的形參名字和類中的成員屬性的名字一樣的時候,如果不使用this, 相當于自賦值. this 表示當前實體的參考.
不是所有的欄位都一定要提供 setter / getter 方法, 而是要根據實際情況決定提供哪種方法.在 IDEA 中可以使用 alt + insert (或者 alt + F12) 快速生成 setter / getter 方法.
在 VSCode 中可以使用滑鼠右鍵選單 -> 源代碼操作 中自動生成 setter / getter 方法.

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/356977.html
標籤:java
