1.static(靜態(tài)):修飾成員變量,成員方法,靜態(tài)塊。
靜態(tài)變量和靜態(tài)方法的調(diào)用:類名和對象名調(diào)用。調(diào)用語法:類名.靜態(tài)變量名或方法名();
對象名.靜態(tài)變量名或方法名()。
正是因為靜態(tài)的變量和靜態(tài)方法屬于類,所以它的生命周期從類加載到程序終止或掛掉。所以靜態(tài)的變量和方法比較占用資源。
(1)靜態(tài)變量:它屬于我們類,這個類中所有的對象共享這個靜態(tài)變量。
加載時間:在類加載時先加載靜態(tài)變量再加載成員變量。
語法:public static 數(shù)據(jù)類型 變量名;
適用場景:當(dāng)一個變量不屬于任何一個對象或者是所有的對象共享時,咱們就可以用靜態(tài)變量。
(2)靜態(tài)方法:它屬于類,這個類的所有對象共享。
語法:public static? 返回值類型 方法名(){};
適用場景:當(dāng)一個類為工具類,那這個類中的方法是工具方法就可以聲明靜態(tài)方法。
注:
a.在靜態(tài)方法中只能直接調(diào)用靜態(tài)方法和靜態(tài)變量,不可以直接調(diào)用非靜態(tài)的方法和非靜態(tài)變量。
但是可以在靜態(tài)方法中,通過對象名.非靜態(tài)變量或方法()來調(diào)用。
eg:Student s1=new Student();
s1.show1();
b.在非靜態(tài)方法中,既可以調(diào)用靜態(tài)變量和方法也可以調(diào)用非靜態(tài)變量和方法。
(3)靜態(tài)塊:在類加載時執(zhí)行,而且只執(zhí)行一次
語法:static{
靜態(tài)語句塊;
}
適用場景:作預(yù)處理或初始化。
2.繼承:實現(xiàn)代碼的復(fù)用性。場景:滿足 “ 子類 is-a 父類”。
(1)關(guān)鍵字:extends。
(2)被繼承的類:父類,超類,基類
繼承的類:子類,衍生類
(3)繼承的語法:
public class 父類名{
}
public class 子類名 extends 父類名{
}
(4)子類可以繼承父類的公有的屬性,方法;不能繼承父類私有的屬性和方法,構(gòu)造方法。
(5)Java中所有的類都是直接或間接繼承自O(shè)bject類。
(6)繼承的特性:
a.單根性:一個類只能直接繼承一個父類。
b.繼承的傳遞性:a類繼承b類,b類繼承c類,那么a類就間接的繼承了c類。
? ? ? ? teacher->people->object
(7)在New子類對象時,如果自己不調(diào)用父類構(gòu)造,系統(tǒng)默認先調(diào)用父類的無參構(gòu)造,再調(diào)用子類的構(gòu)造。
在New子類對象時,如果自己調(diào)用父類構(gòu)造,系統(tǒng)不會調(diào)用父類的無參構(gòu)造,就會按照自己指定調(diào)用的父類構(gòu)造執(zhí)行,執(zhí)行完了后,再調(diào)用子類構(gòu)造。
只要New子類對象,一定先調(diào)用父類構(gòu)造,再調(diào)用子類構(gòu)造。
3.super:指代的是當(dāng)前的父類對象。
super(參數(shù)列表):調(diào)用父類的構(gòu)造方法。
用super調(diào)用父類構(gòu)造時,只能寫在構(gòu)造方法中的第一句。
可以用super調(diào)用父類的屬性和方法。
4.方法重寫:
(1)適用場景:當(dāng)父類的方法,子類繼承過來后無法滿足子類需求時,子類就要重寫這個方法的方法體。就要用方法重寫。
(2)方法重寫的條件:a.有繼承? b.子類要重寫父類的方法體 c.重寫的方法上一定要有@Override注解
d.重寫的方法的方法名,參數(shù)列表一定要與父類相同,重寫的方法的返回值類型只要與父類中被重寫的方法兼容,重寫的方法的訪問修飾符比父類中被重寫的方法的訪問修飾符范圍相同或者更大就可以。
(3)@Override用來檢查當(dāng)前的方法是否是方法重寫。它會嚴格按照方法重寫的要求檢查方法。
5.Object:是所有類的父類。
(1)toString();
(2)==和equals的區(qū)別
==:是一個比較運算符,如果==左右兩邊的值是基本數(shù)據(jù)類型(int,double,long,boolean),比較的是值。
? ? ? ? ? ? ? ? 如果==左右兩邊的值是引用數(shù)據(jù)類型,比較的是內(nèi)存中的地址。
equals():是一個方法。如果equals()方法子類不重寫,它的效果是與==是一樣。
如果equals()方法子類重寫,它比較的就是值。
(3)在String類中重寫父類object類中的equals(),所以兩個字符串對象比較的時候,用equals()比較的是值
6.final:修飾類,成員變量,成員方法。
(1)常量:用final修飾的成員變量叫常量。 語法:public final 數(shù)據(jù)類型 常量名=常量值;
a.常量名全大定。
b.常量在對象初始化的時候就要賦值(在聲明時賦值或在構(gòu)造方法時賦值)。
c.常量只能賦一次值。
d.常量一旦賦值,值就不可以改。
(2)最終方法:用final修飾的成員方法叫最終方法。最終方法不能被重寫。
eg:public final 返回值類型 方法名(參數(shù)列表) { };
(3)最終類(斷子絕孫):用final修飾的類叫最終類。最終類不能被繼承。
eg:String.
7.包:管理類,避免類重名。在同一個包中,不能同名的類;在不同的包中可以有同名的類。
包名命名規(guī)范:(包名全小寫),com.公司名或者組織名.項目名.三層架構(gòu)名。
聲明包:package 包名;
在一個類中,如果想用另外一個包中的類,就要導(dǎo)包。
導(dǎo)包語法:import 包名.類名
import 包名.* 表示導(dǎo)入當(dāng)前包中所有的類。
8.訪問修飾符
修飾符 同一個類中 同一個包中 不同包
(子類中) 全局 ?
Private Yes ?
Default Yes Yes ?
Protected Yes Yes Yes ?
Public Yes Yes Yes yes
9.對象數(shù)組:存儲一組相同數(shù)據(jù)類型的數(shù)據(jù),數(shù)組中每一個空間存一個對象。
對象數(shù)組:在外層看是一個數(shù)組遵循數(shù)組的使用原則,數(shù)組中每一個空間是一個對象,遵循對象的使用原則。
eg:/**
* 學(xué)生類
* @author sx
*
*/
public class Student {
/**
* 學(xué)生姓名
*/
public String stuName;
/**
* 點名的次數(shù)
*/
public int count;
}
public static void main(String[] args) {
//int[] nums=new int[5];
//初始化學(xué)生數(shù)組
Student[] stus=new Student[5];
//因為數(shù)組中每個空間中存的是一個學(xué)生對象,所以在用時一定要先New出來才能調(diào)用屬性
stus[0]=new Student();
stus[0].stuName="科比";
stus[0].count=0;
stus[1]=new Student();
stus[1].stuName="詹姆斯";
stus[1].count=0;
stus[2]=new Student();
stus[2].stuName="安東尼";
stus[2].count=0;
stus[3]=new Student();
stus[3].stuName="保羅";
stus[3].count=0;
stus[4]=new Student();
stus[4].stuName="韋德";
stus[4].count=0;
Scanner input=new Scanner(System.in);
String answer;
do {
answer="n";
//生成一個隨機數(shù),用來點名
int r=(int)(Math.random()*5);
System.out.println("本次抽中的學(xué)員為:"+stus[r].stuName);
stus[r].count++;
System.out.println("是否繼續(xù)抽取學(xué)員回答問題?(y/n)");
answer=input.next();
} while (answer.equals("y"));
System.out.println("謝謝使用!本次學(xué)員命中信息如下:");
System.out.println("姓名\t命中次數(shù)");
for (int i = 0; i < stus.length; i++) {
System.out.println(stus[i].stuName+"\t"+stus[i].count);
}
}