一、類與對象的概念
1.類
- 類是對具有共性事物的抽象描述,是在概念上的一個定義,是人類實際抽象出來的結果,實際上是不存在的。比如(成績管理系統:學生類、班級類、課程類、成績類,這是人類通過智慧定義的名字,是抽象的名字)
2.對象
//某一個類的對象
學生---jack
班級---3年2班
課程---J2SE
成績---jack成績
- 以上“jack”、“3年2班”、“J2SE”和“jack成績”他們是具體存在的,稱爲對象,也叫實例。也就是說一個類的具體化或者說成實例化(學生類對應jack對象,班級類對應3年2班對象,課程類對應J2SE對象,成績類對應jack成績對象),就是對象或者說是實例
- 對象與對象之間具有共同特徵,每個特徵對應的具體值不一樣(比如,姚明和身高正常的人,有高度這個共同特徵,高度所對應的具體值不一樣,所以要想訪問高度這個屬性,不能通過人這個類直接去訪問,而是通過先有對象才能訪問高度這個屬性)
3.總結
- 一般來說,從類到對象是實例的過程,從對象到類的過程是抽象的過程
- 因爲一波對象的存在,這一波對象的共同特徵進行抽象這種概念叫做類
- 類經過實例化、經過具體化就形成了對象,對象是實際存在的個體
二、類的定義
1.語法
public class 類名{
//屬性
// 方法
}
- 一個類就是一個數據類型,定義一個類就是創建了一種類型,該類型爲引用類型
- 一個文件(xxx.java)可以定義多個類,但是隻能有一個public修飾的類,並且此類名與文件名相同
2.屬性
- 屬性來源於類的特徵(比如學生類屬性可以是名字,性別,地址,這些屬性都是靜態的)
- 定義方法:
數據類型 屬性名;
- 命名要規範,可以使用駝峯命名法
3.方法
- 方法來源於行爲(比如學生類可以唱,跳,打籃球)
- 定義方式:
public 返回類型 方法名(參數 ){
具體代碼
}
4.總結
- 類 = 屬性 + 方法
三、對象的創建和使用
1.創建對象
- 創建對象語法:
類型 對象名 = new 類型();
2.程序案例
- 主程序
package 類與對象;
public class Test {
//一個類可以創建N個對象,成員變量只屬於當前的對象(只屬於對象,不屬於類),
// 只有通過對象纔可以訪問成員變量,通過類不能直接訪問成員變量
public static void main(String[] args) {
//1.創建Student類型的對象
//new Student()創建對象,stu1是一個局部變量,這個局部變量的類型是Student類型,也就是一個引用類型
//stu1該局部變量稱作引用,引用中保存了對象在堆中的內存地址
//通過”引用.“去間接訪問堆中的對象
Student stu1 = new Student();
//一個類可以創建多個對象
Student stu2 = new Student();
//2.使用對象
//訪問成員變量,必須使用“引用.”
//name是成員變量,對象相關,必須先有對象才能訪問,必須使用“引用.”
//包裝類的默認值都爲null
//讀取過程
System.out.println("id=" + stu1.getId());
System.out.println("name=" + stu1.getName());
System.out.println("sex=" + stu1.getSex());
System.out.println("age=" + stu1.getAge());
System.out.println("address=" + stu1.getAddress());
//賦值
stu1.setId(1001);
stu1.setName("tom");
stu1.setSex(true);
stu1.setAge(20);
stu1.setAddress("江蘇-xxx");
System.out.println("----------------------");
System.out.println("id=" + stu1.getId());
System.out.println("name=" + stu1.getName());
System.out.println("sex=" + (stu1.getSex()?"男":"女"));
System.out.println("age=" + stu1.getAge());
System.out.println("address=" + stu1.getAddress());
}
}
- Student類
package 類與對象;
import java.util.Date;
//定義現實世界中的學生類型
//Student是一個類,一種引用類型
//概念上的一個定義,現實世界中不存在,是人類自己定義的類的名字
public class Student {
//屬性
//成員變量(實例變量),非靜態變量
//id是對象的級別的,必須先有對象才能訪問,不能使用類直接訪問
//private修飾的數據只能在本類中訪問
private Integer id;
private String name;
private Boolean sex;
private Integer age;
private String address;
public Student() {
}
public Student(Integer id, String name, Boolean sex, Integer age, String address) {
//id是屬性中的私有id,this.id是該構造方法中Integer id的值,兩個值不一樣
this.id = id;
this.name = name;
this.sex = sex;
this.age = age;
this.address = address;
}
public Integer getId() { //成員方法,實例方法,非靜態方法
//成員方法必須使用”引用.“的方法進行訪問
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Boolean getSex() {
return sex;
}
public void setSex(Boolean sex) {
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
- 輸出結果
id=null
name=null
sex=null
age=null
address=null
----------------------
id=1001
name=tom
sex=男
age=20
address=江蘇-xxx
3.執行流程原理及圖示
- new出來的東西統一在堆內存中開闢空間來存儲,開闢的這個空間屬於Student類型的空間,Student對象就有了
- Student這個對象在堆內存中有它自己的內存地址,這個內存地址賦給了局部變量stu1,所以stu1有可能存儲的是0x1234這樣的內存地址
- 這個stu1局部變量保存的內存地址0x1234指向堆中的這個對象,將來我們想訪問這個對象中的數據,是通過內存地址去訪問它,所以通常情況下我們是通過地址去訪問對象裏面的屬性和方法(比如你去故宮,肯定是順着地址去找故宮)
4.額外補充知識點
- stu1這個局部變量專業術語被稱爲引用,引用中保存的是內存地址
- java中new出來的數據都被放到堆中,在堆中開闢空間,程序員無法對堆中的數據直接操作,只能通過內存地址間接操作它,stu1保存的內存地址指向堆中的這個對象
- 學生對象創建出來以後,裏面有成員變量,是對象相關的。成員變量在堆中的對象中存儲。局部變量在棧中如Student stu1 = 0x1234;
- 成員變量如果沒有手動爲它們賦值,系統則會默認賦值(包裝類的默認值都爲null)
- 局部變量是在方法裏面定義的
5.總結
- 必須先有對象才能訪問成員變量,必須使用“引用 .”的形式
- 程序員無法對堆內存中的數據直接操作,只能通過內存地址間接操作
四、面向對象的封裝性
1.什麼是對象的封裝
- 將類中的屬性封裝在類中,不允許在類的外部直接訪問,保證數據安全性
- 只能通過特定的方法才能對數據進行訪問
- 類的基本原則就是封裝
2.實現方式
- 將屬性私有化,使用private修飾屬性
- 對外提供公開set和get方法,用來對對象屬性進行賦值和取值
- 一般使用快捷鍵自動生成 set和get方法
- 貼其中的一個屬性的set和get方法
public Integer getId() { //成員方法,實例方法,非靜態方法
//成員方法必須使用”引用.“的方法進行訪問
return id;
}
public void setId(Integer id) {
this.id = id;
}
3.總結
- 通過上面Student類的代碼,可以看出
- 屬性中的(id,name,sex.age.address)是對象的級別的,必須先有對象才能訪問,不能使用類(Student)直接訪問
- private修飾的數據只能在本類中訪問
- 在Student類的有參構造方法中,id是屬性中的私有id,this.id是該構造方法中Integer id的值,兩個值不一樣
以上是在學習過程中總結的,若有不正之處,請多多諒解並歡迎批評指正,不甚感激