面向?qū)ο?/h1>
面向?qū)ο笫且环N思想
面向過程 注重的是“步驟”
面向?qū)ο? 注重的是“對(duì)象”
對(duì)象
對(duì)象:具有明確的屬性和行為(功能)的實(shí)體
類
貓類、狗類、人類
類:是一組具有相同屬性和行為的對(duì)象的集合
屬性 行為
人 姓名焕妙、性別一膨、年齡、身高 唱歌、跳、rap、打籃球
車 顏色芋齿、品牌腥寇、價(jià)格、輪子個(gè)數(shù) 載人觅捆、加速赦役、減速....
貓 年齡、性別栅炒、姓名掂摔、品種、顏色 喵喵赢赊、找老鼠乙漓、上樹......
類有兩個(gè)組成部分:
1、屬性 -------> 成員變量
2释移、行為 -------> 成員方法
類和對(duì)象的關(guān)系
1叭披、對(duì)象是具體的,類是抽象的
2玩讳、面向?qū)ο缶褪? 從具體到抽象趋观,從抽象到具體的過程
如何創(chuàng)建類
1、確定類名
2锋边、成員變量
3、成員方法
面向?qū)ο笫且环N思想
面向過程 注重的是“步驟”
面向?qū)ο? 注重的是“對(duì)象”
對(duì)象:具有明確的屬性和行為(功能)的實(shí)體
貓類、狗類、人類
類:是一組具有相同屬性和行為的對(duì)象的集合
屬性 行為
人 姓名焕妙、性別一膨、年齡、身高 唱歌、跳、rap、打籃球
車 顏色芋齿、品牌腥寇、價(jià)格、輪子個(gè)數(shù) 載人觅捆、加速赦役、減速....
貓 年齡、性別栅炒、姓名掂摔、品種、顏色 喵喵赢赊、找老鼠乙漓、上樹......
類有兩個(gè)組成部分:
1、屬性 -------> 成員變量
2释移、行為 -------> 成員方法
1叭披、對(duì)象是具體的,類是抽象的
2玩讳、面向?qū)ο缶褪? 從具體到抽象趋观,從抽象到具體的過程
1、確定類名
2锋边、成員變量
3、成員方法
Student類
public class Student {
//屬性=====成員變量 (寫在類的里面编曼,方法的外面的變量)
String name; //姓名
int age;//年齡
double height;//身高
char sex ;//性別
String address;//住址
//行為=====成員方法
public void study() {
System.out.println(name+"學(xué)習(xí)~~~~~~~~~~~");
}
public void sleep() {
System.out.println("睡覺~~~~~~~~~~");
}
}
如何創(chuàng)建對(duì)象
1豆巨、創(chuàng)建對(duì)象
類名 變量名(對(duì)象名) = new 類名();
2、通過對(duì)象去調(diào)用類的屬性
對(duì)象名.屬性名
3掐场、通過對(duì)象去調(diào)用類的方法
對(duì)象名.方法名()
要想調(diào)用一個(gè)類的方法和屬性往扔,必須要先要?jiǎng)?chuàng)建這個(gè)類的對(duì)象
測試類
public class Test {
public static void main(String[] args) {
//創(chuàng)建Student對(duì)象 類名 變量名(對(duì)象名) = new 類名();
Student stu = new Student();
//調(diào)用對(duì)象的屬性(成員變量) 存值
//屬性的功能 存值 取值
stu.name = "cxk";
stu.age = 30;
stu.sex = '男';
stu.height = 180;
stu.address = "武漢";
//調(diào)用對(duì)象的屬性 取值
System.out.println("姓名為:"+stu.name);
System.out.println("年齡為:"+stu.age);
//調(diào)用對(duì)象的方法 對(duì)象名.方法名();
stu.study();
}
}
成員變量和局部變量
區(qū)別:
1、定義的變量位置不同
a熊户、定義在類中萍膛,方法外的變量稱之為成員變量
b、定義在方法中的變量稱之為局部變量
2嚷堡、作用域不相同(本類)
a蝗罗、成員變量,在整個(gè)類中都能被訪問
b蝌戒、局部變量串塑,只能在變量所在大{}中被使用
3、初始值(默認(rèn)值)不同
a北苟、成員變量桩匪,系統(tǒng)會(huì)賦予默認(rèn)值
b、局部變量友鼻,沒有默認(rèn)值(所以要注意:局部變量必須要賦值才能使用)
4傻昙、重名問題
a闺骚、成員變量不能重名
b、局部變量可以在不同的作用域中定義重名變量
5妆档、就近原則
當(dāng)成員變量和局部變量名相同的時(shí)候僻爽,使用的時(shí)候采用就近原則
6、生命周期不同
a过吻、成員變量 是隨著對(duì)象在堆內(nèi)存中进泼,對(duì)象被銷毀,成員變量被銷毀
b纤虽、局部變量 因?yàn)榫植孔兞吭跅?nèi)存中乳绕,當(dāng)方法執(zhí)行完成之后,就會(huì)被銷毀
測試
1逼纸、設(shè)計(jì)個(gè)圖形類洋措,設(shè)計(jì)兩個(gè)方法,一個(gè)求周長(返回周長)杰刽,一個(gè)球面積(返回面積)
- 代碼實(shí)現(xiàn)
public class Rectangle {
//成員變量
double length;
double width;
//成員方法
public double area() {
return length *width;
}
public double perimeter() {
return (length + width )*2;
}
}
public class Test {
public static void main(String[] args) {
//1菠发、創(chuàng)建Rectangle對(duì)象
Rectangle r = new Rectangle();
//2、給對(duì)象的屬性賦值 (調(diào)用對(duì)象的屬性)
r.length = 30;
r.width = 20;
//3贺嫂、求面積和周長 (調(diào)用對(duì)象的方法)
double mj = r.area();
System.out.println("面積為"+mj);
double zc = r.perimeter();
System.out.println("周長為"+zc);
}
}
面向?qū)ο缶幊?OOP)
封裝滓鸠、繼承、多態(tài)
封裝
面向?qū)ο笾械姆庋b
隱藏類的實(shí)現(xiàn)細(xì)節(jié)第喳,對(duì)外提供公共的方法糜俗。
1、私有化屬性
2曲饱、對(duì)外提供公共的方法 setter/getter
private 私有的 只能在本類中使用
代碼演示
public class Dog {
private String name;
private int age;
private char sex;
//alt + shift + s ------- > getters/setters
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
}
this關(guān)鍵字
this關(guān)鍵字的含義是:當(dāng)前類的對(duì)象
this關(guān)鍵字的用法
調(diào)用屬性
this.屬性名
調(diào)用方法
this.方法()
調(diào)用構(gòu)造方法(使用的很少)
this();
this(構(gòu)造參數(shù)悠抹。。扩淀。楔敌。);
注意:調(diào)用類的構(gòu)造方法,要方法第一行代碼
當(dāng)如果沒有變量名沖突的時(shí)候驻谆,this關(guān)鍵字是可以省略的卵凑。
構(gòu)造方法
構(gòu)造方法就是創(chuàng)建對(duì)象的方法
構(gòu)造方法
語法:
訪問修飾符 方法名(){
}
訪問修飾符:public
方法名:必須與類名一致(區(qū)分大小寫)
() :構(gòu)造參數(shù)列表
如果一個(gè)類沒有定義構(gòu)造方法,那么系統(tǒng)會(huì)默認(rèn)給這個(gè)類提供一個(gè)無參構(gòu)造方法
如果這個(gè)類定義了構(gòu)造方法胜臊,那么系統(tǒng)不再提供無參構(gòu)造
繼承
為什么要繼承
為了解決代碼的重用性
如何繼承
1氛谜、編寫父類
2、編寫子類
3区端、讓子類繼承自父類
繼承的語法:
public class 子類 extends 父類{
}
繼承之后特點(diǎn)(好處)
1值漫、子類繼承父類,那么子類可以享有父類的非私有屬性和方法
2织盼、子類也可以有自己獨(dú)有的屬性和方法
3杨何、在java中只支持單繼承(一個(gè)父類可以有多個(gè)子類酱塔,但是一個(gè)子類只能有一個(gè)父類),可以多層繼承
4危虱、在java中最頂端的類叫做 Object類羊娃, 在java中如果一個(gè)類沒有繼承任何的父類,那么默認(rèn)繼承自O(shè)bject類
父類和子類之間的關(guān)系
在程序中
被繼承的類 稱之為 父類埃跷、超類蕊玷、基類
繼承類 稱之為 子類、派生類
子類 is a 父類
子類的創(chuàng)建過程
子類在創(chuàng)建對(duì)象的時(shí)候弥雹,會(huì)先去創(chuàng)建父類的對(duì)象
如果在父類中加入一個(gè)有參構(gòu)造垃帅,那么子類就會(huì)報(bào)錯(cuò)
原因:因?yàn)楦割愔杏辛擞袇?gòu)造,那么系統(tǒng)不會(huì)去提供無參構(gòu)造剪勿,子類在創(chuàng)建的是贸诚,默認(rèn)又去調(diào)用了父類的無參構(gòu)造
創(chuàng)建對(duì)象的同時(shí)對(duì)屬性進(jìn)行賦值
在子類中創(chuàng)建有參的構(gòu)造方法
public Student(String name,int age) {
//調(diào)用父類的構(gòu)造方法
super(name,age);
}
在父類中創(chuàng)建有參構(gòu)造
public Person(String name,int age) {
this.name = name;
this.age = age;
}
super關(guān)鍵字
super 表示直接父類對(duì)象
super 關(guān)鍵字的作用
調(diào)用父類的屬性、方法厕吉、構(gòu)造方法
調(diào)用父類的屬性:super.屬性名
如果字類中沒有這個(gè)屬性酱固,那么調(diào)用的是父類的屬性
那么使用this.屬性名、super.屬性名头朱,表示都是一樣的
調(diào)用父類方法: super.方法名
如果子類中沒有這個(gè)方法运悲,那么調(diào)用的是父類的方法
如果子類中有相同的名字的方法(方法的重寫)
調(diào)用父類的構(gòu)造方法: super(構(gòu)造方法)
必須要寫在構(gòu)造方法的第一行代碼
方法重寫
在子類中出現(xiàn)與父類有相同簽名的方法,就叫做方法的重寫
重寫的要求:
重寫的方法 方法名项钮、返回值類型班眯、參數(shù)列表要一致,訪問修飾符要比父類的大
父類Person中work方法
public void work() {
System.out.println("這是父類的work方法");
}
在子類中重寫父類的work方法
@Override
public void work() {
//super.work();
System.out.println("喝水");
System.out.println("抽根煙");
System.out.println("工作");
System.out.println("看看時(shí)間");
System.out.println("下班");
}
@Override 注解 檢測這個(gè)方法是否方法重寫
方法重寫與方法重載的區(qū)別
類型 | 位置 | 方法名 | 返回值 | 參數(shù)列表 | 訪問修飾符 |
---|---|---|---|---|---|
方法重寫 | 子類 | 相同 | 相同 | 相同 | 比父類大 |
方法重載 | 本類 | 相同 | 無關(guān) | 不同 | 無關(guān) |
訪問修飾符
類型 | 本類 | 本包 | 不同包子類 | 所有 |
---|---|---|---|---|
private | √ | |||
默認(rèn)的 | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
static關(guān)鍵字
static 靜態(tài)的
修飾符: 屬性寄纵、方法、代碼塊脖苏、內(nèi)部類
static修飾的屬性: 靜態(tài)變量
1程拭、靜態(tài)變量直接通過類名.變量名調(diào)用,不需要?jiǎng)?chuàng)建類的對(duì)象
2棍潘、靜態(tài)變量也可以通過對(duì)象來調(diào)用恃鞋,是因?yàn)樗诙褍?nèi)存中有一份拷貝
3、靜態(tài)變量在對(duì)象之間是共享
在開發(fā)中亦歉,靜態(tài)的變量用的很少恤浪。但是靜態(tài)常量用的多
public static final 類型 常量名 = 值:
常量:
常量不能改變
常量必須要賦值
static修飾的方法: 靜態(tài)方法
1、靜態(tài)方法直接通過類名.方法名調(diào)用肴楷,不需要?jiǎng)?chuàng)建類的對(duì)象
2水由、靜態(tài)方法也可以通過對(duì)象來調(diào)用,是因?yàn)樗诙褍?nèi)存中有一份拷貝
3赛蔫、靜態(tài)方法只能訪問靜態(tài)的變量和靜態(tài)方法
4砂客、靜態(tài)方法中不能使用this和super關(guān)鍵字
注意:非靜態(tài)方法可以調(diào)用靜態(tài)方法
static修飾的代碼塊 靜態(tài)代碼塊
1泥张、當(dāng)類被加載的時(shí)候,靜態(tài)代碼塊就會(huì)被執(zhí)行
2鞠值、靜態(tài)代碼塊只會(huì)被加載一次
3媚创、靜態(tài)代碼塊,優(yōu)先于類的所有信息先執(zhí)行
final關(guān)鍵字
final關(guān)鍵字
修飾屬性 常量
1彤恶、常量一旦定義不能修改
2钞钙、必須要賦值
如:public static final String USERNAME= "root";
修飾方法
1、final修飾的方法不能被重寫
修飾類
1声离、final修飾的類不能被繼承
注意: 靜態(tài)方法不能被重寫
多態(tài)
生活中的多態(tài):同一個(gè)事物在不同環(huán)境下有不同的狀態(tài)
人在不同的環(huán)境下身份不同
f1鍵在不同的軟件下作用不同
程序中的多態(tài):同一個(gè)對(duì)象在不同的環(huán)境下調(diào)用芒炼,功能不同
多態(tài)產(chǎn)生的條件
1、必須要有繼承
2抵恋、父類的引用指向子類的對(duì)象(向上轉(zhuǎn)型)
3焕议、一定要有方法的重寫
多態(tài)的特點(diǎn)
1、如果發(fā)生了多態(tài)弧关,那么調(diào)用方法一定是子類重寫的那個(gè)方法
2盅安、如果發(fā)生了多態(tài),那么父類引用無法調(diào)用子類自己的方法
如果想要調(diào)用世囊,那么就必須發(fā)生 向下轉(zhuǎn)型
在發(fā)生向下轉(zhuǎn)型之前别瞭,必須要發(fā)生向上轉(zhuǎn)型。否則會(huì)有異常java.lang.ClassCastException(類轉(zhuǎn)換異常)
3株憾、如何避免程序出現(xiàn)類轉(zhuǎn)換異常
在轉(zhuǎn)換之前蝙寨,先判斷是都是這個(gè)類型
//判斷對(duì)象是否是某一個(gè)類型
//判斷animal是否是Dog類型
if(animal instanceof Dog) {
Dog d = (Dog)animal;
d.show();
}
4、編譯看左邊嗤瞎, 運(yùn)行看右邊
抽象類
用abstract關(guān)鍵字修飾的類就稱之為抽象類
抽象類的特點(diǎn): abstract關(guān)鍵字修飾
1墙歪、有抽象方法的類必須是抽象類
2、抽象類也可以沒有抽象方法(沒什么意義)
3贝奇、抽象類不能被實(shí)例化
抽象類的作用 當(dāng)?shù)? 一般都是用來作為父類被使用
抽象方法的特點(diǎn): abstract關(guān)鍵字修飾
1虹菲、抽象方法不能有方法體(不同有{})
2、抽象方法必須被子類重寫掉瞳,除非自己也是一個(gè)抽象類
接口
生活中的接口:接口定義了規(guī)范毕源,是一種約束
public class 類名{
成員變量
成員方法
}
如何定義接口:
public interface 接口名{
}
接口中只能包含:
靜態(tài)常量 默認(rèn)加上了 public static final修飾
抽象方法 默認(rèn)加上了 public abstract修飾
如何實(shí)現(xiàn)接口
public class 實(shí)現(xiàn)類 implements 接口名{
//重寫接口的抽象方法
}
如果使用接口 (利用多態(tài))
MyInterface mi = new MyInterfaceImpl();
mi.show();
接口的特點(diǎn):
1、一個(gè)類可以實(shí)現(xiàn)多個(gè)接口 (類與接口之間是實(shí)現(xiàn)關(guān)系)
2陕习、一個(gè)接口可以繼承多個(gè)接口(接口與接口之間是繼承關(guān)系)
3霎褐、一個(gè)類只能繼承一個(gè)類
接口其實(shí)使用特殊的抽象類
接口和抽象類的區(qū)別
1、接口中必須都是抽象方法该镣,抽象中類可以沒有
2冻璃、接口中必須是靜態(tài)常量,抽象類都可以
3、接口是被類實(shí)現(xiàn)(implements)俱饿,抽象類是被繼承(extends)
4歌粥、都不能被實(shí)例化
圖書管理系統(tǒng)
- 接口類
public interface UserInterface {
//用戶登錄
boolean login(User user);
//用戶注冊
void register(User user);
}
- 接口實(shí)現(xiàn)類
public class UserInterfaceImpl implements UserInterface {
//保存所有的用戶信息
User[] users = new User[0];
@Override
public boolean login(User user) {
//遍歷User數(shù)組中的所有用戶對(duì)象
for (int i = 0; i < users.length; i++) {
User u = users[i];
if(user.getUsername().equals(u.getUsername()) && user.getPassword().equals(u.getPassword())) {
return true;
}
}
return false;
}
@Override
public void register(User user) {
//定義長度比以前數(shù)組大1的新數(shù)組
User[] users_1 = new User[users.length+1];
for (int i = 0; i < users.length; i++) {
users_1[i] = users[i];
}
//將傳進(jìn)來的User存在數(shù)組的最后一個(gè)位置
users_1[users_1.length-1] = user;
//將新數(shù)組賦給,成員變量的數(shù)組
users = users_1;
}
}
- User實(shí)體類
public class User {
private String username;
private String password;
public User(String username, String password) {
super();
this.username = username;
this.password = password;
}
public User() {
super();
}
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 class Menu {
public static final int REG = 1;
public static final int LOG = 2;
public static final int EXIT = 3;
//定義UserInterfaceImpl 對(duì)象拍埠,調(diào)用登錄和注冊的方法
UserInterface userInterface = new UserInterfaceImpl();
Scanner sc = new Scanner(System.in);
public void menu() {
System.out.println("歡迎光臨XXXX系統(tǒng)");
System.out.println("1失驶、注冊");
System.out.println("2、登錄");
System.out.println("3枣购、退出");
int num = sc.nextInt();
switch (num) {
case Menu.REG:
System.out.println("請輸入注冊用戶名");
String username = sc.next();
System.out.println("請輸入注冊密碼");
String password = sc.next();
User user = new User(username, password);
userInterface.register(user);
menu();
break;
case Menu.LOG:
System.out.println("歡迎登錄");
System.out.println("請輸入用戶名");
String username1 = sc.next();
System.out.println("請輸入密碼");
String password1 = sc.next();
User user1 = new User(username1, password1);
boolean b = userInterface.login(user1);
if(b == true) {
System.out.println("進(jìn)入圖書管理系統(tǒng)~~~~");
}else {
System.out.println("登錄失敗嬉探,請檢查你的賬號(hào)和密碼");
}
menu();
break;
case Menu.EXIT:
System.out.println("歡迎下次使用~~~~");
break;
default:
System.out.println("您的選擇有誤~請重新輸入");
menu();
break;
}
}
}
- 測試
public class Test {
public static void main(String[] args) {
Menu menu = new Menu();
menu.menu();
}
}