- 繼承后構(gòu)造方法的特點(diǎn)
回憶:1.與類名一致的特殊方法念颈, 所以子類無法繼承父類的構(gòu)造方法的
2泉粉、作用是初始化成員變量,所以子類初始化過程中榴芳,必須先初始化父類嗡靡,子類構(gòu)造方法中默認(rèn)有一個super(), 表示調(diào)用父類的構(gòu)造方法窟感,父類成員初始化后才可以給子類使用讨彼。
super 和this
- super 代表父類的存儲空間標(biāo)識(父類的引用)
- 代表當(dāng)前對象的引用
用法:
- 訪問成員:
this.成員變量 本類
super.成員變量 父類
this.成員方法() 本類
super.成員方法() 父類
2、訪問構(gòu)造方法
this(...) 本類構(gòu)造方法
super(...) 父類構(gòu)造方法
子類中的構(gòu)造方法中均有默認(rèn)的super()柿祈, 調(diào)用父類的空參構(gòu)造哈误,手動調(diào)用會覆蓋默認(rèn)的super(), super()和this() 都必須在構(gòu)造方法的第一行哩至, 所以不能同時出現(xiàn)
繼承的特點(diǎn)
1、 Java只支持單繼承蜜自, 不支持多繼承
class C extends A{} // ok
class C extends A , B{} // no
2菩貌、Java支持多層繼承
頂層父類是Object類, 默認(rèn)都是繼承Object類作為父類
3重荠、子類和父類是一種相對的概念
抽象類
抽象方法:沒有方法體的方法(只有方法的聲明箭阶,沒有方法的實(shí)現(xiàn))
public abstract void run();
格式
修飾符 abstract 返回值類型 方法名(參數(shù)列表)
抽象類: 如果一個類包含抽象方法,那么該類必須是抽象類
abstract class 類名{
}
抽象類的使用
繼承抽象類的子類必須重寫父類的所有抽象方法戈鲁, 否則仇参, 該子類也必須聲明為抽象類, 最終荞彼, 必須有子類實(shí)現(xiàn)該父類的抽象方法冈敛, 否則從最初的父類到最終的子類都不能創(chuàng)建對象, 失去了意義鸣皂。
- 對于父類抽象方法的重寫抓谴, 我們一般叫做
方法的實(shí)現(xiàn)
注意事項
- 抽象類不能被創(chuàng)建對象
- 抽象類中, 可以有構(gòu)造方法寞缝,是供子類創(chuàng)建對象是癌压, 初始化父類成員
- 抽象類中,不一定包含抽象方法荆陆, 但是有抽象方法的類必定是抽象類(未包含抽象方法的類目的是不想讓調(diào)用者創(chuàng)建該類對象滩届, 通常用于某些特殊的類結(jié)構(gòu)設(shè)計)
- 抽象類的子類必須重寫所有的父類的抽象方法, 除非該子類也是抽象類
綜合練習(xí)
需求:群主發(fā)普通紅包被啼, 某群有多名成員帜消, 群主給成員發(fā)普通紅包,規(guī)則為
- 群主有一筆金額浓体, 從群主的余額中扣除泡挺, 平均分成n等分, 讓成員去領(lǐng)
-
成員領(lǐng)取紅包之后命浴,保存到成員余額中
分析:
定義User類
package com.neusoft.day09.redbag;
/**
* @author Eric Lee
* @date 2020/7/23 10:48
*/
public class User {
// 用戶名
private String userName;
// 余額
private int leftMoney;
public User() {
}
public User(String userName, int leftMoney) {
this.userName = userName;
this.leftMoney = leftMoney;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public int getLeftMoney() {
return leftMoney;
}
public void setLeftMoney(int leftMoney) {
this.leftMoney = leftMoney;
}
public void show(){
System.out.println("用戶" + userName + "\t"+"余額為" + leftMoney + "元" );
}
}
群主類
package com.neusoft.day09.redbag;
import java.util.ArrayList;
/**
* @author Eric Lee
* @date 2020/7/23 10:52
*/
public class Manager extends User {
public Manager() {
}
public Manager(String userName, int leftMoney) {
super(userName, leftMoney);
}
// 發(fā)紅包
public ArrayList<Integer> send(int totalMoney, int count){
ArrayList<Integer> redList = new ArrayList<>();
int leftMoney = super.getLeftMoney();
// 判斷
if(totalMoney > leftMoney){
System.out.println("余額不足");
}
// 扣錢
super.setLeftMoney(leftMoney-totalMoney);
// 每個人發(fā)的錢
int avg = totalMoney/count;
// 除不開余出來的錢
int mod = totalMoney%count;
for (int i = 0; i <count-1 ; i++) {
redList.add(avg);
}
int last = avg+mod;
redList.add(last);
return redList;
}
}
成員類
package com.neusoft.day09.redbag;
import java.util.ArrayList;
import java.util.Random;
/**
* @author Eric Lee
* @date 2020/7/23 10:54
*/
public class Member extends User {
public Member() {
}
public Member(String userName, int leftMoney) {
super(userName, leftMoney);
}
//收紅包
public void receive( ArrayList<Integer> list){
Random random = new Random();
int index = random.nextInt(list.size());
// Integer money = list.get(index);
// 收完之后刪除
Integer removeMoney = list.remove(index);
// 更新余額
int leftMoney = super.getLeftMoney();
int updateMoney = leftMoney +removeMoney;
super.setLeftMoney(updateMoney);
}
}
測試類
package com.neusoft.day09.redbag;
import java.util.ArrayList;
import java.util.Scanner;
/**
* @author Eric Lee
* @date 2020/7/23 10:54
*/
public class Test {
public static void main(String[] args) {
Manager manager = new Manager("群主", 200);
Member one = new Member("成員A", 0);
Member two = new Member("成員B", 0);
Member three = new Member("成員C", 0);
manager.show();
one.show();
two.show();
three.show();
Scanner scanner = new Scanner(System.in);
System.out.println("請輸入金額");
int money = scanner.nextInt();
System.out.println("請輸入發(fā)幾個包");
int count = scanner.nextInt();
// 調(diào)用發(fā)紅包
ArrayList<Integer> redList = manager.send(money, count);
// 調(diào)用收紅包
one.receive(redList);
two.receive(redList);
three.receive(redList);
manager.show();
one.show();
two.show();
three.show();
}
}
效果
String類
java.lang.String類代表字符串娄猫, Java程序中所有的字符串文字("abc")都可以被看做是實(shí)現(xiàn)此類的實(shí)例
類 String中包含大量的處理字符串的方法, 我們需要掌握生闲。
特點(diǎn):
1媳溺、字符串不可變:字符串的值在創(chuàng)建后不能更改。
2碍讯、由于不可變悬蔽,可以被共享
3、"haha" 等效于 char data[] = {'h', 'a','h', 'a'};
構(gòu)造方法
// 無參
String str = new String();
// 通過字符數(shù)組創(chuàng)建
char data[] = {'h', 'a','h', 'a'};
String s = new String(data);
// 通過字節(jié)數(shù)組創(chuàng)建
byte bytes[] = {97, 98, 99};
String s2 = new String(bytes);
String類常用方法
判斷功能相關(guān)的方法
equals方法
- equalsIgnoreCase
String s1 = "hello";
String s2 = "hello";
String s3 = "HELLO";
//將此 String 與另一個 String 比較
System.out.println(s1.equals(s2));// true
System.out.println(s1.equals(s3));// false
// 將此 String 與另一個 String 比較捉兴,不考慮大小寫屯阀。
System.out.println(s1.equalsIgnoreCase(s2)); // true
System.out.println(s1.equalsIgnoreCase(s3)); // true
獲取功能的方法
String s = "helloworld";
// 獲取字符串的長度
System.out.println(s.length());
System.out.println("++++++++++++++++++++++++++");
// 將指定的字符串連接到該字符串的末尾
String s2 = s.concat("**haha");
System.out.println(s2);
System.out.println("++++++++++++++++++++++++++");
// 獲取指定索引的字符
System.out.println(s.charAt(0));
System.out.println(s.charAt(1));
System.out.println("++++++++++++++++++++++++++");
// 返回目標(biāo)第一次出現(xiàn)的索引, 沒有返回-1
System.out.println(s.indexOf("l"));
System.out.println(s.indexOf("owo"));
System.out.println(s.indexOf("a"));
System.out.println("++++++++++++++++++++++++++");
// 從start開始 截取字符串到字符串結(jié)尾的值
System.out.println(s.substring(0));
System.out.println(s.substring(5));
System.out.println("++++++++++++++++++++++++++");
// 從start開始到end結(jié)束的截取缅帘, 左閉右開
System.out.println(s.substring(0, s.length()));
System.out.println(s.substring(3, 8)); // lowor
轉(zhuǎn)換功能的方法
String s = "helloworld";
// 轉(zhuǎn)化為字符數(shù)組
char[] chars = s.toCharArray();
for (int i = 0; i < chars.length; i++) {
System.out.println(chars[i]);
}
// 轉(zhuǎn)化為字節(jié)數(shù)組
byte[] bytes = s.getBytes();
for (int i = 0; i <bytes.length ; i++) {
System.out.println(bytes[i]);
}
// 替換
s = s.replace('h', 'H');
System.out.println(s);
s = s.replace("wo", "WO");
System.out.println(s);
分割功能
//String s = "1131225468@qq.com";
String s = "aa/bb/cc";
// String[] strings = s.split("@");
String[] strings = s.split("/");
System.out.println(Arrays.toString(strings));