- 就是子類繼承父類的屬性和方法火诸,使得子類對象具有與父類相同的屬性和方法,子類可以訪問父類中非私有的屬性和行為荠察。
好處:
提高代碼的復用性
類與類之間產生了關系置蜀,這將是多態(tài)的前提
格式
public class 父類{
...
}
public class 子類 extends 父類{
...
}
繼承的特點
- 成員變量重復奈搜,子類覆蓋父類
- 子類訪問父類中非私有變量,使用super關鍵字類似于this盯荤。
super.父類成員變量名
- 成員方法不重名 無影響
- 成員方法重名(@Override)
方法的重寫
子父類中出現(xiàn)的重名的成員方法
(返回值類型,方法名馋吗,參數(shù)列表)完全相同
聲明不變重新實現(xiàn)
注意
子類覆蓋父類方法時,必須保證權限大于等于父類
- 繼承后構造方法的特點
回憶:
- 與類名一致的特殊方法秋秤,所以子類無法繼承父類的構造方法的
- 作用是初始化成員變量宏粤,所以子類初始化過程中,必須先初始化父類灼卢,子類的構造方法中默認有一個super()商架,表示調用父類的構造方法,父類的成員初始化后才可以給子類使用
super和this
- super 代表父類的存儲空間和標識(父類的引用)
- this代表當前對象的引用
this.成員變量 本類
super.成員變量 父類
this.成員方法() 本類
super.成員方法() 父類
2芥玉、訪問構造方法
this() 本類構造方法
super()父類構造方法
子類中的構造方法中均有默認的super()蛇摸, 調用父類的空參構造,手動調用會覆蓋默認的super()、super()和this()都必須在構造方法的第一行灿巧,所以不能同時出現(xiàn)
繼承的特點
- JAVA只支持單繼承赶袄,不支持多繼承
class C extend A{} //ok
class C extend A,B{} //no
- Java支持多層繼承
頂層父類默認都是繼承Object類
- 子類和父類是一種相對的概念
抽象類
what is 抽象方法(民工英語)
抽象方法: 沒有方法體的方法。(只有方法聲明沒有方法實現(xiàn))
public abstract void main();
- 格式
修飾符 abstract 返回值類型 方法名(參數(shù)列表)
抽象類:如果一個類包含抽象方法抠藕,那么該類必須是抽象類饿肺。
- 格式
abstract class 類名{
}
抽象類的使用
繼承抽象類的子類必須重寫父類的所有抽象方法,否則盾似,該子類也必須聲明為抽象類敬辣,最終必須有子類實現(xiàn)該父類的抽象方法。
否則從最初的父類到最終的子類都不能創(chuàng)建對象零院,失去了意義溉跃。
- 對于父類抽象方法的重寫,我們一般叫做方法的實現(xiàn)告抄。
注意事項
- 抽象類不能被創(chuàng)建對象
- 抽象類中撰茎,可以有構造方法,是供子類創(chuàng)建對象打洼,是初始化父類成員
- 抽象類中龄糊,不一定有抽象方法,但是有抽象方法的一定是抽象類(未包含抽象方法的類目的是不想讓調用者創(chuàng)建該類對象募疮,通常用于某些特殊的類結構設計)
- 抽象類的子類必須重寫父類的所有抽象方法炫惩,除非該子類也是抽象類
綜合練習
搶紅包
需求: 群主發(fā)普通紅包,某群有多名成員阿浓,群主給成員發(fā)普通紅包他嚷,規(guī)則為:
1.群主有一筆金額,從群主的余額中扣除,平均分成n等分爸舒,讓成員去領
2.成員領取紅包后保存到余額中
User: 用戶名 余額 展示信息
Manager: 群主類 發(fā)紅包
Member: 成員類 收紅包
User類
package RedBag;
public class User {
private String userName;
private int leftMonney;
public User() {
}
public User(String userName, int leftMonney) {
this.userName = userName;
this.leftMonney = leftMonney;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public int getLeftMonney() {
return leftMonney;
}
public void setLeftMonney(int leftMonney) {
this.leftMonney = leftMonney;
}
public void show() {
System.out.println("用戶" + userName + "\t" + "余額為"+ leftMonney);
}
}
Manage類
package RedBag;
import java.util.ArrayList;
public class Manage extends User {
public Manage () {
}
public Manage (String userName, int leftMoney) {
super(userName, leftMoney);
}
// 發(fā)紅包
public ArrayList<Integer> send(int totalMoney, int count){
ArrayList<Integer> redList = new ArrayList<>();
int leftMoney = super.getLeftMonney();
if(totalMoney > leftMoney){
System.out.println("余額不足");
}
super.setLeftMonney(leftMoney - totalMoney);
int avg = totalMoney / count;
int mod = totalMoney % count;
for (int i = 0; i < count - 1; i++){
redList.add(avg);
}
redList.add(avg + mod);
return redList;
}
}
Memory類
package RedBag;
import java.lang.reflect.Member;
import java.util.ArrayList;
import java.util.Random;
public class Memory extends User{
public Memory(){}
public Memory(String userName, int leftMoney){
super(userName, leftMoney);
}
//收紅包
public void receive(ArrayList<Integer> list){
Random random = new Random();
int index = random.nextInt(list.size());
Integer removeMoney = list.remove(index);
int leftMoney = super.getLeftMonney();
int updateMoney = leftMoney + removeMoney;
super.setLeftMonney(updateMoney);
}
}
Test類
package RedBag;
import java.lang.reflect.Member;
import java.util.ArrayList;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Manage manage = new Manage("群主", 200);
Memory memory1 = new Memory("成員", 0);
Memory memory2 = new Memory("成員", 0);
Memory memory3 = new Memory("成員", 0);
manage.show();
memory1.show();
memory2.show();
memory3.show();
Scanner scanner = new Scanner(System.in);
System.out.println("請輸入金額");
int money = scanner.nextInt();
System.out.println("請輸入發(fā)幾個紅包");
int count = scanner.nextInt();
ArrayList<Integer> redList = manage.send( money, count);
memory1.receive(redList);
memory2.receive(redList);
memory3.receive(redList);
manage.show();
memory1.show();
memory2.show();
memory3.show();
}
}
自己寫的
package RedBack;
import java.util.Scanner;
public class Manager {
int moneyM = 200;
static int num = 0;
static int fa;
Scanner getMoney = new Scanner(System.in);
void faRed (){
System.out.println("請輸入金額");
fa += getMoney.nextInt();
System.out.println("請輸入發(fā)幾個紅包");
num += getMoney.nextInt();
System.out.println("用戶群主余額問為"+ (moneyM - fa) +"元");
}
}
package RedBack;
import java.util.ArrayList;
import java.util.Random;
public class User extends Manager {
ArrayList<String> userNames = new ArrayList<>();
ArrayList<Integer> money = new ArrayList<>();
Random random = new Random();
void userSet () {
super.faRed();
// System.out.println(num);
int ranMoney = 0;
for (int i = 0; i < num; i++) {
userNames.add("用戶成員" + (char)(65 + i));
money.add(random.nextInt(50));
System.out.println(money.get(i));
}
int ra = random.nextInt(userNames.size());
for (int i = 0; i < num; i++) {
int sFA = fa / 3;
int mod = fa % 3;
// System.out.println(fa);
if(i == ra){
System.out.println(userNames.get(i)+(money.get(i)+ sFA + mod)+"元");
}else{
System.out.println(userNames.get(i)+(money.get(i)+ sFA)+ "元");
}
}
}
void showMsg(){
for (int i = 0; i < num; i++) {
System.out.println(userNames.get(i)+money.get(i)+"元");
}
}
}
package RedBack;
public class Test {
public static void main(String[] args) {
User user = new User();
user.userSet();
// user.showMsg();
}
}