java中speak方法的意思_Java中的關鍵字

首先是訪問控制的關鍵字,分

public、protected、default、private四種,權限如下:

(權限)      public      protected     default     private

同一類中      ok            ok           ok          ok

同一包中      ok            ok           ok

子類中        ok            ok

不同包中      ok

public的權限是最大的,private權限最小

下面是一些常用的關鍵字:

一、final

(一)final修飾的屬性

被final修飾的屬性表示此變量為常量,

一旦賦值則不能被改變,

如下面類中的CONSTANT:

class Person{

public final int CONSTANT;

public Person()

{

CONSTANT = 8;

//CONSTANT = 9;//編譯器報錯,final類型CONSTANT已被初始化,不能被修改

}

}

當然也可以在這個常量聲明的時候就給它賦值,這樣在其他地方就不能再修改了。

雖然final修飾的變量不能被修改,但依然可以被繼承並使用,只不過同樣地不能在子類中修改此常量。

下面用一個子類繼承上面的Person類:

class Student extends Person{

public Student()

{

//CONSTANT++; //錯誤,不能修改常量

System.out.println(CONSTANT); //正確,可以在子類中使用此常量

}

}

另外因為常量的特殊性,所以在創建常量時一般用全大寫,如上面的CONSTANT,以區分和常量和一般變量。

(二)final修飾的方法

被加final關鍵字的方法或屬性是不能被繼承的類修改的。將方法聲明為final,那就說明你已經知道這個方法提供的功能已經滿足你要求,不需要進行擴展,並且也不允許任何從此類繼承的類來覆寫這個方法,但是繼承仍然可以繼承這個方法,也就是說可以直接使用。

如有一個Person類:

class Person{

public final void speak()

{

System.out.println("我是父類");

}

}

這個Person類有一個final修飾的方法speak(),然后我們讓另一個類Student繼承它:

class Student extends Person{

//public void speak()

//{

//System.out.println("我是學生");

//}

// 編譯器報錯,不能重寫此方法。

public static void main(String[] args) {

new Student().speak();

}

}

可以發現,如果在Student里面重寫speak()方法編譯器會報錯,這是因為在Person里面已經將speak()定義為final類型了,而另一方面,雖然不能在Student里面重寫此方法,但從主函數里可以看到依然可以在Student里面調用speak()方法,這說明speak()方法依舊能被繼承,只不過不可被重寫。

二、static

static表示“全局”或者“靜態”的意思,用來修飾成員變量和成員方法,也可以形成靜態static代碼塊。被static修飾的成員變量和成員方法獨立於該類的任何對象。

(一)被static修飾的成員變量

如下,當一個變量被聲明為static時,在其他類中要引用此變量時,可以不用創建一個特定的對象,而是可以直接通過類名來調用:

class Person{

public static String s = "ddd";

}

class Student{

public Student()

{

System.out.println(new Person().s);

}

}

當然也可以通過創建對象來調用此靜態變量,但是因為被static修飾的成員變量獨立於該類的任何對象這種特殊性,如果某一個對象修改了這個靜態變量,則會永久修改這個變量值直到另一個對象再次修改,代碼如下:

class Person{

private static String name;

public Person(String name)

{

this.name = name;

}

public void speak()

{

System.out.println(name+" is speaking");

}

public static void main(String[] args) {

Person p1 = new Person("小名");

Person p2 = new Person("小芳");

p1.speak();

p2.speak();

}

}

如果name這個屬性不是static的,結果顯而易見應該是小名 is speaking和小芳 is speaking,但是當name有static修飾的時候,運行結果反而是:

小芳 is speaking

小芳 is speaking

這是因為當創建第一個對象時,我們賦給了name一個值“小名”,然后再創建另一個對象賦值給name另一個值“小芳”,應該注意到這兩個name實際上是一個name,修改之后這個類的所有對象共享的name就是“小芳”了,所以后面無論用哪個對象去調用name,結果都是“小芳”。

(二)被static修飾的方法

在static修飾的方法中只能引用本類的靜態成員變量

class Person{

private static String name;

private String sex;

public static void speak()

{

System.out.println(name);

//System.out.println(sex); //錯誤,應在name前聲明static

}

}

當然靜態成員變量可以在非靜態方法內使用。而且在靜態方法中,可以引用其他類的非靜態常量。另外需要注意的是在靜態方法中就不能使用this了,因為此方法無需創建對象。

(三)靜態域

靜態域也叫靜態代碼塊,是在類中獨立於類成員的static語句塊,可以有多個,位置可以隨便放,它不在任何的方法體內,JVM加載類時會執行這些靜態的代碼塊,如果static代碼塊有多個,JVM將按照它們在類中出現的先后順序依次執行它們,每個代碼塊只會被執行一次。

值得注意的是靜態方法塊執行先於構造方法,如下:

public class Person{

static{

System.out.println("前靜態代碼塊");

}

public Person()

{

System.out.println("構造方法");

}

static{

System.out.println("后靜態代碼塊");

}

public static void main(String[] args)

{

new Person();

}

}

運行結果為:

前靜態代碼塊

后靜態代碼塊

構造方法

在接口中聲明成員變量時往往會同時用到final和static,這是因為接口應要標准化,內容不能被隨意更改。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值