1. 程式人生 > 其它 >Java基礎知識12

Java基礎知識12

技術標籤:java

1.static \ this \ super \ final 關鍵字的用法

1.static--靜態的【提前分配記憶體】

修飾的變數就是靜態成員變數【類變數】,可以用類名訪問,也可以用物件訪問
修飾的方法就是靜態方法【類方法】,可以用類名訪問,也可以用物件訪問
例如:

package com.wangxing.staticdemo1;
//static---關鍵字【被賦予特殊含義的單詞】
//含義:靜態的【提前分配記憶體】
//位置:1.變數資料型別前面【成員變數】---靜態成員變數【類變數】
//      靜態成員變數【類變數】命名時:變數名稱全字母大寫
//      例項變數命名時:變數名稱全字母小寫
//    2.方法的返回值前面----靜態方法【類方法】
public class TestStatic {
	//1.變數資料型別前面【成員變數】----靜態成員變數【類變數】
	//靜態成員變數【類變數】命名時:變數名稱全字母大寫
	public static String NAME="zhangsan";
	public String name="小趙";
	//2.方法的返回值前面---靜態方法【類方法】
	public static void staticMethod(){
		System.out.println("");
	}
	
	 //1.靜態成員變數【類變數】/靜態方法【類方法】可以使用類名呼叫,也可以用物件呼叫
	public void shiliMethod(){
		//類名訪問類變數
		System.out.println("TestStatic.NAME=="+TestStatic.NAME);
		//物件訪問類變數
		System.out.println("t1.NAME=="+new TestStatic().NAME);
	}
	 //2.靜態成員變數【類變數】可以在同類物件之間共享資料
	 //(同類物件即指建立物件時用不同的變數名稱儲存相同的物件。然後改變其中一個物件的資料,剩下的都會跟著改變,這就是資料共享)
	
	/*
	 * 3.靜態方法【類方法】不能出現this關鍵字
	public static void staticMethod2(){
		System.out.println("this.NAME=="+this.NAME);
	}
	*/
	
	/*
	 * 4.靜態方法【類方法】中不能訪問例項變數/例項方法
	public static void staticMethod2(){
		System.out.println(name);
		System.out.println(Lei.name);
		Lei.shiliMethod();
	}
	*/
}
//測試類
package com.wangxing.staticdemo1;
public class TestMain {

	public static void main(String[] args) {
		TestStatic t1=new TestStatic();
		TestStatic t2=new TestStatic();
		t1.shiliMethod();
		System.out.println("=========================");
		//靜態變數可以在同類物件之間共享資料
	   System.out.println("t1.NAME=="+t1.NAME);
 	   System.out.println("t2.NAME=="+t2.NAME);
 	   t1.NAME="lisi";
 	   System.out.println("t1.NAME=="+t1.NAME);
 	   System.out.println("t2.NAME=="+t2.NAME);		
	}
}

總結:1.靜態成員變數【類變數】/靜態方法【類方法】可以使用類名呼叫,也可以用物件呼叫
2.靜態成員變數【類變數】可以在同類物件之間共享資料(一個改變賦的值,其他的都會跟著改變,資料是共享的)
3.靜態方法【類方法】不能出現this關鍵字
4.靜態方法【類方法】中不能訪問例項變數/例項方法

2.this---本類物件【出現在哪一個類中就表示哪一個類的物件】

1.本類中呼叫本類的例項變數\類變數\例項方法\類方法,可以省略
2.this是不能出現在靜態方法中
例如:

package com.wangxing.test1;
//this--關鍵字【當前類的物件】
//this出現在哪一個類中就表示哪一個類的物件
public class TestThis {
	//例項變數
	public  String  testname="TestThis例項變數";
	/*
	public  TestThis(){
		System.out.println("無引數構造方法");
	}
	*/
	public  TestThis(String name){
		System.out.println("有引數構造方法,引數是name=="+name);
	}
	public  TestThis(int name){
		System.out.println("有引數構造方法,引數是name=="+name);
	}
	//例項方法
	public void  shiliMethod(){
		//在這個例項方法中使用一下當前類TestThis這個類的物件
		    TestThis  tt1=new TestThis(); //當前類TestThis這個類的物件
		//我們要在TestThis這個類中的例項方法中訪問當前類的例項變數
		//例項變數只能通過物件訪問
		    System.out.println(new TestThis().testname);
		    System.out.println(tt1.testname);
		//this--當前類的物件
		//this===new TestThis(); 等價
		//同一個類中例項方法訪問例項變數,預設this.例項變數,this可以省略
		    System.out.println(this.testname);
		    System.out.println(testname);
	}

總結:因為類中的變數【不包括區域性變數】和方法【不包括構造方法】,可以通過物件訪問
那麼我們在訪問類中的變數和方法是,就需要先建立物件
1.本類之外的其他類中,我們建立物件new 構造方法()
2.本類中,我們建立物件new 構造方法(),本類中new 構造方法()建立物件可以用this代替
這時我們認為本類的物件就是this
所以在本類中訪問本類的變數和方法使用this是可以的
java程式=物件+訊息(資訊就是指訪問,我要訪問你,給你發個資訊)

3.super--子類中表示父類物件

1.子類中訪問父類構造方法“super([引數])”。
2.子類中訪問父類的例項方法/例項變數”super.例項變數/例項方法”。
例如:

package com.wangxing.test1;
//super---父類物件
//位置:子類中
//構造方法--super([引數]);在子類中訪問父類的構造方法
//          --super.變數/方法;在子類中訪問父類的變數/方法[super==父類物件]  
//例項方法--super.變數/方法;在子類中訪問父類的變數/方法[super==父類物件]
//類方法--不能出現super關鍵字
//注意:預設我們雖創建出來的java類會繼承java.lang.Object
//java.lang.Object表示一個物件類【一切皆物件】
public class TestSuper {
//無參構造方法
	public  TestSuper(){
		super();
		new Object().getClass();
		//super===》new Object()---父類物件
		super.getClass();
	}
//有參構造方法
	public  TestSuper(String  name){
		super();
	}
//例項方法	
	public void  shiliMethod(String  name){
		//super();
		new Object().getClass();
		//super===》new Object()---父類物件
		super.getClass();	
	}
//類方法	
	public static  void  staticMethod(String  name){
		//super();
		new Object().getClass();
		//super.getClass();
	}
}

4.final---最終的

1.final修飾的變數不能被重新賦值。
2.fianl修飾的靜態成員變數叫靜態常量。【靜態常量全字母大寫】
例如: public final static String TEXT="java";
3.final修飾的方法不能被重寫。
4.final修飾的類不能被繼承,沒有子類。
例如:

//父類
package com.wangxing.finaldemo1;
//final---最終的
//final可以修飾java類,沒有子類  (即不能被繼承)
//final可以修飾java類中的方法,可以繼承,不能被重寫
//注意:抽象類/介面中的抽象方法不能使用final修飾
//final可以java類中的變數, 修飾後不能被修改【即常量】

//The type SunFinal cannot subclass the final class TestFinal
//public final class TestFinal {

public class TestFinal {
	public final String name="zhangsan";
	public static final String NAME="waangwu";
	//final修飾java類中的方法,可以被繼承但是不能被重寫
	public final void test1(){
		System.out.println("父類的方法");
	}
	public void test2(){
		final String testname="lisi";
		System.out.println("testname=="+testname);
		//final修飾的變數不能在修改
		//testname="wangwu";
	}
}
//子類
package com.wangxing.finaldemo1;
public class SunFinal extends TestFinal {
	//不能重寫被繼承的final修飾的方法
	/*Multiple markers at this line
	   - overrides  覆蓋
	  com.wangxing.finaldemo1.TestFinal.test1  位置*/

	/*public void test1(){
		System.out.println("子類重寫父類的方法");
	}*/
}

//測試類
package com.wangxing.finaldemo1;
public class TestMain {

	public static void main(String[] args) {
		//建立一個子類物件
		SunFinal sf=new SunFinal();
		sf.test1();
		//建立一個父類物件
		//final修飾的變數是常量,不能修改
		TestFinal tf=new TestFinal();
		System.out.println(tf.name);
		//tf.name="lisi";
		System.out.println(TestFinal.NAME);
		//TestFinal.NAME="wangxing";
	}

}