關鍵字,修飾符 變數、方法、程式碼塊、內部類
靜態變數
靜態變數是隨着類的載入(方法區的靜態常數池)載入到方法區的靜態區,與類同級也叫類變數,通過類名.形式來呼叫靜態變數,也可以通過物件來呼叫靜態變數。
儲存在方法區靜態區時會預設給靜態變數賦予系統預設初始值。
類產生的物件共用同一個靜態變數。
看靜態變數是否需要被所有的物件來共用,如果需要共用就設定成靜態變數。
方法裡可以定義靜態變數?靜態變數與類同級,只有方法被呼叫時裏面的內容才能 纔能出現,前後矛盾,不能定義
package cn.tedu.staticx;
public class StaticDemo1 {
public static void main(String[] args) {
//建立愛你Person類
Person p = new Person();
p.name = "郭靖";
p.age = 19;
p.gender = '男';
Person p1 = new Person();
p1.name = "黃蓉";
p1.age = 18;
p1.gender = '女';
//輸出
System.out.println(p.toString());
System.out.println(p1.toString());
}
}
//定義代表人的類
class Person{
//屬性
String name;
int age;
static char gender;
//定義方法來輸出物件的屬性值
public String toString(){
return this.name+","+this.age+","+this.gender;
}
}
靜態方法
靜態方法會隨着類的載入而載入到方法區的靜態區,與類同級也叫作類方法,通過類名.形式來呼叫也可以通過物件呼叫。靜態區不會對靜態方法賦予初始化值,但是被呼叫就會被載入到棧中執行。
package cn.tedu.staticx;
public class StaticDemo2 {
//靜態變數
static int i=1;
//非靜態常數
int j=2;
//靜態方法
//靜態方法可以直接使用靜態資訊不能直接使用非靜態資訊
public static void m() {
System.out.println(i);
//System.out.println(j);
}
//非靜態方法
//非靜態方法可以直接使用靜態資訊以及非靜態資訊
public void n() {
System.out.println(i);
System.out.println(j);
}
}
java中靜態資訊只能直接使用靜態資訊,但是非靜態資訊可以直接使用非靜態以及靜態。
靜態方法支援過載?支援過載
靜態方法支援重寫?不支援重寫
package cn.tedu.staticx;
public class StaticDemo3 {
public static void main(String[] args) {
//向上造型
SDemo s=new SDemo1();
//向上造型物件執行的是子類方法證明重寫
s.m();
}
}
class SDemo{
public void m(){
System.out.println(1);
}
public static void n(){}
}
class SDemo1 extends SDemo{
//註解---給計算機看的註釋
// @Override表明下面 下麪的方法是重寫方法
@Override
public void m(){
System.out.println(2);
}
//加註 加注解在報錯說明不是重寫方法
//靜態方法與類同級
//重寫---執行時多型---針對的是物件---和物件一個級別
//靜態方法就沒有提供重寫
//@Override
public static void n(){}
}
靜態方法與類同級,重寫針對的是物件級別 不一樣,靜態方法沒有提供重寫。父子類中要麼出現方法簽名一致的都是非靜態方法(重寫)要麼都是靜態方法(沒有重寫)
Arrays.sort() Arrayss.copyof() System.arraycopy() Arrays.toStringA()
靜態程式碼塊
a.可以給靜態變數進行初始化
b.預先載入資源
c.隨着類的載入而載入只載入一次
d.static修飾的靜態資訊都只載入一次
e.父子類執行順序(父類別靜態資訊-子類靜態資訊-父類別物件級別資訊-子類物件級別資訊)
package cn.tedu.staticx;
public class StaticDemo4 {
public static void main(String[] args) {
new SDemo2();
new SDemo2();
}
}
//
class SDemo2{
static int i;//靜態變數
//靜態程式碼塊
//給靜態變數進行初始化
//預先載入資源
//因爲靜態程式碼塊隨着類的載入而載入,但類只載入一次
static {
i=1;
}
{
System.out.println("構造程式碼塊");
}
public SDemo2() {
System.out.println("構造方法");
}
}
…
關鍵字,修飾符 數據、方法、類
package cn.tedu.finalx;
public class FinalDemo1 {
public static void main(String[] args) {
//當參照指向數據可以改變時表面是變數
int x=1;
//當final修飾基本數據型別時保證值不能改變
//當參照指向數據不能改變時就是常數
final int i=1;//自定義常數
int j = i + 1;
//i++;
//當final修飾參照型別數據時是地址值不能改變
final int[] arr={1,2,3};
arr[0]=10;
//arr = new int[3];
//陣列長度是被final修飾的
//arr.length=10;
}
}
最終值
當final修飾基本數據型別時,值不能改變
當final修飾參照數據型別時,地址值不能改變
當final修飾成員變數,保證物件建立完成之前給值
當final修飾靜態變數時(靜態常數),保證類載入完成之前給值
package cn.tedu.finalx;
public class FinalDemo2 {
}
class FDemo{
//保證類載入完成之前給值
final static int i;
//靜態程式碼塊可以給靜態變數進行初始化
static {
i=2;
}
//屬性--成員變數
//保證物件建立完成之前給值
/*final int i;
//來一個構造程式碼塊
{
i=2;
}*/
//構造方法
//保證每個構造方法都要賦值
/*public FDemo(){
i=2;
}
public FDemo(int j){
this();
}*/
}
最終方法
支援過載
不支援重寫
package cn.tedu.finalx;
public class FinalDemo3 {
}
class FDemo1{
public final void n(){}
//支援過載
public final void n(int i){}
}
class FDemo2 extends FDemo1{
//@Override
//不支援重寫
//public final void n(){}
}
最終類
可以繼承別的類不能被別的類繼承
package cn.tedu.finalx;
public class FinalDemo4 {
}
//最終類不能被繼承
final class FDemo3{}
//最終類可以繼承別的類
//class FDemo4 extends FDemo3{}