抽象:主要是在觀察事物的時候,將發(fā)現(xiàn)的共有屬性,向上抽取。
人
走路:兩條腿來回擺。外八、內(nèi)八、腳跟不著地
吃東西:上牙咬下牙。吧唧、直接吞、細嚼慢咽
打架:先喊,再動手,最后出腳,實在不行,咬。詠春、太極拳、泰拳、亂來
抽象其實很簡單,只是提供規(guī)范,不提供細節(jié)。
抽象類的特點
- 抽象類和抽象方法都需要使用 abstract 關鍵來修飾
- 抽象方法只能在抽象類中書寫。
- 抽象類不能單獨創(chuàng)建,因為單獨創(chuàng)建沒有任何用,需要使用子類來繼承并且實現(xiàn)方法。
- 創(chuàng)建好子類,必須要將抽象類中的方法進行實現(xiàn),然后才能夠進行實例化使用。
1.創(chuàng)建抽象類,聲明抽象方法
public abstract class Employee {
// 聲明一個抽象方法,需要使用 abstract 關鍵字來修飾
public abstract void working();
}
子類繼承抽象類,實現(xiàn)抽象方法
public class JavaCoder extends Employee {
@Override
public void working() {
System.out.println("我是一個令 PHP 羨慕的 Java 工程師...");
}
}
2.封裝
public class Naming2 {
// 1. 接收并且存儲同學的信息(名字、年齡)
// 2. 獲取并展示同學的信息
// 3. 實現(xiàn)隨機點名
// 定義一個集合來存儲學生的信息
ArrayList<User> userList = new ArrayList<User>();
@Test
public void test(){
// 存儲數(shù)據(jù)
addUser();
// 獲取并且展示
showUsers(userList);
// 隨機點名
randomUser(userList);
}
// 3. 實現(xiàn)隨機點名
public void randomUser(ArrayList<User> userList){
// 獲取集合的長度,作為隨機的范圍,進行隨機
int index = new Random().nextInt(userList.size());
// 根據(jù)得到的隨機值,作為下標值去訪問集合中的元素
User user = userList.get(index);
// 打印信息
System.out.println("請 "+ user.getName() +" 同學起來拖地...");
}
// 2. 獲取并展示同學的信息
public void showUsers(ArrayList<User> userList){
for (User user : userList) {
System.out.println("姓名:"+ user.getName() +",年齡:" + user.getAge());
}
}
// 1. 接收并且存儲同學的信息(名字、年齡)
public void addUser(){
// 創(chuàng)建 Scanner 實例,用于接收信息的錄入
Scanner scan = new Scanner(System.in);
// 設置需要加五個學生
for(int i = 0; i < 3; i++){
// 創(chuàng)建 User 實例
User user = new User();
// 接收學生的名字信息
System.out.println("現(xiàn)在接收第"+ i +"個學生,名字為:");
user.setName(scan.next());
System.out.println("現(xiàn)在接收第"+ i +"個學生,年齡為:");
user.setAge(scan.nextInt());
// 將接收好的學生數(shù)據(jù),放在集合中進行存儲起來
userList.add(user);
}
}
}
學生類
public class User {
// 學生的名字
private String name;
// 學生的年齡
private int age;
// get 和 set 方法
// 第一種方式:快捷鍵添加 alt + shift + s
// 第二種方式:右鍵 → Source → getters and 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;
}
}
3.繼承
package com.hello.jicheng;
import org.junit.Test;
public class Demo {
// 有個爹,干爹,爺爺,干爺爺
// 繼承他的財產(chǎn),瞬間高大上。
// 繼承:大包小,小包微
// 公司:
@Test
public void test(){
// 創(chuàng)建 JavaCoder 實例
JavaCoder java = new JavaCoder();
java.working();
// 就算沒有重寫父類的方法,也可以直接使用父類中方法
// 如果子類重寫了,其實也就是在原來的基礎之上增強了
java.sayHello();
System.out.println("---------- 超完美的分割線 -----------");
// 初始化子類之后,將實例賦值給父類類型變量
Employee e = new JavaCoder();
// 再調(diào)用方法
e.working();
}
}
員工類
public class Employee {
// 員工姓名
private String name;
// 定義一個變量
int money = 2000;
// get 和 set
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// 員工工作
public void working() {
System.out.println("每天都愉快地工作...");
}
public void sayHello(){
System.out.println("我是一個超級好員工...");
}
}
員工類的子類
// 我們使用 extends 關鍵字,來繼承指定的 Employee 父類(超類)
public class JavaCoder extends Employee {
int money = 10000;
// @Override 主要是用來聲明,當前方法是從父類中重寫(重新寫了一遍,照搬父類的)出來的
@Override
public void working() {
// super 關鍵字,代表是父類的實例,主要是用來調(diào)用父類中的東西。
// super.working();
// 要使用父類中的同名變量
System.out.println("父類中的 money:" + super.money);
// 要使用子類中的同名變量
System.out.println("子類中的 money:" + this.money);
// 我在子類中,新加入的一個功能
System.out.println("我是員工,屬于 Java 開發(fā)小組,我會寫 Java 代碼...");
}
繼承的使用注意點:
宗旨:子類,永遠比父類牛。子類的功能更加豐富,子類在開發(fā)中,主要是用來增強功能的。
1. 在 Java 開發(fā)中,類只支持單繼承,不支持多繼承。只能是有一個直接的父類。
A extends B 對的,A extends B,C,D 錯的
2. 多個類可以同時繼承一個父類。
A extends C, B extends C 對的
3. 也支持多層繼承,子類的父類還可以去繼承另一個父類
A extends B,B extends C, C extends D
4. 子類和父類其實是一個相對的概念,一個類可以是某個類的父類,也可以是另外一個類的子類。
}
4.對象
①:demo
public class Demo {
@Test
public void test(){
// 實例化
Gril g = new Gril();
g.name = "翠花";
// 實例化
Bus bus = new Bus();
bus.openDoor();
bus.shangChe(g.name);
bus.closeDoor();
bus.run();
// 打車去北京
// 面向?qū)ο螅荷宪?,告訴司機,我要去北京,之后就睡覺就好。
// 至于怎么去北京,不關調(diào)用者的事情
// 去北京的功能實現(xiàn)在司機腦袋中
// 把實現(xiàn)的細節(jié)放到一個外部調(diào)用者直接訪問不到的地方,這些細節(jié)調(diào)用者不需要關心,直接執(zhí)行功能即可。
// 面向?qū)ο笏枷胫?—— 封裝、繼承、多態(tài)
// 如果我們給類的字段或者方法設置了 public 訪問權限修飾符,則所有的調(diào)用者都可以訪問,并且修改。
// 這樣不利于對象隱藏實際的實現(xiàn)細節(jié)。
// 我們可以使用另外一個私有的訪問權限修飾符 —— private,后面,我們都要使用 private 來修飾字段和方法。
User user = new User();
// 如果我們這樣賦值的話,太危險了,數(shù)據(jù)安全隱患太大
// 我們應該在賦值之后,找一個機會來做判斷,如果數(shù)據(jù)是安全和合法的話,再繼續(xù)給它設置
// user.name = "人妖";
// user.age = 1000;
// getXxx() 獲取xxx setXxx() 設置xxx
user.setName("翠花");
user.setAge(1000);
user.sayHello();
}
}
②:bus
public class Bus {
// 字段
String busNo;
String lun;
// 方法
public void run(){
System.out.println("我開得賊快,xx追不上...");
}
public void openDoor(){
System.out.println("車門開了");
}
public void closeDoor(){
System.out.println("車門關了");
}
public void shangChe(String name){
System.out.println(name + " 坐上車了..");
}
}
③:girl
public class Gril {
// 字段
String name;
int age;
// 方法
public void sitBus(){
System.out.println("我會背對你們坐公交...");
}
}
④:user
public class User {
// 此處的字段,如果沒有顯示寫出訪問權限符的話,默認是使用 public
// 成員變量
private String name;
private int age;
// 添加 get 和 set 方法
public void setName(String name){
// 局部變量
// this 代表的是當前類,主要可以作用在區(qū)別成員和局部變量上
this.name = name;
}
public void setAge(int age){
if(age > 120){
System.out.println("哥們兒,你確定還是一個人嗎?");
return;
}
this.age = age;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
public void sayHello(){
System.out.println("叫"+ name +"的那個同學,"+ age +"歲了...");
}
}