物件導向
物件導向介紹
介紹
- 面向:拿、找
- 物件:能幹活的東西
- 物件導向程式設計:拿東西過來坐對應的事情
設計物件並使用
類和物件
- 類(設計圖):是物件共同特徵的描述;
- 物件:是真實存在的具體東西
在Java中,必須先設計類,才能獲得物件。
如何定義類
public class 類名{
1.成員變數(代表屬性,一般是名詞)
2.成員方法(代表行為,一般是動詞)
3.構造器(後面學習)
4.程式碼塊(後面學習)
5.內部類(後面學習)
}
public class Phone {
String brand;
double print;
//行為(方法)
public void call(){
}
public void playGame(){
}
}
如何得到類的物件
類名 物件名 = new 類名();
Phone p = new Phone();
如何使用物件
- 訪問屬性:物件名.成員變數
- 訪問行為:物件名.方法名(...)
範例:
public class Phone {
//屬性
String brand;//手機的品牌
double price;//手機的價格
//行為
public void call(){
System.out.println("手機在打電話");
}
public void playGame(){
System.out.println("手機在玩遊戲");
}
}
public class PhoneTest {
public static void main(String[] args) {
//建立手機的物件
Phone p = new Phone();
//給手機賦值
p.brand = "菠蘿";
p.price = 1145.14;
//獲取手機物件中的值
System.out.println(p.brand);
System.out.println(p.price);
//呼叫手機中的方法
p.call();
p.playGame();
//第二部手機
Phone p2 = new Phone();
p2.brand = "鴨梨";
p2.price = 1008.6;
p2.call();
p2.playGame();
}
}
總結
-
類和物件是什麼?
- 類:是物件共同特徵的描述(設計圖);物件:是真實存在的具體例項。
-
如何得到物件?
public class 類名{ 1.成員變數(代表屬性,一般是名詞) 2.成員方法(代表行為,一般是動詞) }
類名 物件名 = new 類名();
-
拿到物件後能做什麼?
- 物件名.成員變數
- 物件名.方法名(...)
類的幾個補充注意事項
-
用來描述一類事物的類,專業叫做: Javabean類。
在Javabean類中,是不寫main方法的。
-
在以前,編寫main方法的類,叫做測試類。
我們可以在測試類中建立javabean類的物件並進行賦值呼叫。
public class 類名{
1.成員變數(代表屬性)
2.成員方法(代表行為)
}
-
類名首字母建議大寫,需要見名知意,駝峰模式。
-
一個Java檔案中可以定義多個class類,且只能一 個類是public修飾,而且public修飾的類名必須成為程式碼檔名。
實際開發中建議還是一個檔案定義一個class類。
-
成員變數的完整定義格式是: 修飾符 資料型別 變數名稱 = 初始化值;一般無需指定初始化值,存在預設值。
資料型別 明細 預設值 基本型別 byte、short、int、long 0 基本型別 float、double 0.0 基本型別 boolean false 引用型別 類、介面、陣列、String null
練習
女朋友類
編寫女朋友類,建立女朋友類的物件
給女朋友的屬性賦值並呼叫女朋友類中的方法。
自己思考,女朋友類中有哪些屬性,有哪些行為?
public class GirlFriendTest {
public static void main(String[] args) {
//建立女朋友的物件
GirlFriend gf1 = new GirlFriend();
gf1.name = "柳如煙";
gf1.age = 18;
gf1.gender = "女神";
System.out.println(gf1.name);
System.out.println(gf1.age);
System.out.println(gf1.gender);
gf1.sleep();
gf1.eat();
System.out.println("=====================================");
GirlFriend gf2 = new GirlFriend();
gf2.name = "蘇沐雪";
gf2.age = 19;
gf2.gender = "青梅竹馬";
System.out.println(gf2.name);
System.out.println(gf2.age);
System.out.println(gf2.gender);
gf2.sleep();
gf2.eat();
}
}
總結
-
定義類有哪些建議,有什麼需要注意的?
-
類名首字母建議大寫、英文、有意義,滿足駝峰模式,不能用關鍵字,滿足標誌符規定;
-
一個程式碼檔案中可以定義多個類,但是隻能一個類是public修飾的,
public修飾的類名必須是Java程式碼的檔名稱。
-
-
成員變數的格式是什麼樣的,有什麼特點?
- 成員變數的完整定義格式是:修飾符 資料型別 變數名稱 = 初始化值;
- 一般無需指定初始化值。
封裝
告訴我們,如何正確設計物件的屬性和方法
原則:物件代表什麼,就得封裝對應的資料,並提供資料對應的行為
封裝的好處
- 讓程式設計變得很簡單,有什麼事,找物件,調方法就行。
- 降低我們的學習成本,可以少學、少記,或者說壓根不用學,不用記物件有哪些方法,有需要時去找就行
private關鍵字
- 是一個許可權修飾符
- 可以修飾成員(成員變數和成員方法)
- private修飾的成員只能在本類中才能訪問
public class GirlFriend {
private String name;
private int age;
private String gender;
//針對於每個私有化的成員變數,都要提供get和set方法
//set方法:給成員變數賦值
//get方法;對外提供成員變數的值
public void setName(String n){
name = n;
}
public String getName(){
return name;
}
public void setAge(int a){
if(a >= 0 && a <= 100){
age = a;
}else {
System.out.println("非法引數");
}
}
public int getAge(){
return age;
}
public void setGender(String g){
gender = g;
}
public String getGender(){
return gender;
}
//行為
public void sleep(){
System.out.println("女朋友在睡覺");
}
public void eat(){
System.out.println("女朋友在吃飯");
}
}
public class GirlFriendTest {
public static void main(String[] args) {
GirlFriend gf1 = new GirlFriend();
gf1.setName("柳如煙");
gf1.setAge(18);
gf1.setGender("女");
System.out.println(gf1.getName());
System.out.println(gf1.getAge());
System.out.println(gf1.getGender());
gf1.sleep();
gf1.eat();
}
}
總結
- private關鍵字是一個許可權修飾符
- 可以修飾成員(成員變數和成員方法)
- 被private修飾的成員只能在本類中才能訪問
- 針對private修飾的成員變數,如果需要被其他類使用,提供相應的操作
- 提供“setxxx(引數)”方法,用於給成員變數賦值,方法用public修飾
- 提供"getxxx()"方法,用於獲取成員變數的值,方法用public修飾
就近原則和this關鍵字
就近原則
- 誰離我近我就用誰
成員變數和區域性變數
public class GirlFriend{
private int age;//成員變數
public void method(){
int age = 10;//區域性變數
System.out.println(age);//列印區域性變數
}
}
public class GirlFriend{
private int age;//成員變數
public void method(){
int age = 10;//區域性變數
System.out.println(this.age);//列印成員變數
}
}
範例:
public class GirlFriend {
private String name;
private int age;
private String gender;
//針對於每個私有化的成員變數,都要提供get和set方法
//set方法:給成員變數賦值
//get方法;對外提供成員變數的值
//作用:給成員變數name進行賦值的·
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setAge(int age){
if(age >= 0 && age <= 100){
this.age = age;
}else {
System.out.println("非法引數");
}
}
public int getAge(){
return age;
}
public void setGender(String gender){
this.gender = gender;
}
public String getGender(){
return gender;
}
//行為
public void sleep(){
System.out.println("女朋友在睡覺");
}
public void eat(){
System.out.println("女朋友在吃飯");
}
}
public class GirlFriendTest {
public static void main(String[] args) {
GirlFriend gf1 = new GirlFriend();
gf1.setName("柳如煙");
gf1.setAge(18);
gf1.setGender("女");
System.out.println(gf1.getName());
System.out.println(gf1.getAge());
System.out.println(gf1.getGender());
gf1.sleep();
gf1.eat();
}
}
總結
- 就近原則
- this作用:區別成員變數和區域性變數
- this的本質和記憶體圖
構造方法
概述:
- 構造方法也叫做構造器、建構函式。
- 作用:在建立物件的時候給成員變數進行賦值的。
格式:
public class Student{
修飾符 類名(引數){
方法體;
}
}
特點:
- 方法名和類名相同,大小寫也要一致
- 沒有返回值型別,練void都沒有
- 沒有具體的返回值(不能有return帶回結果資料)
執行時機:
- 建立物件的時候有虛擬機器呼叫,不能手動呼叫構造方法
- 每建立一次物件,就會呼叫一次構造方法
public class Student {
private String name;
private int age;
//如果我們自己沒有寫任何的構造方法
//那麼虛擬機器就會給我們加一個空參構造方法
public Student (){
System.out.println("故鄉的櫻花開了");
}
public Student(String name,int age){
this.name = name;
this.age = age;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public int getAge(){
return age;
}
public void set(int age){
this.age = age;
}
}
public class StudentTest {
public static void main(String[] args) {
//建立物件
//呼叫的空參構造
//Student s = new Student();
Student s = new Student("柳如煙",18);
System.out.println(s.getName());
System.out.println(s.getAge());
}
}
構造方法注意事項
- 構造方法的定義
- 如果沒有定義構造方法,系統將給出一個預設的無引數構造方法
- 如果定義了構造方法,系統將不再提供預設的構造方法
- 構造方法的過載
- 帶參構造方法,和無參構造方法,兩者方法名相同,但是引數不同,這叫做構造方法的過載
- 推薦的使用方法
- 無論是否使用,都手動書寫無參構造方法,和帶全部引數的構造方法
總結
- 構造方法的作用?
- 創造物件的時候,有虛擬機器自動呼叫,給成員變數進行初始化的。
- 構造方法有幾種,各自的作用是什麼?
- 無引數構造方法:初始化的物件時,成員變數的資料均採用預設值。
- 有引數構造方法:在初始化物件的時候,同時可以為物件進行賦值。
- 構造方法有哪些注意事項?
- 任何類定義出來,預設就自帶了無引數構造器,寫不寫都有。
- 一旦定義有引數構造器,無引數構造器就沒有了,此時就需要自己寫有引數構造器了。
- 建議在任何時候都手動寫上空參和帶全部引數的構造方法。
- 創造物件的時候,虛擬機器會自動呼叫構造方法,作用是給成員變數進行初始化的。
標準JavaBean
標準JavaBean類
- 類名需要見名知意
- 成員變數使用private修飾
- 提供至少兩個構造方法
- 無參構造方法
- 帶全部引數的構造方法
- 成員方法
- 提供每一個成員變數對應的setXxx()/getXxx()
- 如果還有其他行為,也要寫上
範例:
public class User {
//屬性
private String username;
private String password;
private String email;
private String gender;
private int age;
//快捷鍵:
//alt + insert
//alt + Fn + insert
//外掛PTG 1秒生成標準JavaBean(右鍵空白處,點選倒數第三個)
//空參
public User(){}
//帶全部引數的構造
public User(String username,String password,String email,String 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 String getGender(){
return gender;
}
public void setGender(String gender){
this.gender = gender;
}
public int getAge(){
return age;
}
public void setAge(int age){
this.age = age;
}
}
物件記憶體圖
一個物件的記憶體圖
Student s = new Student();
- 載入class檔案
- 申明區域性變數
- 在堆記憶體中開闢一個空間
- 預設初始化
- 顯示初始化
- 構造方法初始化
- 將堆記憶體中的地址值賦值給左邊的變數
兩個物件的記憶體圖
兩個引用指向同意一個物件
基本資料型別和引用資料型別
基本資料型別
- 在變數當中儲存的是真實的資料值
引用資料型別
- 使用其他空間的資料
從記憶體的角度去解釋:
- 基本資料型別:資料值是儲存在自己的空間中
- 特點:複製給其他變數,也是賦的真實的值。
- 引用資料型別:資料值是儲存在其他空間中,自己空間中儲存的是地址值。
- 特點:賦值給其他變數,賦的是地址值。
this的記憶體原理
- this的作用:區分區域性變數和成員變數
- this的本質:所在方法呼叫者的地址值
成員變數和區域性變數的區別
成員變數:類中方法外的變數
區域性變數:方法中的變數
區別 | 成員變數 | 區域性變數 |
---|---|---|
類中位置不同 | 類中,方法外 | 方法內、方法申明上 |
初始化值不同 | 有預設初始化值 | 沒有, 使用之前需要完成賦值 |
記憶體位置不同 | 堆記憶體 | 棧記憶體 |
生命週期不同 | 隨著物件的建立而存在,隨著物件的消失而消失 | 隨著方法的呼叫而存在, 隨著方法的執行結束而消失 |
作用域 | 整個類中有效 | 當前方法中有效 |