每日要點(diǎn)
面向?qū)ο蟮乃拇笾е?/h3>
-
抽象 - 定義一個(gè)類的過程就是一個(gè)抽象的過程(數(shù)據(jù)抽象、行為抽象)牵囤,
通過抽象我們可以將數(shù)據(jù)和操作數(shù)據(jù)的方法以"對象"的概念綁定到一起
抽象的過程是一個(gè)仁者見仁智者見智的過程 對同一個(gè)對象做抽象可能會產(chǎn)生不同的結(jié)果
-
封裝 - 隱藏一切可以隱藏的實(shí)現(xiàn)細(xì)節(jié) 只向外界提供最簡單的編程接口
-
繼承 - 從一個(gè)已有的類創(chuàng)建新類的過程沧踏,提供繼承信息的叫父類(超類、基類)兴蒸,
得到繼承信息的叫子類(派生類凹炸、衍生類),繼承是實(shí)現(xiàn)代碼復(fù)用的一種手段
-
多態(tài) - 同樣的引用類型調(diào)用相同的方法但是做了不同的事情
實(shí)現(xiàn)多態(tài)有兩個(gè)關(guān)鍵步驟: 1.方法重寫; 2.對象造型
抽象
通過抽象我們可以將數(shù)據(jù)和操作數(shù)據(jù)的方法以"對象"的概念綁定到一起
抽象的過程是一個(gè)仁者見仁智者見智的過程 對同一個(gè)對象做抽象可能會產(chǎn)生不同的結(jié)果
得到繼承信息的叫子類(派生類凹炸、衍生類),繼承是實(shí)現(xiàn)代碼復(fù)用的一種手段
實(shí)現(xiàn)多態(tài)有兩個(gè)關(guān)鍵步驟: 1.方法重寫; 2.對象造型
如果一個(gè)方法暫時(shí)無法給出實(shí)現(xiàn)那么可以將其聲明為抽象方法
抽象方法需要用abstract關(guān)鍵字修飾且沒有方法體
如果一個(gè)類中有抽象方法(說明這個(gè)類不完整)那么必須被聲明為抽象類
抽象類不能實(shí)例化(不能創(chuàng)建抽象類對象)
抽象是專門留給其他類去繼承的類
多態(tài)
同樣的類型調(diào)用相同的方法(發(fā)同樣的信息)
但是做了不同的事情 - 這就是多態(tài)(polymorphism)
如何實(shí)現(xiàn)多態(tài):
1.方法重寫 - 子類在繼承父類的過程中對父類的方法給出自己的實(shí)現(xiàn)版本
2.對象造型 - 用父類型的變量保存子類對象
重寫
重寫(置換采桃、覆蓋懒熙、覆寫): 父類有這個(gè)方法可能實(shí)現(xiàn)了可能沒實(shí)現(xiàn)
子類把父類的這個(gè)方法重新實(shí)現(xiàn)一次(給出自己的實(shí)現(xiàn)版本)
重載和重寫
重載 - 同一個(gè)類中有同名的方法 只要參數(shù)列表不相同就可以共存 - overload
重寫 - 子類繼承父類的過程中父類已有方法給出新的實(shí)現(xiàn)版本 - override
雜項(xiàng)
boolean類型的訪問器前綴不是get是is
Java虛擬機(jī) 可以自主操控的內(nèi)存
棧 - 快、小 - 臨時(shí)變量/局部變量
堆 - 稍慢普办、大 - 對象
方法區(qū) - 代碼工扎、常量temp 在棧上 它保存了堆上的Cat對象的地址
通過temp就可以找到堆上的對應(yīng)的Cat對象并給對象發(fā)消息
所以我們通常把對象類型的變量稱為對象的引用
Pet temp = new Cat("啦啦", Sex.FEMALE, "藍(lán)色");
System.out.println(temp);
-
Java的類型就分為兩大類
- 基本數(shù)據(jù)類型(8種)和枚舉類型
- 引用類型
instanceof 運(yùn)算符可以判斷對象是不是某種類型
該運(yùn)算符是在程序運(yùn)行時(shí)判定對象的類型 - RTTI
if (pet instanceof Dog) {
((Dog) pet).keepTheDoor();
}
- Java 中有4種訪問修飾符
private < default < protected < public
private - 一個(gè)類
default - 同一個(gè)文件夾
protected - 同一個(gè)文件夾 、 不同文件夾需要繼承
昨日作業(yè)講解
-
1.描述寵物 使用繼承 派生出貓衔蹲、狗之類的
性別枚舉:
/**
* 性別
* @author Kygo
* <br>
* MALE - 公
* FEMALE - 母
*/
public enum Sex {
MALE, FEMALE
}
寵物類:
/**
* 寵物
* @author Kygo
*
*/
public abstract class Pet {
protected String nickname;
protected Sex sex;
/**
* 構(gòu)造器
* @param nickname 昵稱
* @param sex 性別
*/
public Pet(String nickname, Sex sex) {
this.nickname = nickname;
this.sex = sex;
}
// 如果一個(gè)方法暫時(shí)無法給出實(shí)現(xiàn)那么可以將其聲明為抽象方法
// 抽象方法需要用abstract關(guān)鍵字修飾且沒有方法體
// 如果一個(gè)類中有抽象方法(說明這個(gè)類不完整)那么必須被聲明為抽象類
// 抽象類不能實(shí)例化(不能創(chuàng)建抽象類對象)
// 抽象是專門留給其他類去繼承的類
/**
* 發(fā)出聲音
*/
public abstract void makeVoice();
/**
* 吃東西
*/
public void eat() {
System.out.println(nickname + "正在吃東西.");
}
/**
* 玩耍
* @param thing 玩耍的東西
*/
public void play(String thing) {
System.out.println(nickname + "正在玩" + thing + ".");
}
/**
* 獲得昵稱
* @return 寵物的昵稱
*/
public String getNickname() {
return nickname;
}
/**
* 獲得性別
* @return "公" 或 "母"
*/
public String getSex() {
return sex == Sex.MALE ? "公" : "母";
}
}
貓類:
/**
* 寵物
* @author Kygo
*
*/
public abstract class Pet {
protected String nickname;
protected Sex sex;
/**
* 構(gòu)造器
* @param nickname 昵稱
* @param sex 性別
*/
public Pet(String nickname, Sex sex) {
this.nickname = nickname;
this.sex = sex;
}
// 如果一個(gè)方法暫時(shí)無法給出實(shí)現(xiàn)那么可以將其聲明為抽象方法
// 抽象方法需要用abstract關(guān)鍵字修飾且沒有方法體
// 如果一個(gè)類中有抽象方法(說明這個(gè)類不完整)那么必須被聲明為抽象類
// 抽象類不能實(shí)例化(不能創(chuàng)建抽象類對象)
// 抽象是專門留給其他類去繼承的類
/**
* 發(fā)出聲音
*/
public abstract void makeVoice();
/**
* 吃東西
*/
public void eat() {
System.out.println(nickname + "正在吃東西.");
}
/**
* 玩耍
* @param thing 玩耍的東西
*/
public void play(String thing) {
System.out.println(nickname + "正在玩" + thing + ".");
}
/**
* 獲得昵稱
* @return 寵物的昵稱
*/
public String getNickname() {
return nickname;
}
/**
* 獲得性別
* @return "公" 或 "母"
*/
public String getSex() {
return sex == Sex.MALE ? "公" : "母";
}
}
狗類:
/**
* 狗
* @author Kygo
*
*/
public class Dog extends Pet {
private boolean large;
/**
* 構(gòu)造器
* @param nickname 昵稱
* @param sex 性別
* @param large 是不是大型犬
*/
public Dog(String nickname, Sex sex, boolean large) {
super(nickname, sex);
this.large = large;
}
/**
* 看門
*/
public void keepTheDoor() {
System.out.println(nickname + "正在看門.");
}
// 提醒: boolean類型的訪問器前綴不是get是is
public boolean isLarge() {
return large;
}
@Override
public void makeVoice() {
System.out.println(nickname + ":汪汪汪.....");
}
}
測試類:
// 面向?qū)ο蟮乃拇笾е?:
// 抽象 - 定義一個(gè)類的過程就是一個(gè)抽象的過程(數(shù)據(jù)抽象肢娘、行為抽象)呈础,
// 通過抽象我們可以將數(shù)據(jù)和操作數(shù)據(jù)的方法以"對象"的概念綁定到一起
// 抽象的過程是一個(gè)仁者見仁智者見智的過程 對同一個(gè)對象做抽象可能會產(chǎn)生不同的結(jié)果
// 封裝 - 隱藏一切可以隱藏的實(shí)現(xiàn)細(xì)節(jié) 只向外界提供最簡單的編程接口
// 繼承 - 從一個(gè)已有的類創(chuàng)建新類的過程,提供繼承信息的叫父類(超類橱健、基類)而钞,
// 得到繼承信息的叫子類(派生類、衍生類),繼承是實(shí)現(xiàn)代碼復(fù)用的一種手段
// 多態(tài) - 同樣的引用類型調(diào)用相同的方法但是做了不同的事情
// 實(shí)現(xiàn)多態(tài)有兩個(gè)關(guān)鍵步驟: 1.方法重寫; 2.對象造型
public class PetTest {
public static void main(String[] args) {
// Java虛擬機(jī) 可以自主操控的內(nèi)存
// 棧 - 快拘荡、小 - 臨時(shí)變量/局部變量
// 堆 - 稍慢臼节、大 - 對象
// 方法區(qū) - 代碼、常量
int i = 100;
double j = 1.2345;
System.out.println(i);
System.out.println(j);
// temp 在棧上 它保存了堆上的Cat對象的地址
// 通過temp就可以找到堆上的對應(yīng)的Cat對象并給對象發(fā)消息
// 所以我們通常把對象類型的變量稱為對象的引用
// Java的類型就分為兩大類
// - 基本數(shù)據(jù)類型(8種)和枚舉類型
// - 引用類型
Pet temp = new Cat("啦啦", Sex.FEMALE, "藍(lán)色");
System.out.println(temp);
Pet[] petsArray = {
new Dog("旺財(cái)", Sex.MALE, true),
new Cat("小黑", Sex.FEMALE, "黃色"),
new Dog("花花", Sex.FEMALE, false),
new Snake("小白", Sex.FEMALE, true),
new Mistress("小三", Sex.FEMALE)
};
for (Pet pet : petsArray) {
pet.eat();
pet.play("小球");
// 同樣的類型調(diào)用相同的方法(發(fā)同樣的信息)
// 但是做了不同的事情 - 這就是多態(tài)(polymorphism)
// 如何實(shí)現(xiàn)多態(tài):
// 1.方法重寫 - 子類在繼承父類的過程中對父類的方法給出自己的實(shí)現(xiàn)版本
// 2.對象造型 - 用父類型的變量保存子類對象
pet.makeVoice();
// instanceof 運(yùn)算符可以判斷對象是不是某種類型
// 該運(yùn)算符是在程序運(yùn)行時(shí)判定對象的類型 - RTTI
if (pet instanceof Dog) {
((Dog) pet).keepTheDoor();
}
else if (pet instanceof Cat) {
((Cat) pet).climbUpTheTree();
}
else if (pet instanceof Mistress) {
((Mistress) pet).makeTrouble();
}
}
}
}
例子
-
1.設(shè)計(jì)五子棋盤
窗口類
// 重載 - 同一個(gè)類中有同名的方法 只要參數(shù)列表不相同就可以共存 - overload
// 重寫 - 子類繼承父類的過程中父類已有方法給出新的實(shí)現(xiàn)版本 - override
@SuppressWarnings("serial")
public class MyFrame extends JFrame {
public MyFrame() {
this.setTitle("五子棋");
this.setSize(650, 650);
this.setResizable(false);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
@Override
public void paint(Graphics g) {
super.paint(g);
//g.drawRect(50, 50, 300, 200);
//g.drawLine(100, 100, 500, 500);
//g.drawOval(50, 50, 300, 200);
//g.setColor(new Color(150, 200, 200));
//g.fillOval(50, 50, 200, 200);
g.setColor(new Color(240, 210, 7));
g.fillRect(0, 0, 650, 650);
g.setColor(Color.BLACK);
for (int i = 0; i < 15; i++) {
g.drawLine(40, 60 + 40 * i, 600, 60 + 40 * i);
g.drawLine(40 + 40 * i, 60, 40 + 40 * i, 620);
}
g.fillOval(316, 336, 8, 8);
g.fillOval(156, 176, 8, 8);
g.fillOval(476, 176, 8, 8);
g.fillOval(156, 496, 8, 8);
g.fillOval(476, 496, 8, 8);
((Graphics2D)g).setStroke(new BasicStroke(4));;
g.drawRect(35, 55, 570, 570);
}
}
測試類:
public static void main(String[] args) {
new MyFrame().setVisible(true);
}
-
2.工資結(jié)算系統(tǒng)
3種員工 部門經(jīng)理 程序員 銷售員
1.2W 150/h 1000 + 銷售額 5% 提成
員工類:
/**
* 員工(抽象類)
* @author Kygo
*
*/
public abstract class Employee {
protected String name;
/**
* 構(gòu)造器
* @param name 員工姓名
*/
public Employee(String name) {
this.name = name;
}
/**
* 獲得員工姓名
* @return 姓名
*/
public String getName() {
return name;
}
/**
* 計(jì)算月薪
* @return 月薪
*/
public abstract double getSalary();
}
部門經(jīng)理類:
/**
* 部門經(jīng)理
* @author Kygo
*
*/
public class Manager extends Employee {
/**
* 構(gòu)造器
* @param name 員工姓名
*/
public Manager(String name) {
super(name);
}
@Override
public double getSalary() {
return 12000;
}
}
程序員類:
/**
* 程序員
* @author Kygo
*
*/
public class Programmer extends Employee {
private int workingHour;
/**
* 構(gòu)造器
* @param name 員工姓名
*/
public Programmer(String name) {
super(name);
}
/**
* 設(shè)置本月工作時(shí)間
* @param workingHour 工資時(shí)間(以小時(shí)為單位)
*/
public void setWorkingHour(int workingHour) {
this.workingHour = workingHour;
}
@Override
public double getSalary() {
return 150 * workingHour;
}
}
銷售員類:
/**
* 銷售員
* @author Kygo
*
*/
public class Salesman extends Employee {
private double sales;
/**
* 構(gòu)造器
* @param name 員工姓名
*/
public Salesman(String name) {
super(name);
}
/**
* 設(shè)置本月銷售額
* @param sales 銷售額(以元為單位)
*/
public void setSales(double sales) {
this.sales = sales;
}
@Override
public double getSalary() {
return 1500 + sales * 0.05;
}
}
工資結(jié)算系統(tǒng)測試類:
// 工資結(jié)算系統(tǒng) 3種員工 部門經(jīng)理 程序員 銷售員
// 1.2W 150/h 1000 + 銷售額 5% 提成
class SalarySystem {
public static void main(String[] args) {
// Java 中有4種訪問修飾符
// private < default < protected < public
// private - 一個(gè)類
// default - 同一個(gè)文件夾
// protected - 同一個(gè)文件夾 珊皿、 不同文件夾需要繼承
Employee[] empsArray = {
new Manager("A經(jīng)理"),
new Manager("B經(jīng)理"),
new Programmer("C員"),
new Salesman("小d"),
new Salesman("小e")
};
Scanner input = new Scanner(System.in);
for (Employee e : empsArray) {
if (e instanceof Programmer) {
System.out.print("請輸入" + e.getName() + "本月工作時(shí)間: ");
int workingHour = input.nextInt();
((Programmer) e).setWorkingHour(workingHour);
}
else if (e instanceof Salesman) {
System.out.print("請輸入" + e.getName() + "本月銷售額: ");
double sales = input.nextDouble();
((Salesman) e).setSales(sales);
}
System.out.printf("%s本月工資為: ¥%.2f\n",
e.getName(), e.getSalary());
}
input.close();
}
}
作業(yè)
-
1.設(shè)計(jì)一個(gè)繪圖系統(tǒng)
圖形:
中心點(diǎn)坐標(biāo)网缝、顏色
算周長、面積蟋定、畫圖
支持畫矩形粉臊、圓、等邊三角形
圖形類:
@SuppressWarnings("serial")
public abstract class Figure extends JFrame{
protected int centerPointX;
protected int centerPointY;
protected int height;
protected int width;
protected Color color;
public Figure(Color color) {
this.setTitle("繪圖");
this.setSize(1000, 600);
this.setResizable(false);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.color = color;
}
public abstract double permeter();
public abstract double area();
public void setCenterPointX(int centerPointX) {
this.centerPointX = centerPointX;
}
public void setCenterPointY(int centerPointY) {
this.centerPointY = centerPointY;
}
public void setWidth(int width) {
this.width = width;
}
public void setHeight(int height) {
this.height = height;
}
public void setColor(Color color) {
this.color = color;
}
}
圓類:
@SuppressWarnings("serial")
public class Circle extends Figure {
private int radius;
public Circle(Color color) {
super(color);
}
@Override
public void paint(Graphics g) {
super.paint(g);
int x = centerPointX - radius;
int y = centerPointY - radius;
g.setColor(color);
g.fillOval(x, y, width, height);
}
public void setRadius(int radius) {
this.radius = radius;
}
@Override
public double permeter() {
return 2 * Math.PI * radius;
}
@Override
public double area() {
return Math.PI * radius * radius;
}
}
矩形類:
@SuppressWarnings("serial")
public class Rectangle extends Figure {
public Rectangle(Color color) {
super(color);
}
@Override
public void paint(Graphics g) {
super.paint(g);
int x = (int) (centerPointX - width * 0.5);
int y = (int) (centerPointY - height * 0.5);
g.setColor(color);
g.fillRect(x, y, width, height);
}
@Override
public double permeter() {
return 2 * (width + height);
}
@Override
public double area() {
return width * height;
}
}
測試類:
//設(shè)計(jì)一個(gè)繪圖系統(tǒng)
//圖形:
//中心點(diǎn)坐標(biāo)驶兜、顏色
//算周長扼仲、面積、畫圖
//支持畫矩形促王、圓犀盟、等邊三角形
public class Test {
public static void main(String[] args) {
Figure[] figure = {
new Rectangle(Color.red)
//new Circle(Color.BLUE)
};
Scanner input = new Scanner(System.in);
for (Figure f : figure) {
System.out.print("請輸入中心坐標(biāo)的橫縱坐標(biāo): ");
int x = input.nextInt();
int y = input.nextInt();
f.setCenterPointX(x);
f.setCenterPointY(y);
System.out.print("請輸入圖形的寬和高: ");
int width = input.nextInt();
int height = input.nextInt();
f.setWidth(width);
f.setHeight(height);
if (f instanceof Rectangle) {
System.out.printf("矩形的周長: %.2f 面積: %.2f", f.permeter(), f.area());
}
else if (f instanceof Circle) {
System.out.print("請輸入圓的半徑: ");
int radius = input.nextInt();
((Circle) f).setRadius(radius);
System.out.printf("圓的周長: %.2f 面積: %.2f", f.permeter(), f.area());
}
f.setVisible(true);
}
input.close();
}
}