我們可以控制類成員變量和方法的訪問級別通過訪問說明符。
Java的訪問說明符是public,private,protected和默認訪問級別。
級別
- 公共類成員可以通過任何其他代碼訪問。
- 私有類成員只能在其類中訪問。
- 默認訪問類成員沒有訪問說明符。 類的默認功能可以在同一個包中的任何類訪問。
- 類的受保護特性可用於同一個包(如默認)中的所有類及其子類。
受保護的功能比默認功能更容易訪問。
Java的訪問矩陣
下表顯示了Java的訪問矩陣。是意味着無障礙,沒有意義無法訪問。
位置 | 私人的 | 無修飾符 | 保護 | 公開 |
---|---|---|---|---|
相同類 | Yes | Yes | Yes | Yes |
相同的包子類 | No | Yes | Yes | Yes |
相同的包非子類 | No | Yes | Yes | Yes |
不同的包子類 | No | No | Yes | Yes |
不同的包非子類 | No | No | No | Yes |
訪問修飾符及其目標
並非所有修改器都可以應用於所有功能。頂級類可能不受保護。方法可能不是短暫的。靜態可以將其應用於自由浮動代碼塊。
下表顯示了功能和修改器的所有可能組合。yes表示我們可以使用該修飾符來控制對應實體的訪問。
修飾符 | 類 | 變量 | 方法 | 構造函數 | 代碼塊 |
---|---|---|---|---|---|
public | yes | yes | yes | yes | no |
protected | no | yes | yes | yes | no |
empty accessor | yes | yes | yes | yes | yes |
private | no | yes | yes | yes | no |
final | yes | yes | yes | no | no |
abstract | yes | no | yes | no | no |
static | no | yes | yes | no | yes |
native | no | no | yes | no | no |
transient | no | yes | no | no | no |
volatile | no | yes | no | no | no |
synchronized | no | no | yes | no | yes |
三種類型的變量
Java支持三種不同生存期的變量:
- 成員變量
- 方法局部變量
- 靜態變量
類成員變量
在創建實例時創建類的成員變量,並且當對象被銷燬時被銷燬。未顯式分配值的所有成員變量在聲明期間自動分配一個初始值。成員變量的初始化值取決於成員變量的類型。
下表列出了成員變量的初始化值:
元素類型 | 初始值 |
---|---|
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d |
char | "\u0000" |
boolean | false |
對象引用 | null |
類變量(靜態變量)
這裏只是一個類變量的一個副本,它存在,而不管該類的實例數。 靜態變量在類加載時初始化;
Java this關鍵字
this
引用當前對象。
this
可以在任何方法中使用來引用當前對象。
Java 嵌套類
Java教程 - Java嵌套類
在任何類外部聲明的類是頂級類。嵌套類是聲明爲其他類或作用域的成員的類。
有四種嵌套類:
- 靜態成員類
- 非靜態成員類
- 匿名類
- 局部類
Java匿名類
匿名類是沒有名稱並同時聲明的類。您可以實例化一個匿名類,在其中指定一個表達式是合法的。
一個匿名類實例只能訪問局部最終變量和最終參數。
如何定義一個匿名類?
例子
下面的代碼聲明和實例化一個實現接口的匿名類
interface People {
abstract void speak();
}
public class Main {
public static void main(final String[] args) {
new People() {
String msg = (args.length == 1) ? args[0] : "nothing to say";
@Override
public void speak() {
System.out.println(msg);
}
}.speak();
}
}
上面的代碼生成以下結果。
Java局部類
本地類是在聲明局部變量的任何地方聲明的類。局部類與局部變量具有相同的範圍。
一個本地類有一個名稱,可以重複使用。本地類實例可以訪問周圍範圍的本地最終變量和最終參數。
Java局部類
class MyClass {
void myMethod(final int x) {
final int y = x;
class LocalClass {
int a = x;
int b = y;
}
LocalClass lc = new LocalClass();
System.out.println(lc.a);
System.out.println(lc.b);
}
}
public class Main {
public static void main(String[] args) {
MyClass ec = new MyClass();
ec.myMethod(10);
}
}
上面的代碼生成以下結果。
Java成員類
成員類是封閉類的成員。成員類的每個實例都與封閉類的實例相關聯。
成員類的實例方法可以調用實例方法封閉類和訪問封閉類實例的非靜態字段。
以下代碼具有一個名爲 EnclosingClass
的外部類和非靜態成員類命名爲 EnclosedClass
。
class EnclosingClass {
private int outerVariable;
private void privateOuterMethod() {
System.out.println(outerVariable);
}
class EnclosedClass {
void accessEnclosingClass() {
outerVariable = 1;
privateOuterMethod();
}
}
}
public class Main {
public static void main(String[] args) {
EnclosingClass ec = new EnclosingClass();
ec.new EnclosedClass().accessEnclosingClass(); // Output: 1
}
}
上面的代碼生成以下結果。
內部類成員只能在內部類中訪問,並且可能不被外部類使用。
Java靜態成員類
靜態成員類是封閉類的靜態成員。靜態成員類不能訪問包含類的實例字段並調用其實例方法。
靜態成員可以訪問包含類的靜態字段並調用其靜態方法,包括私有字段和方法。
下面的代碼有一個靜態成員類聲明。
class Demo {
public static void main(String[] args) {
Main.EnclosedClass.accessEnclosingClass();
Main.EnclosedClass ec = new Main.EnclosedClass();
ec.accessEnclosingClass2();
}
}
class Main {
private static int outerVariable;
private static void privateStaticOuterMethod() {
System.out.println(outerVariable);
}
static void staticOuterMethod() {
EnclosedClass.accessEnclosingClass();
}
static class EnclosedClass {
static void accessEnclosingClass() {
outerVariable = 1;
privateStaticOuterMethod();
}
void accessEnclosingClass2() {
staticOuterMethod();
}
}
}
靜態成員類可以聲明其封閉類的多個實現
Java 抽象類
Java教程 - Java抽象類
抽象類是抽象的想法或概念。例如,int數據類型是一個具體的數據類型,double是另一個數據類型具體數據類型。 他們都是數字。 這裏數字是一個抽象的概念。形狀是另一個例子。 我們可以有備用,矩形或三角形或圓形。 他們都是具體的,而形狀是一個抽象類。
在Java中,我們使用抽象類來定義抽象概念。 抽象概念必須有一些抽象方面。 例如,抽象概念是Shape,而抽象方面是如何計算面積。抽象概念在Java中變成抽象類,抽象方面成爲抽象方法。
語法
您可以要求通過指定子類來重寫某些方法抽象類型修飾符。要聲明抽象方法,請使用以下一般形式:
abstract type name(parameter-list);
抽象方法沒有方法體。任何包含一個或多個抽象方法的類也必須聲明爲抽象。
abstract class MyAbstractClass{
abstract type name(parameter-list);
}
abstract class MyAbstractClass {
abstract void callme();
void callmetoo() {
System.out.println("This is a concrete method.");
}
}
class B extends MyAbstractClass {
void callme() {
System.out.println("B"s implementation of callme.");
}
}
public class Main {
public static void main(String args[]) {
B b = new B();
b.callme();
b.callmetoo();
}
}
輸出:
例子
下面的代碼將 Shape
類定義爲abstract。 shape 類有抽象方法稱爲area()。 Rectangle
類擴展抽象類 Shape
併爲其自身實現area()方法。
abstract class Shape {
double height;
double width;
Shape(double a, double b) {
height = a;
width = b;
}
abstract double area();
}
class Rectangle extends Shape{
Rectangle(double a, double b) {
super(a, b);
}
double area() {
System.out.println("Inside Area for Rectangle.");
return height * width;
}
}
class Triangle extends Shape{
Triangle(double a, double b) {
super(a, b);
}
double area() {
System.out.println("Inside Area for Triangle.");
return height * width / 2;
}
}
public class Main {
public static void main(String args[]) {
Rectangle r = new Rectangle(10, 5);
Triangle t = new Triangle(10, 8);
Shape figref;
figref = r;
System.out.println("Area is " + figref.area());
figref = t;
System.out.println("Area is " + figref.area());
}
}
輸出:
Java 靜態final
Java教程 - Java靜態final
Java靜態關鍵字
靜態類成員可以獨立於該類的任何對象使用。
靜態成員可以自身使用,而不參考特定實例。
這裏展示瞭如何聲明 static
方法和 static
變量。
static int intValue;
static void aStaticMethod(){
}
限制
聲明爲靜態的方法有幾個限制:
- 它們只能調用其他靜態方法。
- 它們只能訪問靜態數據。
- 他們不能以任何方式引用this或super。
類的所有實例共享同一個靜態變量。您可以聲明一個靜態塊來初始化靜態變量。當第一次加載類時,靜態塊只被調用一次
Java final關鍵字
無法修改最終變量。 必須在聲明時初始化最終變量。最終變量基本上是一個常數。
防止覆蓋
聲明爲final的方法不能被覆蓋。