面向程序和面向物件
需求:把大象裝到冰箱
1)面向程序:(簡單)
第一步:把冰箱門打開
第二步:把大象裝入冰箱
第三步:把冰箱門關閉
關注:怎么把問題解決步驟,然后按步驟順序一步步實作
2)面向物件:(復雜)
物體POJO:(名詞)
大象(特征-屬性(大鼻子、粗腿、細尾巴、蒲扇耳朵),行為-方法(吃、玩、遷移))、
冰箱(特征(容量、電、冷藏和冷凍,門),行為(加電和斷電、打開和關閉門))
打開冰箱,把大象裝入,關閉冰箱門
關注:物體建模
面向程序它急于去實作細節,往往考慮細節不夠周到(開發者、用戶);
如果考慮不周,會造成專案無法按時交付,甚至推到重來,
先松后緊
面向物件它干活不急,它在構建物件(建模),所有的細節都考慮了,
甚至有些用戶沒有提出的需求它都考慮到了,
需求變更,
需求:我到超市買吃的,買了5樣東西,又買了鍋,
1、面向程序,我到超市;買東西,交付5樣錢,(改代碼)C語言
2、面向物件,把超市的所有的商品1000都建模,(不用改代碼)java語言、python語言
考驗設計這能力,面向物件設計比面向程序設計要難,
面向物件的三大特性
封裝:把物件細節隱藏起來,呼叫者使用時就變的簡單,
汽車,拆盲盒
繼承:和生活中繼承類似,它能從繼承中獲取“利益”,
多型:一個東西,在不同情況下,表現出不同特性,
水(液態),零下-273度,(固態)
封裝 POJO有特殊要求
1)所有屬性不能直接對外訪問,修改訪問修飾符,私有 private
2)對這個屬性name,給它兩個方法:getName 獲取name值,setName 設定name值
package cn.tedu.oop.pojo;
//POJO(Plain Ordinary Java Object)簡單的Java物件
public class Person {
//一堆私有屬性(欄位)
private String name;
private String sex;
private Integer age;
private String school;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
//一堆對應每個屬性get和set方法,eclipse都自動生成
}
package cn.tedu.oop.pojo;
//POJO(Plain Ordinary Java Object)簡單的Java物件
public class Person {
//一堆私有屬性(欄位)
private String name;
private String sex;
private Integer age;
private String school;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
//不屬于標準POJO要求,但是日常為了測驗方便
//@Override //注解,重寫,重寫父類相同方法,繼承Object類
public String toString() {
return "Person [name=" + name + ", sex=" + sex + ", age=" + age + ", school=" + school + "]";
}
//一堆對應每個屬性get和set方法,eclipse都自動生成
}
繼承
在java中所有創建類都是Object子類(繼承)
直接繼承(父)和間接繼承(爺,多級)
java中只是單繼承,不允許多繼承,不允許有兩個父親;c++語言就支持多繼承,菱形繼承
包裝型別,使用了直接繼承和間接繼承(單繼承,多級)
package test;
import org.junit.Test;
//找典型包裝類:整型、浮點、字符、布爾
public class TestWrapper {
@Test
public void wrapper() {
System.out.println( "整型本類:"+ this.getClass().getName());
System.out.println( "整型父類:"+ this.getClass().getSuperclass());
System.out.println( "整型爺類:"+ this.getClass().getSuperclass().getSuperclass());
System.out.println();
Integer i = 10;
System.out.println("整型父類:"+ i.getClass().getSuperclass() );
System.out.println("整型爺類:"+ i.getClass().getSuperclass().getSuperclass() );
System.out.println("整型宗族:"+ i.getClass().getSuperclass().getSuperclass().getSuperclass() );
System.out.println();
Double d = 10.0;
System.out.println("浮點父類:" + d.getClass().getSuperclass());
System.out.println();
Character c = 'a';
System.out.println("字符父類:" + c.getClass().getSuperclass());
System.out.println();
Boolean b = true;
System.out.println("布爾父類:" + b.getClass().getSuperclass());
}
}
需求:車,寶馬車BWCar,勞斯萊斯幻影HYCar
1)屬性:名字name、價格price、顏色color
2)方法:run()
分析:
1)公用屬性和方法提取到一個新類中Car,這些資訊就從本類(子類)中洗掉
2)必須使用繼承類方式:extends Car,標明繼承關系
優點就是:代碼復用,
package cn.tedu.oop.pojo;
public class Car {
private String name;
private Double price;
private String color;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
@Override
public String toString() {
return "Car [name=" + name + ", price=" + price + ", color=" + color + "]";
}
}
package cn.tedu.oop.pojo;
//復用
public class BWCar extends Car{
public void runBW() {
System.out.println("寶馬");
}
}
package cn.tedu.oop.pojo;
//標明繼承關系
public class HYCar extends Car{
public void runHY() {
System.out.println("幻影");
}
}
package test;
import org.junit.Test;
import cn.tedu.oop.pojo.BWCar;
import cn.tedu.oop.pojo.HYCar;
public class TestCar {
@Test
public void car() {
BWCar bw = new BWCar();
bw.setName("寶馬7系");
bw.setPrice(40.0);
bw.setColor("紅色");
System.out.println(bw);
bw.runBW();
HYCar hy = new HYCar();
hy.setName("勞斯萊斯幻影");
hy.setPrice(100.0);
hy.setColor("黑色");
System.out.println(hy);
hy.runHY();
}
}
多型
同一個類,但是在不同情況下,展現結果不同的
多型其中最典型介面和實作類
需求:老虎和鷹,都有名字 name(屬性),都可以吃肉肉 eat,run(跑的快,飛的高)(方法)
1)介面:動物 Animal (它是一個特殊類,沒有實作,實作類(子類)去實作)
2)實作類:老虎 Tiger、鷹 Eagle
package cn.tedu.oop.pojo;
//介面,特點,它沒有實作方法
public interface Animal {
public void run(); //抽象方法的宣告(定義)
}
package cn.tedu.oop.pojo;
//要把實作類實作具體介面
//extends跟類,implements跟介面
//實作介面,必須實作介面中定義所有的方法
public class Tiger implements Animal{
@Override //重寫介面中方法
public void run() {
System.out.println("老虎吃肉肉");
}
}
package cn.tedu.oop.pojo;
//實作類
public class Eagle implements Animal{
@Override
public void run() {
System.out.println("老鷹飛的高");
}
}
package cn.tedu.oop.pojo;
public class Cat implements Animal{
@Override
public void run() {
System.out.println("貓抓老鼠");
}
}
package test;
import org.junit.Test;
import cn.tedu.oop.pojo.Animal;
import cn.tedu.oop.pojo.Cat;
import cn.tedu.oop.pojo.Eagle;
import cn.tedu.oop.pojo.Tiger;
public class TestAnimal {
@Test
public void animal() {
//介面 實體名稱 = new 實作類();
Animal tiger = new Tiger();
tiger.run();
Animal eagle = new Eagle();
eagle.run();
//? 多型體現在哪里,同一個Animal物件,同一個run方法,但是結果不一樣
//?這樣做有什么好處,介面好處,如果有新的類,只改變少量代碼即可實作
Animal cat = new Cat();
cat.run();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/291025.html
標籤:java
