黑馬程序員_Java基礎_this,super,static,final關鍵字

一,this關鍵字

1,當成員變量和局部變量重名時,可以使用this關鍵字來區分。

this關鍵字代表的是本類對象,this一般是在一個函數中,哪個對象在調用this所在的函數,this就代表哪個對象。

//this關鍵字的使用
class Person
{
	private String name;
	private int age;
	Person(int age)
	{
		this.age = age;
	}
	Person(String name)
	{
		this.name = name;
	}
	Person(String name,int age)
	{
		this.name = name;
		this.age = age;
	}

	public void speak()
	{
		System.out.println("name="+this.name+"...age="+this.age);
		this.show();
	}
	public void show()
	{
		System.out.println(this.name);
	}

	/*
	需求:給人定義一個用於比較年齡是否相同的功能。也就是是否是同齡人。
	*/
	public boolean compare(Person p)
	{
		return this.age==p.age;

	}
}

class PersonTest
{
	public static void main(String[] args) 
	{

		Person p1 = new Person(20);
		Person p2 = new Person(25);
		boolean b = p1.compare(p2);
		System.out.println(b);
		
		//Person p = new Person("lisi");
		//Person p1 = new Person("zhangsan");
		//p.speak();
		//p1.speak();
		//p.speak();
	}
}
2,this可以用於在構造函數中調用其他的構造函數,但是在調用其他構造函數的時候,要定義在構造函數的第一行,因爲初始化動作要先執行。

理解下面這個程序的執行過程就可以明白this在構造函數間的調用過程了。

class Person
{
	private String name;
	private int age;
	
	Person()
	{
		System.out.println("person run");
	}
	Person(String name)
	{
		this();
		this.name =name;
	}
	Person(String name,int age)
	{
		this(name);
		this.age = age;	
	}

}

class  Demo
{
	public static void main(String[] args) 
	{
		Person p = new Person("lisi",30);
	}
}

二,super關鍵字和this的用法幾乎相同,它的不同在於,super指向的是父類的對象,而this指向的是本類的對象。

下面這個程序時面向對象裏面繼承的示例代碼,裏面幾乎涵蓋了super的所有使用方法。

class Person {
	public String name;
	public int age;
	int num = 12;
	Person(String name,int age) {
		this.name = name;
		this.age = age;
	}


	/*public void setName(String name) {
		this.name = name;
	}


	public void setAge(int age) {
		this.age = age;
	}*/


	public void sayHello() {
		System.out.println(name + ":" + age);
	}
}


class Student extends Person {
	int num = 13;
	Student(String name,int age) {
		super(name,age);
	}
	// 重寫父類中的sayHello方法
	public void sayHello() {
		System.out.println("我叫:" + name + ",今年" + age + "歲了");
		System.out.println(super.num + "::" + this.num);//默認的this,可以省略
	}
}


class Demo {
	public static void main(String[] args) {
		Student s = new Student("zhangsan",25);
		/*s.setName("zhangsan");
		s.setAge(25);*/
		s.sayHello();
	}
}


三,static(靜態)關鍵字

1,static關鍵字特點:

(1)他是一個修飾符,是用來修飾成員的(成員變量和成員方法)。

(2)static修飾的成員被所有的對象共享。

(3)static優先於對象存在,因爲static的成員隨着類的加載就已經存在於內存中了。

(4)static修飾的成員可以通過類名直接調用。類名.靜態成員

(5)static修飾的數據時共享數據,對象中存儲的是特有數據。

2,成員變量和靜態變量的區別:

(1)兩個變量的生命週期不同,成員變量隨着對象的創建而存在,隨着對象的被回收而釋放。

靜態變量隨着類的加載而存在,隨着類的消失而消失。

(2)調用方式不同,成員變量只能被對象調用,靜態成員變量可以被對象調用,還可以被類名調用。

(3)別名不同,成員變量也稱爲實例變量,靜態變量稱爲類變量。

(4)數據的存儲位置不同,成員變量存儲在堆內存中,也叫做對象的特有數據,而靜態變量數據

存儲在方法區(共享數據區)的靜態區,所以也叫做對象的共享數據。

3,靜態在使用時應該注意:

(1)靜態方法只能訪問靜態成員,而非靜態成員既可以訪問非靜態成員也可以訪問靜態成員。

(2)靜態方法中不可以使用this關鍵字和super關鍵字。

(3)主函數是靜態的。

4,靜態的使用:

(1)靜態變量:

當分析對象中所具備的成員變量的值都是相同的。這時,這個成員就可以被修飾成靜態的。只要數據在對象中都是不相同的,就是對象的特有數據,必須存儲在對象中,是非靜態的。如果是相同的數據,對象不需要做修改,只需要使用即可,不需要定義在對象中,定義成靜態的。

(2)靜態函數:

函數是否用靜態修飾,就參考一點,就是該函數的功能是否有訪問到對象中的特有數據。簡單點說,從源代碼看,該功能是否需要訪問非靜態的成員變量,如果需要該功能就是非靜態的。如果不需要就可以將該功能定義成靜態的,當然也可以定義成非靜態的。但是非靜態需要對象調用,而僅創建對象調用非靜態的沒有訪問特有數據的方法,該對象的創建時沒有意義的。

(3)靜態的優缺點

優點:對對象的共享數據進行單獨空間的存儲,節省空間。沒有必要每一個對象中都存儲一份。還可以直接被類名調用。

缺點:生命週期過長。訪問出現侷限性。(靜態雖好,只能訪問靜態。)

class Person {
	int age;
	static int num = 9;
	Person(int age) {
		this.age = age;
	}
	
	public static void speak() {
		System.out.println(num);
	}
	
	public void show() {
		System.out.println("age = " + age);
	}
}

public class Test {
	public static void main(String[] args) {
		Person p = new Person(30);
		p.show();
		p.speak();//這種方式不建議使用,減一使用下面的方式
		Person.speak();
	}
}


四,靜態代碼塊

1,靜態代碼塊格式:
static
{
靜態代碼塊中的執行語句。
}

2,靜態代碼塊的特點:隨着類的加載而執行,只執行一次,並且優於主函數。主函數是程序的入口,並且是直接由JVM直接調用的。

3,靜態代碼塊的作用是給類進行初始化。

class StaticCode
{
	int num = 9;
	StaticCode()
	{
		System.out.println("c");
	}

	static
	{
		System.out.println("d");
	}
	{
		System.out.println("construct"+this.num);
	}

	StaticCode(int x)
	{
		System.out.println("e");
	}
	public static void show()
	{
		System.out.println("show run");
	}
}

class StaticCodeDemo 
{
	static
	{
		System.out.println("a");
	}
	public static void main(String[] args) 
	{
		//new StaticCode(4);//打印結果是:a,b,d,construct9,e
		//StaticCode.show(); //打印結果:a,b,d,run show
		//StaticCode s = new StaticCode(); //a,b,d,construct9,c

		//StaticCode.show();//打印結果:a,b,d,show run
	}
	static
	{
		System.out.println("b");
	}
}


五,fina關鍵字

1.fian關鍵字的特點是:

(1)可以用來修飾類,方法,變量

(2)final修飾的類不能被繼承

(3)fianl修飾的方法不可以被覆蓋

(4)fianl修飾的變量只能被賦值一次

(5)fianl既可以修飾成員變量也可以修飾局部變量,內部類只能訪問被fianl修飾的局部變量

2,什麼時候使用final呢?

當在描述事物時,一些數據的出現值是固定的,那麼這時爲了增強閱讀性,都給這些值起個名字。方便於閱讀。而這個值不需要改變,所以加上final修飾。作爲常量:常量的書寫規範所有字母都大寫,如果由多個單詞組成。單詞間通過_連接。

在java文檔中有很多字段就是fianl的,其實就是一個常量,這個常量不需要改變,所以寫成了大寫。







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章