Java基礎複習第七天——面向物件思想、類、物件、封裝、構造方法、JavaBean
目錄
e.JavaBean類的定義******************************
一 面向物件思想
1.概述
面向過程思想: 遇到一個問題,一步一步的去解決他,強調的是過程(典型代表語言是C語言)
面向物件思想: 遇到一個問題,找一個可以解決問題的物件(可以是人,也可以是別的),強調是物件(典型代表語言Java)
案例1: 洗衣服
面向過程思想: a.收集衣服 b.加水洗衣液 c.泡一會 d.搓 e.漂洗 f.擰乾 d.晾衣服
面向物件思想: 1.找個全自動洗衣機,把衣服丟進去
2.找一個人,把衣服給他
2.面向物件的三大特徵
繼承 ---複用
封裝 ---安全
多型
3.類和物件
Java中必須先有類,才能有物件
類是什麼?
一群具有相同屬性和行為事物的集合,比如人類,狗類,貓類
物件又是什麼?
就是類中的一個具體存在,也稱為例項。
舉例:
車(類) 寶馬車(類) 我家那輛三輪車(物件)
動物(類) 狗(類) 大黃狗(類) 我家那隻狗(物件)
4.類和物件的關係
物件 是以 類 作為 模板 創建出來的
所以類中有什麼,那麼物件就應該有什麼(屬性、方法)
5.類的定義
類的定義:包括類名,類的屬性(變數),類的行為(方法)三部分
格式:
public class 類名{ //類名大駝峰
//類的屬性(成員變數)
資料型別 成員變數名1;
資料型別 成員變數名2;
...
//類的行為(成員方法) 沒有static關鍵字
public 返回值型別 方法名(引數列表){
方法體
return 返回值;
}
}
預設值問題:
成員變數是有預設值的!!!!
6.成員變數和區域性變數
成員變數:直接定義在類中的變數
區域性變數:定義類中的方法中的變數
成員變數和區域性變數的五點區別:
a.定義位置不同
b.初始值不同/預設值不同
區域性變數 沒有預設值 ,不賦值不能使用
成員變數 有預設值,不同的資料型別不同的預設值
c.作用域不同(有效範圍)
區域性變數 只能在區域性使用,在哪個方法中定義的只能在該方法中使用
成員變數 在該類中都可以使用
d.記憶體位置
區域性變數 跟隨方法的呼叫,進入棧中
成員變數 跟隨物件的建立,進入堆中
e.生命週期
區域性變數 跟隨方法的呼叫而出現,跟隨方法的結束而銷燬
成員變數 跟隨物件的建立而出現,跟隨物件的銷燬而銷燬
7.物件的使用格式
類名 物件名 = new 類名();
物件名.成員變數;
物件名.成員方法();
public class Test01_Student {
public static void main(String[] args) {
//建立物件格式:類名 物件名 = new 類名();
Student s = new Student();
System.out.println("s:"+s); //地址
//直接輸出成員變數值
System.out.println("姓名:"+s.name); //null
System.out.println("年齡:"+s.age); //0
System.out.println("‐‐‐‐‐‐‐‐‐‐");
//給成員變數賦值
s.name = "C羅";
s.age = 18;
//再次輸出成員變數的值
System.out.println("姓名:"+s.name); //C羅
System.out.println("年齡:"+s.age); //18
System.out.println("‐‐‐‐‐‐‐‐‐‐");
//呼叫成員方法
s.study();
s.eat();
}
8.物件記憶體圖
1.單個物件呼叫方法
在棧記憶體中執行的方法,遵循"先進後出,後進先出"的原則。變數p指向堆記憶體中的空間,尋找方法資訊,去執行該方法。
但是,這裡依然有問題存在。建立多個物件時,如果每個物件內部都儲存一份方法資訊,這就非常浪費記憶體了,因為所有物件的方法資訊都是一樣的。那麼如何解決這個問題呢?
2.多個物件呼叫方法
物件呼叫方法時,根據物件中方法標記(地址值),去類中尋找方法資訊。這樣哪怕是多個物件,方法資訊
只儲存一份,節約記憶體空間
二.封裝
1.封裝的概述
封裝就是對我們寫的物件的一種保護,防止資料被隨意訪問和修改
2.封裝的原則
a.把需要隱藏的屬性 隱藏起來
b.對外提供一種公共訪問方式
3.封裝的步驟
a.java提供關鍵字,private 用來修飾成員變數
b.提供一對get/set方法,通過該方法可以訪問成員變數
4.private關鍵字的作用
a.private是一種最小的許可權修飾符
b.能修飾成員變數和成員方法
c.被private修飾的成員,只能在類的內部訪問
5.private的使用格式
格式: private 資料型別 成員變數名;
public class Dog{
private int age; //成員變數私有化了
//get方法,獲取值,沒有引數,有返回值
public int getAge(){
return age;
}
//set方法,修改值,沒有返回值,有引數
public void setAge(int a){
age = a;
}
}
6.this關鍵字(this和super下次整吧)
public class Dog{
private int age; //成員變數私有化了
//get方法,獲取值,沒有引數,有返回值
public int getAge(){
return age;
}
//set方法,修改值,沒有返回值,有引數
public void setAge(int age){
age = age; //如果這麼寫,就是區域性變數自己給自己賦值了,這是java的就近原則
this.age = age;//把區域性變數age,賦值給成員變數this.age
}
}
tip: 1.idea生成get和set方法快捷鍵: alt+INS 點選 Getter and Setter
2.eclipse 右鍵滑鼠——Generate——getter and setter
三.構造方法
a.什麼是構造方法
給物件的成員變數預設值的方法
b.構造方法的格式:
public 類名(){
作用: 給成員變數賦預設值的
}
注意:構造方法沒有返回值,不寫返回值型別(不是void!!!!)
注意:其實我們以前說的固定格式
類名 物件名 = new 類名();//這裡的類名() 其實就是呼叫了無引數構造方法
類名 物件名 = new 類名(引數);//呼叫有參構造方法
c.構造方法的過載
過載的構造方法:
public class Dog{
private int age; //成員變數私有化了
private String name;//
//無參構造
public Dog(){
}
//過載構造
public Dog(int age){
this.age = age;
}
public Dog(String name){
this.name = name;
}
public Dog(int age,String name){
this.age = age;
this.name = name;
}
}
d.構造方法的注意事項
i.如果一個類中沒有寫任何構造,那麼預設有一個無參構造
ii.如果我們寫了構造,那麼系統就不會生成無參構造
iii.構造方法也可以過載
e.JavaBean類的定義******************************
JavaBean是Java中定義類的標準
i.所有成員變數必須私有化(private)
ii.為私有化的成員變數提供Getter/Setter
iii.標準的JavaBean中必須有無參構造
iv. 標準的JavaBena中一般還會提供全參構造
總結 JavaBean = private+get/set+無參構造+全參構造+(一般還會自己加toString()方法)
完整版JavaBean:
package com.gty.vip;
public class Person
{
//成員變數
public int age;
public String name;
//無參構造方法
public Person(){}
//有參構造方法
public Person(int age, String name){
this.age=age;
this.name=name;
}
//getset
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//toString()方法,也是可以快速生成的 @Override是java的註解
@Override
public String toString() {
return "Person{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
/* 主方法main()這裡不寫啊!!!因為沒有main()方法,所以是不能執行的
我們都是在別的類中呼叫的
public static void main(String[] args) {
}*/
}