Java面向對象--關鍵字(super、static、final)

Java關鍵字是電腦語言裏事先定義的,有特別意義的標識符,有時又叫保留字,還有特別意義的變量。Java的關鍵字對Java的編譯器有特殊的意義,他們用來表示一種數據類型,或者表示程序的結構等,關鍵字不能用做變量名、方法名、類名、包名和參數。本篇博客介紹super、static和final關鍵字的具體用法。html


目錄:java

☍ super關鍵字安全

☍ static關鍵字函數

☍ final關鍵字工具


☍ super關鍵字

super關鍵字的使用

在Java類中使用super來調用父類中的指定操做:ui

☃ super可用於訪問父類中定義的屬性this

☃ super可用於調用父類中定義的成員方法.net

☃ super可用於在子類構造器中調用父類的構造器設計

super.變量名;  //調用父類屬性
super.方法名(參數列表);   //調用父類方法
super(參數列表);   在構造器中調用父類構造器

✦ 若是子類和父類沒有同名成員,使用時能夠省略supercode

注意:

➥ 尤爲當子父類出現同名成員(同名屬性和方法)時,能夠用super代表調用的是父類中的成員

➥ super的追溯不只限於直接父類,還包括間接父類(父類的父類...)

➥ super和this的用法相像,this表明本類對象的引用,super表明父類的內存空間的標識

✦ 使用this訪問屬性和方法時,若是在本類中未找到,會從父類中查找,super則是直接從父類中尋找

✦ 總結而言this和super主要就是解決成員重名問題,若不重名使用時均可以省略

super關鍵字調用父類的構造器

☃ 子類中全部的構造器默認都會訪問父類中空參的構造器

☃ 當父類中沒有空參數的構造器時,子類的構造器必須經過this(參 參
表 數列表)或者super( 參數列表)語句指定調用本類或者父類中相應的
構造器。而且this()和super()只能在構造器中出現一個,且必須放在構造器的首行

☃ 若是子類構造器中既未顯式調用父類或本類的構造器,且父類中又沒有無參的構造器,則編譯出錯

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

public class Student extends Person{
    private char sex;
    public Student(String name,int age,char sex){
        super(name,age);
        this.sex = sex;
    }
    public Student(String name,char sex){
        super(name);
        this.sex = sex;
    }
    public Student(String sex){
       // this.sex = sex;   編譯出錯,父類沒有空參構造函數super();
    }
}

this和super的區別

區別 this/this(參數列表) super/super(參數列表)
1 訪問屬性 訪問本類中的屬性,若是本類沒有此屬性則從父類中繼續查找 直接訪問父類中的屬性
2 調用訪問 訪問本類中的方法,若是本類沒有此方法則從父類中繼續查找 直接訪問父類中的方法
3 調用構造器 調用本類構造器,必須放在構造器的首行 調用父類構造器,必須放在子類構造器的首行

☍ static關鍵字(重點)

static關鍵字概述

當咱們編寫一個類時,其實就是在描述其對象的屬性和行爲,而並無產生實質上的對象,只有經過new關鍵字纔會產生出對象,這時系統纔會分配內存空間給對象,其方法才能夠供外部調用。咱們有時候但願不管是否產生了對象或不管產生了多少對象的狀況下,某些特定的數據在內存空間裏只有一份,例如全部中國人對象都擁有一個國籍‘中國’,這個屬性沒必要在聲明中國人對象像時去爲每個對象都單獨分配一個用於表明國家名稱的變量。

static關鍵字聲明的屬性和方法是靜態變量和靜態方法,或者稱爲類屬性和類方法,是做用於全局的,聲明爲static的屬性和方法在內存中是惟一的,任何該類對象對類屬性和方法的修改都會影響其餘對象的調用結果。

static屬性和方法的設計思想

☃ 類屬性做爲該類各個對象之間共享的變量。在設計類時,分析 哪
些屬性 不因對象的不一樣而改變,將這些屬性設置爲類屬性。相應的方法設置爲類方法。

☃ 若是方法與調用者無關,則這樣的方法一般被聲明爲類方法,因爲不須要建立對象就能夠調用類方法,從而簡化了方法的調用。

static關鍵字的使用和特色

☃ 在Java類中,可用static修飾成員變量、方法、代碼塊、內部類

特色:

➥ 隨着類的加載而加載,優先於對象存在

➥ 修飾的成員,被全部對象所共享

➥ 訪問權限容許時,可不建立對象,直接被類調用

➥ 因爲類只會加載一次,因此靜態成員在內存中也只會存在一個。存在方法區的靜態域中

靜態變量和靜態方法

☃ 靜態變量由該類的全部實例共享 ,沒有對象的實例時,能夠經過「類.靜態變量」的方式調用

☃ 沒有對象的實例時,能夠用「類名.方法名()」的形式訪問由static修飾的類方法

例子:

public class StaticTest {
/*
 * static關鍵字
 * 一、static:靜態的,類的
 * 二、static能夠用來修飾屬性,方法,代碼塊,內部類
 * 三、static靜態變量(類屬性)
 *   3-一、屬性:按是否使用了static修飾,分爲靜態屬性 vs 非靜態屬性(實列變量)
 *  	實例變量:咱們建立了類的多個獨享,每一個獨享都獨立擁有類中的非靜態屬性,當修改其中一個對象中的非靜態屬性時,
 *  		        不會致使其餘對象中一樣的屬性值的改變
 *  	靜態變量:咱們建立子類的多個對象,多個對象共享同一個靜態變量,當經過某一個都對象修改靜態變量時,
 *   		        會致使其餘對象調用此驚天變量時,是調用修改過的變量
 *   3-二、static修飾的其餘說明
 *      (1)、靜態變量隨着類的加載而加載
 *      (2)、靜態比變量的加載早於都對象的建立,能夠經過類.靜態變量的方式調用
 *      (3)、因爲類只會加載一次,因此靜態變量在內存中也只會存在一個。存在方法去的靜態域中
 * 四、static靜態方法(類方法)
 * 	4-一、隨着類的加載而加載,能夠經過‘類.靜態方法()’的方式調用
 * 	4-二、靜態方法中,只能調用靜態的成員
 *  	非靜態方法中,能調用靜態和非靜態的成員
 *  
 * 注意:
 * 一、在靜態的方法中,不能使用this和supper關鍵字
 * 二、不能重寫靜態方法
 * 
 * 開發中何時使用
 * 一、屬性能夠被多個對象共享,不會隨着對象的不一樣而不一樣
 * 二、開發中,操做靜態屬性的方法一般設置爲static方法
 * 三、工具類中的方法,習慣聲明爲static的,好比:Math、Arrays、Collections
 */
	static double PI = 3.14;
	static int distance;
	char nuit;
	public static void main(String[] args) {
		Chinese c1 = new Chinese();
		c1.name = "張三";
		c1.age = 30;
		Chinese c2 = new Chinese();
		c2.name = "李四";
		c2.age = 30;
		c1.nation = "CHN";
		System.out.println(c2.name + "國籍:" + c2.nation);
		 // 本類中不用建立對象就能夠訪問靜態成員
		System.out.println("PI:" + PI);
		run();
		//調用其餘類的靜態變量和靜態方法
		System.out.println(Chinese.nation);
		Chinese.eat();
	}
	
	public static void run() {
		//nuit = '米'; 錯誤,在static 方法內部只能訪問類的 的static修飾的屬性或方法
		//this.distance = 3000;tatic方法中不能有this和supper
		distance = 1000;
		System.out.println("跑了:" + distance);
	}
}

class Chinese{
		String name;
		int age;
		static String nation;
		
		public static void eat() {
			System.out.println("吃飯");
		}
}

注意:

➥ 在static方法內部只能訪問類的的static修飾的屬性或方法,不能訪問類的非static的結構

➥ 由於不須要實例就能夠訪問static 方法,所以static 方法內部不能有this和supper

➥ static 修飾的方法不能被重寫


☍ final關鍵字

final關鍵字的使用

在Java中聲明類、變量和方法時,可以使用關鍵字final來修飾,表示「最終的」。

☃ final標記的類不能被繼承。提升安全性,提升程序的可讀性。

☄ 例如:String類、System類、StringBuffer類

☃ final 標記的方法不能被子類重寫

☄ 例如:Object類中的getClass()方法

☃ final標記的變量(成員變量或局部變量)即稱爲常量。名稱大寫,且只能被賦值一次,賦值後不可在其餘類和方法中更改。

☄ final標記的成員變量必須在聲明時或在每一個構造器中或代碼塊中顯式賦值,而後才能使用。

☄ 例如:Math中的PI(public static final double PI = 3.14159265358979323846;)

/*final:最終的
 * 一、final能夠用來修飾的結構:類、方法和變量
 * 二、final用來修飾類:final類不能被其餘類繼承,好比String類,System類,Buffer類
 * 三、final用來修飾方法:不能被子類重寫,如:Object類中的getClass()方法
 * 四、final用來修飾變量,此時的變量稱爲常量
 * 	4-一、final能夠賦值的位置:顯示初始化,代碼塊中初始化,構造器中初始化(聲明的每一個構造器中都要初始化final屬性)
 * 	4-二、final修飾形參時,代表形參是一個常量,當咱們在調用方法時賦值後,在方法體內能使用該形參,但不可修改
 * 
 * static final 修飾屬性:全局常量
 * static final 修飾方法:全局方法
 */
public class finalDemo {
	//必需要給final變量賦值,賦值後不可再修改
	//final int MAX; 錯誤
	final double R = 1.314;  //顯示賦值
	final double PI;
	final String NATION;
	{  //代碼塊賦值
		NATION = "China";
	}
	public finalDemo() {
		PI =  3.1415926;   //構造器賦值
	}
	public finalDemo(int n) {
		PI = n;   //此處還需初始化,由於PI爲常量,在調用重載構造器時,系統不肯定是否給PI賦過值適合不一樣對象又不一樣的final屬性
		//this.R = n;   不可使用this.fianl屬性的方式初始化,
		//由於this指向當前對象,一旦對象建立,fianl屬性的值也應當已經肯定,不可再修改
	}
	public void setPI() {
		//this.PI = 3.14;  不能夠修飾final屬性的值
	}
	//fianl常量形參
	public void setNum(final int num) {
		//num = 32;  錯誤,不可修改
		System.out.println("num:" + num);
	}
}

final class  FinalA{	
}

/*final類不能被繼承
class B extends FinalA{	
}*/

class A{
	final public void shout() {
		System.out.println("hello world");
	}
}
class B extends A{
	/*不能重寫final方法
	 * public void shout() {
		System.out.println("hello China");
	}*/
}

本博客與CSDN博客༺ཌ༈君☠纖༈ད༻同步發佈

相關文章
相關標籤/搜索