1. 類和物件
1.1 類和物件的理解
客觀存在的事物皆為物件 ,所以我們也常常說萬物皆物件。
類
類的理解
- 類是對現實生活中一類具有共同屬性和行為的事物的抽象
- 類是物件的資料型別,類是具有相同屬性和行為的一組物件的集合
- 簡單理解:類就是對現實事物的一種描述
類的組成
- 屬性:指事物的特徵,例如:手機事物(品牌,價格,尺寸)
- 行為:指事物能執行的操作,例如:手機事物(打電話,發簡訊)
類和物件的關係
- 類:類是對現實生活中一類具有共同屬性和行為的事物的抽象
- 物件:是能夠看得到摸的著的真實存在的實體
- 簡單理解:類是對事物的一種描述,物件則為具體存在的事物
1.2 類的定義
類的組成是由屬性和行為兩部分組成
- 屬性:在類中透過成員變數來體現(類中方法外的變數)
- 行為:在類中透過成員方法來體現(和前面的方法相比去掉static關鍵字即可)
類的定義步驟:
①定義類
②編寫類的成員變數
③編寫類的成員方法
public class 類名 {
// 成員變數
變數1的資料型別 變數1;
變數2的資料型別 變數2;
…
// 成員方法
方法1;
方法2;
}
示例程式碼:
/*
手機類:
類名:
手機(Phone)
成員變數:
品牌(brand)
價格(price)
成員方法:
打電話(call)
發簡訊(sendMessage)
*/
public class Phone {
//成員變數
String brand;
int price;
//成員方法
public void call() {
System.out.println("打電話");
}
public void sendMessage() {
System.out.println("發簡訊");
}
}
1.3 物件的使用
建立物件的格式:
- 類名 物件名 = new 類名();
呼叫成員的格式:
- 物件名.成員變數
- 物件名.成員方法();
- 示例程式碼
/*
建立物件
格式:類名 物件名 = new 類名();
範例:Phone p = new Phone();
使用物件
1:使用成員變數
格式:物件名.變數名
範例:p.brand
2:使用成員方法
格式:物件名.方法名()
範例:p.call()
*/
public class PhoneDemo {
public static void main(String[] args) {
//建立物件
Phone p = new Phone();
//使用成員變數
System.out.println(p.brand);
System.out.println(p.price);
p.brand = "小米";
p.price = 2999;
System.out.println(p.brand);
System.out.println(p.price);
//使用成員方法
p.call();
p.sendMessage();
}
}
1.4 學生物件-練習
- 需求:首先定義一個學生類,然後定義一個學生測試類,在學生測試類中透過物件完成成員變數和成員方法的使用
分析:
- 成員變數:姓名,年齡…
- 成員方法:學習,做作業…
- 示例程式碼:
public class Student {
//成員變數
String name;
int age;
//成員方法
public void study() {
System.out.println("好好學習,天天向上");
}
public void doHomework() {
System.out.println("鍵盤敲爛,月薪過萬");
}
}
/*
學生測試類
*/
public class StudentDemo {
public static void main(String[] args) {
//建立物件
Student s = new Student();
//使用物件
System.out.println(s.name + "," + s.age);
s.name = "林青霞";
s.age = 30;
System.out.println(s.name + "," + s.age);
s.study();
s.doHomework();
}
}
2. 物件記憶體圖
2.1 單個物件記憶體圖
- 成員變數使用過程
- 成員方法呼叫過程
2.2 多個物件記憶體圖
- 成員變數使用過程
- 成員方法呼叫過程
總結:
多個物件在堆記憶體中,都有不同的記憶體劃分,成員變數儲存在各自的記憶體區域中,成員方法多個物件共用的一份
3. 成員變數和區域性變數
3.1 成員變數和區域性變數的區別
- 類中位置不同:成員變數(類中方法外)區域性變數(方法內部或方法宣告上)
- 記憶體中位置不同:成員變數(堆記憶體)區域性變數(棧記憶體)
- 生命週期不同:成員變數(隨著物件的存在而存在,隨著物件的消失而消失)區域性變數(隨著方法的呼叫而存在,醉著方法的呼叫完畢而消失)
- 初始化值不同:成員變數(有預設初始化值)區域性變數(沒有預設初始化值,必須先定義,賦值才能使用)
4. 封裝
4.1 封裝思想
封裝概述
是物件導向三大特徵之一(封裝,繼承,多型)物件代表什麼,就得封裝對應的資料,並提供資料對應的行為
- 封裝程式碼實現
將類的某些資訊隱藏在類內部,不允許外部程式直接訪問,而是透過該類提供的方法來實現對隱藏資訊的操作和訪問
成員變數private,提供對應的getXxx()/setXxx()方法
4.2 private關鍵字
private是一個修飾符,可以用來修飾成員(成員變數,成員方法)
被private修飾的成員,只能在本類進行訪問,針對private修飾的成員變數,如果需要被其他類使用,提供相應的操作
- 提供“get變數名()”方法,用於獲取成員變數的值,方法用public修飾
- 提供“set變數名(引數)”方法,用於設定成員變數的值,方法用public修飾
示例程式碼:
/* 學生類 */ class Student { //成員變數 String name; private int age; //提供get/set方法 public void setAge(int a) { if(a<0 || a>120) { System.out.println("你給的年齡有誤"); } else { age = a; } } public int getAge() { return age; } //成員方法 public void show() { System.out.println(name + "," + age); } } /* 學生測試類 */ public class StudentDemo { public static void main(String[] args) { //建立物件 Student s = new Student(); //給成員變數賦值 s.name = "林青霞"; s.setAge(30); //呼叫show方法 s.show(); } }
4.3 private的使用
- 需求:定義標準的學生類,要求name和age使用private修飾,並提供set和get方法以及便於顯示資料的show方法,測試類中建立物件並使用,最終控制檯輸出 林青霞,30
示例程式碼:
/* 學生類 */ class Student { //成員變數 private String name; private int age; //get/set方法 public void setName(String n) { name = n; } public String getName() { return name; } public void setAge(int a) { age = a; } public int getAge() { return age; } public void show() { System.out.println(name + "," + age); } } /* 學生測試類 */ public class StudentDemo { public static void main(String[] args) { //建立物件 Student s = new Student(); //使用set方法給成員變數賦值 s.setName("林青霞"); s.setAge(30); s.show(); //使用get方法獲取成員變數的值 System.out.println(s.getName() + "---" + s.getAge()); System.out.println(s.getName() + "," + s.getAge()); } }
4.4 this關鍵字
this修飾的變數用於指代成員變數,其主要作用是(區分區域性變數和成員變數的重名問題)
- 方法的形參如果與成員變數同名,不帶this修飾的變數指的是形參,而不是成員變數
- 方法的形參沒有與成員變數同名,不帶this修飾的變數指的是成員變數
public class Student {
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public void show() {
System.out.println(name + "," + age);
}
}
5. 構造方法
5.1 構造方法概述
構造方法是一種特殊的方法
- 作用:建立物件 Student stu = new Student();
格式:
public class 類名{
修飾符 類名( 引數 ) {
}
}
- 功能:主要是完成物件資料的初始化
- 示例程式碼:
class Student {
private String name;
private int age;
//構造方法
public Student() {
System.out.println("無參構造方法");
}
public void show() {
System.out.println(name + "," + age);
}
}
/*
測試類
*/
public class StudentDemo {
public static void main(String[] args) {
//建立物件
Student s = new Student();
s.show();
}
}
5.2 構造方法的注意事項
- 構造方法的建立
如果沒有定義構造方法,系統將給出一個預設的無引數構造方法
如果定義了構造方法,系統將不再提供預設的構造方法
- 構造方法的過載
如果自定義了帶參構造方法,還要使用無引數構造方法,就必須再寫一個無引數構造方法
- 推薦的使用方式
無論是否使用,都手工書寫無引數構造方法
- 重要功能!
可以使用帶參構造,為成員變數進行初始化
- 示例程式碼
/*
學生類
*/
class Student {
private String name;
private int age;
public Student() {}
public Student(String name) {
this.name = name;
}
public Student(int age) {
this.age = age;
}
public Student(String name,int age) {
this.name = name;
this.age = age;
}
public void show() {
System.out.println(name + "," + age);
}
}
/*
測試類
*/
public class StudentDemo {
public static void main(String[] args) {
//建立物件
Student s1 = new Student();
s1.show();
//public Student(String name)
Student s2 = new Student("林青霞");
s2.show();
//public Student(int age)
Student s3 = new Student(30);
s3.show();
//public Student(String name,int age)
Student s4 = new Student("林青霞",30);
s4.show();
}
}
5.3 標準類製作
① 類名需要見名知意
② 成員變數使用private修飾
③ 提供至少兩個構造方法
- 無參構造方法
- 帶全部引數的構造方法
④ get和set方法
提供每一個成員變數對應的setXxx()/getXxx()
⑤ 如果還有其他行為,也需要寫上
5.4 練習1
需求:
定義標準學生類,要求分別使用空參和有參構造方法建立物件,空參建立的物件透過setXxx賦值,有參建立的物件直接賦值,並透過show方法展示資料。
- 示例程式碼:
class Student {
//成員變數
private String name;
private int age;
//構造方法
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
//成員方法
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public void show() {
System.out.println(name + "," + age);
}
}
/*
建立物件併為其成員變數賦值的兩種方式
1:無參構造方法建立物件後使用setXxx()賦值
2:使用帶參構造方法直接建立帶有屬性值的物件
*/
public class StudentDemo {
public static void main(String[] args) {
//無參構造方法建立物件後使用setXxx()賦值
Student s1 = new Student();
s1.setName("林青霞");
s1.setAge(30);
s1.show();
//使用帶參構造方法直接建立帶有屬性值的物件
Student s2 = new Student("林青霞",30);
s2.show();
}
}
5.4 練習2
public class User {
//1.私有化全部的成員變數
//2.空參構造
//3.帶全部引數的構造
//4.針對於每一個私有化的成員變數都要提供其對應的get和set方法
//5.如果當前事物還有其他行為,那麼也要寫出來,比如學生的吃飯,睡覺等行為
private String username;//使用者名稱
private String password;//密碼
private String email;//郵箱
private char gender;//性別
private int age;//年齡
//空參構造方法
public User() {
}
//帶全部引數的構造
public User(String username, String password, String email, char gender, int age) {
this.username = username;
this.password = password;
this.email = email;
this.gender = gender;
this.age = age;
}
//get和set
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void eat(){
System.out.println(username + "在吃飯");
}
}
public class Test {
public static void main(String[] args) {
//寫一個標準的javabean類
//我們們在課後只要能把這個標準的javabean能自己寫出來,那麼就表示今天的知識點就ok了
//利用空參構造建立物件
User u1 = new User();
//如果利用空參建立物件,還想賦值只能用set方法賦值
u1.setUsername("zhangsan");
u1.setPassword("1234qwer");
u1.setEmail("itheima@itcast.cn");
u1.setGender('男');
u1.setAge(23);
//獲取屬性的值並列印
System.out.println(u1.getUsername() + ", " + u1.getPassword()
+ ", " + u1.getEmail() + ", " + u1.getGender() + ", " + u1.getAge());
u1.eat();
System.out.println("=============================");
//簡單的辦法
//利用帶全部引數的構造來建立物件
//快捷鍵:ctrl + p
User u2 = new User("lisi","12345678","lisi@itcast.cn",'女',24);
System.out.println(u2.getUsername() + ", " + u2.getPassword()
+ ", " + u2.getEmail() + ", " + u2.getGender() + ", " + u2.getAge());
u2.eat();
}
}