#1024程序員節(jié)|用代碼,改變世界#
Java類與對(duì)象
大家好,我是曉星航。今天我們將為大家講解的是我們Java類與對(duì)象的概念及相關(guān)用法!
1. 類與對(duì)象的初步認(rèn)知
面向過(guò)程:
面向?qū)ο螅?/p>
2. 類和類的實(shí)例化
類就是一類對(duì)象的統(tǒng)稱。對(duì)象就是這一類具體化的一個(gè)實(shí)例。
總的來(lái)說(shuō):類相當(dāng)于一個(gè)模板,對(duì)象是/由模板產(chǎn)生的樣本。一個(gè)類,可以產(chǎn)生無(wú)數(shù)的對(duì)象。
基本語(yǔ)法:
// 創(chuàng)建類
class {
field;//成員屬性
method;//成員方法
}
// 實(shí)例化對(duì)象
<對(duì)象名> = new ();
class為定義類的關(guān)鍵字,為類的名字實(shí)例名稱有什么用,{}中為類的主體。
類中的元素稱為:成員屬性。類中的函數(shù)稱為:成員方法。
示例:
class Person {
public int age;//成員屬性 實(shí)例變量
public String name;
public String sex;
public void eat() {//成員方法
System.out.println("吃飯!");
}
public void sleep() {
System.out.println("睡覺(jué)!");
}
}
類的實(shí)例化:用類類型創(chuàng)建對(duì)象的過(guò)程,稱為類的實(shí)例化
類只是一個(gè)模型一樣的東西實(shí)例名稱有什么用,限定了類有哪些成員.
一個(gè)類可以實(shí)例化出多個(gè)對(duì)象,實(shí)例化出的對(duì)象 占用實(shí)際的物理空間,存儲(chǔ)類成員變量
做個(gè)比方。類實(shí)例化出對(duì)象就像現(xiàn)實(shí)中使用建筑設(shè)計(jì)圖建造出房子,類就像是設(shè)計(jì)圖,只設(shè)計(jì)出需要什么東西,但是并沒(méi)有實(shí)體的建筑存在,同樣類也只是一個(gè)設(shè)計(jì),實(shí)例化出的對(duì)象才能實(shí)際存儲(chǔ)數(shù)據(jù),占用物理空間
class Person {
public int age;//成員屬性 實(shí)例變量
public String name;
public String sex;
public void eat() {//成員方法
System.out.println("吃飯!");
}
public void sleep() {
System.out.println("睡覺(jué)!");
}
}
public class TestDemo {
public static void main(String[] args) {
Person person = new Person();//通過(guò)new實(shí)例化對(duì)象
person.eat();//成員方法調(diào)用需要通過(guò)對(duì)象的引用調(diào)用
person.sleep();
//產(chǎn)生對(duì)象 實(shí)例化對(duì)象
Person person2 = new Person();
Person person3 = new Person();
}

}
3. 類的成員
類的成員可以包含以下:字段、方法、代碼塊、內(nèi)部類和接口等。且分為普通的成員變量( int age)和靜態(tài)成員變量( int age)
3.1 字段/屬性/成員變量
在類中, 但是方法外部定義的變量. 這樣的變量我們稱為 “字段” 或 “屬性” 或 “成員變量”(三種稱呼都可以, 一般不會(huì)嚴(yán)格區(qū)分).
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);
}
}
簡(jiǎn)單來(lái)說(shuō) 字段=屬性=成員變量 他們是方法外部定義的“變量”。
注意事項(xiàng):
使用 . 訪問(wèn)對(duì)象的字段.
“訪問(wèn)” 既包含讀, 也包含寫.
對(duì)于一個(gè)對(duì)象的字段如果沒(méi)有顯式設(shè)置初始值, 那么會(huì)被設(shè)置一個(gè)默認(rèn)的初值.
默認(rèn)值規(guī)則:
對(duì)于各種數(shù)字類型, 默認(rèn)值為 0.
對(duì)于 類型, 默認(rèn)值為 false.
對(duì)于引用類型(, Array, 以及自定制類), 默認(rèn)值為 null
3.1.1認(rèn)識(shí) null
null 在 Java 中為 “空引用”, 表示不引用任何對(duì)象. 類似于 C 語(yǔ)言中的空指針. 如果對(duì) null 進(jìn)行 . 操作就會(huì)引發(fā)異常.
3.1.2字段就地初始化
class Person {
public String name = "張三";
public int age = 18;
}
public class TestDemo {
public static void main(String[] args) {
Person person = new Person();
System.out.println(person.name);
System.out.println(person.age);
}
}
3.2 方法 ()
就是我們?cè)?jīng)講過(guò)的方法.
用于描述一個(gè)對(duì)象的行為.
class Person {
public int age = 18;
public String name = "張三";
public void show() {
System.out.println("我叫" + name + ", 今年" + age + "歲");
}
}
public class TestDemo {

public static void main(String[] args) {
Person person = new Person();
person.show();
}
}
這樣的 show 方法是和 實(shí)例相關(guān)聯(lián)的. 如果創(chuàng)建了其他實(shí)例, 那么 show 的行為就會(huì)發(fā)生變化
class Person {
public int age = 18;
public String name = "張三";
public void show() {
System.out.println("我叫" + name + ", 今年" + age + "歲");
}
}
public class TestDemo {
public static void main(String[] args) {
Person person2 = new Person();
person2.name = "李四";
person2.age = 20;
person2.show();
}
}
3.3 關(guān)鍵字
1、修飾屬性
2、修飾方法
3、代碼塊(本課件中會(huì)介紹)
4、修飾類(后面講內(nèi)部類會(huì)講到)
a) 修飾屬性,Java靜態(tài)屬性和類相關(guān), 和具體的實(shí)例無(wú)關(guān). 換句話說(shuō), 同一個(gè)類的不同實(shí)例共用同一個(gè)靜態(tài)屬性.
class TestDemo1{
public int a;
public static int count;
}
public class TestDemo {
public static void main(String[] args) {
TestDemo1 t1 = new TestDemo1();
t1.a++;
TestDemo1.count++;
System.out.println(t1.a);
System.out.println(TestDemo1.count);
System.out.println("============");
TestDemo1 t2 = new TestDemo1();
t2.a++;
TestDemo1.count++;
System.out.println(t2.a);
System.out.println(TestDemo1.count);
}
}
示例代碼內(nèi)存解析:count被所修飾,所有類共享。且不屬于對(duì)象,訪問(wèn)方式為:類名 . 屬性。
t1和t2在堆上的地址調(diào)用不一樣 而在堆調(diào)用方法區(qū)時(shí)確實(shí)調(diào)用的同一個(gè)對(duì)象count
相當(dāng)于t2中的count還是t1中的count。
b) 修飾方法
如果在任何方法上應(yīng)用 關(guān)鍵字,此方法稱為靜態(tài)方法。
class TestDemo{
public int a;
public static int count;
public static void change() {
count = 100;
//a = 10; error 不可以訪問(wèn)非靜態(tài)數(shù)據(jù)成員
}
}
public class Main{
public static void main(String[] args) {
TestDemo.change();//無(wú)需創(chuàng)建實(shí)例對(duì)象 就可以調(diào)用
System.out.println(TestDemo.count);
}
}
輸出結(jié)果:100
注意事項(xiàng):
1.在類的成員方法中不可以用來(lái)創(chuàng)建變量,只能在類里面定義和方法外部定義。
例如:
class Person {
public void sleep() {
static int size = 0;//error
System.out.println("睡覺(jué)!");
}
}
3.4方法調(diào)用易錯(cuò)區(qū)分
靜態(tài)變量可以不用實(shí)例化(new),可以直接通過(guò)類.來(lái)進(jìn)行操作:
class TestDemo1{
public int a;
public static int count;
}
public class TestDemo {
public static void main(String[] args) {
TestDemo1.count = 10;
System.out.println(TestDemo1.count);
}
}
在類中普通方法的內(nèi)部 不能夠定義靜態(tài)的變量。
在普通方法內(nèi)部可以調(diào)用靜態(tài)方法
在靜態(tài)方法內(nèi)部可以調(diào)用靜態(tài)方法 但是不可以調(diào)用普通方法
4. 封裝
什么叫封裝?
在我們寫代碼的時(shí)候經(jīng)常會(huì)涉及兩種角色: 類的實(shí)現(xiàn)者和類的調(diào)用者.
封裝的本質(zhì)就是讓類的調(diào)用者不必太多的了解類的實(shí)現(xiàn)者是如何實(shí)現(xiàn)類的, 只要知道如何使用類就行了.
這樣就降低了類使用者的學(xué)習(xí)和使用成本, 從而降低了復(fù)雜程度.
4.1 實(shí)現(xiàn)封裝
/ 這兩個(gè)關(guān)鍵字表示 “訪問(wèn)權(quán)限控制” .
被 修飾的成員變量或者成員方法, 可以直接被類的調(diào)用者使用.
被 修飾的成員變量或者成員方法, 不能被類的調(diào)用者使用.
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();
}
}
此時(shí)字段已經(jīng)使用 來(lái)修飾. 類的調(diào)用者(main方法中)不能直接使用. 而需要借助 show 方法. 此時(shí)類的使用者就不必了解 類的實(shí)現(xiàn)細(xì)節(jié).
同時(shí)如果類的實(shí)現(xiàn)者修改了字段的名字, 類的調(diào)用者不需要做出任何修改(類的調(diào)用者根本訪問(wèn)不到 name, age這樣的字段).
注意事項(xiàng):
不光能修飾字段, 也能修飾方法
通常情況下我們會(huì)把字段設(shè)為 屬性, 但是方法是否需要設(shè)為 , 就需要視具體情形而定. 一般我們希望一個(gè)類只提供 “必要的” 方法, 而不應(yīng)該是把所有的方法都無(wú)腦設(shè)為 .
系統(tǒng)自動(dòng)封裝方法:
結(jié)果演示:
4.2 和方法
當(dāng)我們使用 來(lái)修飾字段的時(shí)候, 就無(wú)法直接使用這個(gè)字段了.
而是要使用set和get方法來(lái)引用他
class Person {
private String name;//實(shí)例成員變量
private int age;
public void setName(String name){
//name = name;//不能這樣寫
this.name = name;//this引用,表示調(diào)用該方法的對(duì)象
}
public String getName(){
return name;
}
public void show(){
System.out.println("name: "+name+" age: "+age);
}
}
public class TestDemo {
public static void main(String[] args) {
Person person = new Person();//類的實(shí)例化
person.setName("caocao");//通過(guò)setName調(diào)用類中private中的name
String name = person.getName();//創(chuàng)建字符串變量name賦值為getName中獲取的值 多余
System.out.println(name); //多余可省
person.show();//調(diào)用類中的方法
}
}
最簡(jiǎn)寫法:
即在主函數(shù)main這里我們用.();來(lái)引用我們的類
用.show來(lái)輸出我們的結(jié)果
注意事項(xiàng):
即為 方法, 表示獲取這個(gè)成員的值.
即為方法, 表示設(shè)置這個(gè)成員的值 .
當(dāng)set方法的形參名字和類中的成員屬性的名字一樣的時(shí)候,如果不使用this, 相當(dāng)于自賦值. this 表示當(dāng)前實(shí)例的引用.
不是所有的字段都一定要提供 / 方法, 而是要根據(jù)實(shí)際情況決定提供哪種方法.
在 IDEA 中可以使用 alt + (或者 alt + F12) 快速生成 / 方法. 在 中可以使用鼠標(biāo)右鍵菜單 -> 源代碼操作 中自動(dòng)生成 / 方法.
5.構(gòu)造方法 5.1 基本語(yǔ)法
每一個(gè)類必須有一個(gè)構(gòu)造方法 如果我們沒(méi)寫 idea會(huì)自動(dòng)幫我們寫一個(gè)不帶參數(shù)的構(gòu)造方法
構(gòu)造方法是我們調(diào)用類 并使用它更方便了
class Person {
private String name;//實(shí)例成員變量
private int age;
private String sex;
//默認(rèn)構(gòu)造函數(shù) 構(gòu)造對(duì)象
public Person() {
this.name = "caocao";
this.age = 10;
this.sex = "男";
}
//帶有3個(gè)參數(shù)的構(gòu)造函數(shù) 注意這里時(shí)public 不是private
public Person(String name,int age,String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
public void show(){
System.out.println("name: "+name+" age: "+age+" sex: "+sex);
}
我們從:
Person p1 = new Person();//調(diào)用不帶參數(shù)的構(gòu)造函數(shù) 如果程序沒(méi)有提供會(huì)調(diào)用不帶參數(shù)的構(gòu)造函數(shù)
p1.name = "qiqi";
p1.age = 18;
p1.sex = "女";
p1.show();
到
Person p2 = new Person3("zhangfei",80,"男");//調(diào)用帶有3個(gè)參數(shù)的構(gòu)造函數(shù)
p2.show();
對(duì)比兩個(gè)代碼內(nèi)容可以看出,我們用構(gòu)造方法來(lái)調(diào)用我們的類并賦值比我們不使用構(gòu)造方法來(lái)賦值要方便的多。
構(gòu)造方法是一種特殊方法, 使用關(guān)鍵字new實(shí)例化新對(duì)象時(shí)會(huì)被自動(dòng)調(diào)用, 用于完成初始化操作.
分辨是普通方法還是構(gòu)造方法:
構(gòu)造方法就是方法里面用了**this.**來(lái)賦初值且方法名稱和類相同(用的是) 構(gòu)造方法可以無(wú)參數(shù) 但是一旦有一個(gè)構(gòu)造方法有了參數(shù) 那么其余的構(gòu)造方法就至少得有一個(gè)參數(shù)32
new 執(zhí)行過(guò)程:
為對(duì)象分配內(nèi)存空間
調(diào)用對(duì)象的構(gòu)造方法
語(yǔ)法規(guī)則:
1.方法名稱必須與類名稱相同