靜態static 如果一個成員變數使用了static關鍵字,那麼這個變數不再屬於對象自己,而是屬於所在的類,多個對象共用同一份數據 靜態static 關鍵字修飾成員變數 靜態static關鍵字修飾成員方法 一旦使用static修飾成員方法,那麼這就成為了靜態方法,靜態方法不屬於對象,而是屬於類的 如 ...
靜態static
如果一個成員變數使用了static關鍵字,那麼這個變數不再屬於對象自己,而是屬於所在的類,多個對象共用同一份數據
靜態static 關鍵字修飾成員變數
public class Student {
private String name;
private int age;
static String room;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
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;
}
}
public static void main(String[] args){
Student one = new Student("郭靖",18);
//用對象名.變數名給變數賦值
one.room = "101";
Student two = new Student("黃蓉",16);
//姓名:郭靖 年齡18 教室105
System.out.println("姓名:" +one.getName()+" 年齡"+one.getAge()+" 教室"+one.room);
//沒有對two.room賦值但是也輸出了教室101,可見被static修飾過的變數的數據是共用的
//姓名:黃蓉 年齡16 教室105
System.out.println("姓名:" +two.getName()+" 年齡"+two.getAge()+" 教室"+two.room);
}
靜態static關鍵字修飾成員方法
一旦使用static修飾成員方法,那麼這就成為了靜態方法,靜態方法不屬於對象,而是屬於類的
如果沒有static關鍵字,那麼必須首先創建對象,然後通過對象才可以使用他
有static關鍵字可以通過類名.靜態方法名調用方法
public class MethodDemo {
public void method(){
System.out.println("這是一個成員方法");
}
public static void method1(){
System.out.println("這是一個靜態方法");
}
}
public class MethodTest {
public static void main(String[] args){
MethodDemo one = new MethodDemo();
//對象名調用方法
one.method();
//對象名調用方法
one.method1();
//類名調用靜態方法
MethodDemo.method1();
}
如果有了static,都推薦使用類名稱來調用
註意事項
- 靜態不能直接訪問非靜態
public class MethodDemo {
int num ;
static int num1;
public void method(){
System.out.println("這是一個成員方法");
//成員方法訪問成員變數和靜態變數
System.out.println(num);
System.out.println(num1);
}
public static void method1(){
System.out.println("這是一個靜態方法");
//靜態方法訪問靜態變數
System.out.println(num1);
//靜態方法不能夠訪問非靜態變數
//System.out.println(num);編譯報錯
}
- 靜態方法不能使用this,因為this代表當前對象,而靜態方法屬於類。
靜態代碼塊
特點,當第一次用到本來的時候,靜態代碼塊執行唯一一次
/*格式
public class 類名{
static{}
}*/
public class StaticDemo {
static{
System.out.println("靜態代碼塊執行了");
}
public StaticDemo(){
System.out.println("構造方法執行了");
}
}
public class StaticDemotest {
public static void main(String[] args) {
//靜態代碼塊只會執行一次,並且優先於其他語句執行
StaticDemo one =new StaticDemo();
StaticDemo two = new StaticDemo();
}
}
//輸出結果
靜態代碼塊執行了
構造方法執行了
構造方法執行了
Arrays工具類
public static String toStirng(數組),將參數數組變成字元串
public static void main(String[] args) {
int[] arrays= new int[]{1,2,3,4,5};
String[] arrays1 = new String[]{"騏驥一躍","不能十步","駑馬十駕","功在不捨"};
//調用Arraysd的toString方法把數組變成字元串
String str = Arrays.toString(arrays);
String str1 = Arrays.toString(arrays1);
//列印字元串
System.out.println(str);
System.out.println(str1);
}
public static void sort(數組),按照預設升序,對數組元素排序
public static void main(String[] args) {
int[] arrays= new int[]{1,63,45,55,88};
String[] arrays1 = new String[]{"騏驥一躍","不能十步","駑馬十駕","功在不捨"};
//對數組進行排序
Arrays.sort(arrays);
Arrays.sort(arrays1);
//排序完之後,把他變成字元串,列印輸出
System.out.println(Arrays.toString(arrays));
System.out.println(Arrays.toString(arrays1));
//輸出結果如下
//[1, 45, 55, 63, 88]
//[不能十步, 功在不捨, 駑馬十駕, 騏驥一躍]
}
Arrays字元串倒序練習
public static void main(String[] args) {
//先創建一個字元串
String str = "ERsdf485dfW";
//要排序字元串,需要把字元串變成char數組,可以使用toCharArray方法
char[] chars = str.toCharArray();
//把字元串用sort方法排序好
Arrays.sort(chars);
//然後就可以for迴圈遍歷來倒序
//chars數組的最大索引為長度減一,索引為0也有元素,索引需要>=0
for(int i=chars.length-1;i>=0;i--){
System.out.println(chars[i]);
}
}
繼承
繼承的格式
public class zi extends fu{}
繼承中成員變數的訪問特點
在子父類的繼承關係當中,如果有成員變數重名,則創建子類對象時,訪問有兩種方式
直接通過子類對象訪問成員變數
等號左邊是誰,就優先有誰,沒有則向上找
public class Fu {
//父類
int num = 100;
}
public class Zi extends Fu{
//子類
int num = 200;
}
public static void main(String[] args) {
Zi zi = new Zi();
//輸出的時100還是200?
System.out.println(zi.num);//200
}
間接通過成員方法訪問成員變數
方法屬於誰,就優先用誰,沒有則向上找
public class Fu {
//父類
int num = 100;
public void methodFu(){
System.out.println(num);
}
}
public class Zi extends Fu{
int numZi = 10;
int num = 200;
public void methodzi(){
System.out.println(num);
}
public static void main(String[] args) {
Zi zi = new Zi();
//輸出的時100還是200?
System.out.println(zi.num);//200
//這個方法是子類的,優先使用子類的成員變數
zi.methodzi();//200
//這個方法是父類的,優先使用父類的成員變數
zi.methodFu();//100
}
區分子類方法中重名的三種變數
public class Fu {
int num = 10;
}
public class Zi extends Fu{
int num = 20;
public void method(){
int num = 30;
//輸出局部變數
System.out.println(num);
//輸出本類變數
System.out.println(this.num);
//輸出父類變數
System.out.println(super.num);
}
}
/*
*局部變數:
* 本類的成員變數
* 父類的成員變數
* */
public class ExtendsTest {
public static void main(String[] args) {
Zi zi = new Zi();
//調用Zi類方法
zi.method();
}
}
繼承中成員方法的訪問特點
public class Fu {
public void methodFu(){
System.out.println("父類方法");
}
public void method(){
System.out.println("父類重名方法執行");
}
}
public class Zi extends Fu{
public void methodZi(){
System.out.println("子類方法執行");
}
public void method(){
System.out.println("子類重名方法執行");
}
}
public class ExtendsTest {
public static void main(String[] args) {
Zi zi = new Zi();
//調用Zi類方法
zi.methodFu();
zi.methodZi();
//方法重名,優先使用子類方法
zi.method();
}
}
重寫(Override)
概念:在繼承關係當中,方法的名稱一樣,參數列表也一樣
重寫(Override),方法的名稱一樣,參數列表也一樣
重載(Overload),方法的名稱一樣,參數列表不一樣
繼承中構造方法的訪問特點
public class Fu {
public Fu(){
System.out.println("我是無參數的父類構造方法");
}
public Fu(int num){
System.out.println("我是有參數的父類重載構造");
}
}
public class Zi extends Fu{
public Zi(){
//在繼承關係中,編譯器都會預設贈送一個super()父類構造方法;
//而且還是在子類構造方法的第一行,所以在new對象的時候會先執行
// 父類的構造方法
// super();
super(5);
//在繼承關係中,子類會有一個預設的super();
System.out.println("子類構造方法");
}
}
/*
繼承關係中,父子類構造方法的訪問特點
1.子類構造方法當中有一個預設隱含的"super()"調用
2.子類構造可以通過super關鍵字來調用父類重載構造
super的父類構造調用,必須在構造方法的第一句
*/
public class ConstructorDemo {
public static void main(String[] args) {
Zi zi = new Zi();
//父類構造方法
//子類構造方法
}
}
super關鍵字的三種用法
1.在子類的成員方法中,訪問父類的成員變數。super.numFu
2.在子類的成員方法中,訪問父類的成員方法。super.methodFu
3.在子類的構造方法中,訪問父類的構造方法。
this關鍵字的三種用法
super關鍵字用來訪問父類內容,而this關鍵字用來訪問本類內容,用法也有三種
1.在本類中的成員方法中,訪問本類的成員變數
public class Zi extends Fu {
int num = 55;
public void athis() {
int num = 66;
System.out.println(num);//66
System.out.println(this.num);//55
}
}
2.在本類的成員方法中,訪問本類的另一個成員方法,
int num = 55;
public void athis() {
int num = 66;
System.out.println(num);//66
System.out.println(this.num);//55
}
public void bthis(){
System.out.println("bbb");
}
public void cthis(){
this.athis();
System.out.println("ccc");
}
public static void main(String[] args) {
new Zi().cthis();//輸出結果為66 55 ccc
}
3.在本類的構造方法中,訪問本類的另一個構造方法
public Zi(){
//重載構造方法兩個
//調用下一個構造方法
this(123);
}
public Zi(int n){
//調用下一個構造方法
this(1,2);
}
public Zi(int a,int b){
}
//註意this()調用跟super()一樣也必須是構造方法的第一個語句,super和this兩張構造調用,不可以同時使用。
練習
public class Fu {
int num = 5;
public Fu(){
System.out.println("我是構造方法");
}
public void method(){
System.out.println("我是父類");
}
}
public class Zi extends Fu {
int num = 6;
public void method1(){
int num = 7;
System.out.println(num);
System.out.println(this.num);
System.out.println(super.num);
}
@Override
public void method(){
super.method();
System.out.println("我是子類");
}
}
public class ConstructorDemo {
public static void main(String[] args) {
Zi zi = new Zi();
zi.method1();
zi.method();
//我是構造方法
//7
//6
//5
//我是父類
}
}
Java繼承的三個特點
1.Java語言是單繼承的,一個類的直接父類只有由唯一一個
- Java語言可以多級繼承,也就是A類繼承B類,B類繼承C類
- 一個類的直接父類是唯一的,但是父類可以由很多個子類,
抽象類
public abstract class 類名{
public abstract void 方法名(){}
//抽象類中也可以定義普通成員方法
public void 方法名(){}
}
抽象方法和抽象類的使用
- 抽象類不能夠直接new的抽象類對象
- 必須用一個子類繼承抽象類才可以使用
- 子類必須重寫抽象父類當中的所有抽象方法
- 創建子類對象進行使用
抽象方法和抽象類的註意事項
抽象類不能夠創建對象
抽象類,可以有構造方法的,是供子類創建對象時,初始化成員使用的
抽象類中,不一定包含抽象方法,但是抽象方法一定包含在抽象類中
抽象類的子類,必須重寫抽象父類的所有抽象方法
紅包案例
public class AUser {
private int money ;
private String name ;
public AUser() {
}
public AUser(int money, String name) {
this.money = money;
this.name = name;
}
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void show(){
System.out.println("我"+name+"現在的餘額是"+money);
}
}
import java.lang.reflect.Array;
import java.util.ArrayList;
public class Admin extends AUser{
public Admin() {
}
public Admin(int aBalance, String aName) {
super(aBalance, aName);
}
public ArrayList<Integer> send(int totalMoney, int count){
ArrayList<Integer> redList = new ArrayList<>();
int i= totalMoney/count;
//判斷群主有多少錢
int leftMony = super.getMoney();
if(totalMoney>leftMony){
System.out.println("餘額不足");
return redList;
}
//扣錢
super.setMoney(leftMony -totalMoney);
int avg = totalMoney/count;
int mod = totalMoney%count;
for(int d=0;d<count-1;d++){
redList.add(avg);
}
int last= avg+mod;
redList.add(last);
return redList;
}
}
import java.util.ArrayList;
import java.util.Random;
public class Menber extends AUser{
public Menber() {
}
public Menber(int money, String name) {
super(money, name);
}
public void receive(ArrayList<Integer> list){
int index = new Random().nextInt(list.size());
int delta = list.remove(index);
int money = super.getMoney();
super.setMoney(money+delta);
}
}
import java.util.ArrayList;
public class RedPacket {
public static void main(String[] args) {
Admin admin = new Admin(100,"群主");
Menber one = new Menber(0,"aaa");
Menber two = new Menber(0,"aaa");
Menber three = new Menber(0,"aaa");
admin.show();
one.show();
two.show();
three.show();
ArrayList<Integer> redList = admin.send(20,3);
one.receive(redList);
two.receive(redList);
three.receive(redList);
admin.show();
one.show();
two.show();
three.show();
}
}