牛人教您Java基礎-內部類

內部類

// 外部類

class Demo{

private int num = 3;

// 定義內部類

class Int{

void show(){

System.out.println("num="+num);

}

}

void method(){

Int int = new Int();

int.show();

}

}

class Inner{

public static void main(Stirng[] args){

Demo demo = new Demo();

demo.method();

}

}

內部類可以直接訪問外部類,但是外部類要訪問內部類中的成員變量,就必須要創建內部類的對象。

牛人教您Java基礎-內部類

class Outer{

class Inner{

….

}

}

外部類如果不創建外部類對象,就不能直接創建內部了對象

內部類可訪問外部類,而且不破壞封裝

內部類的分類:

  1. 靜態內部類
  2. 局部內部類
  3. 成員內部類
  4. 匿名內部類

成員內部類:

在成員變量的位置上定義的類為成員內部類。如果要使用成員內部類就要使用外部類.內部類來訪問。

使用外部類的名字來訪問,是因為一個內部類可能有不同的外部類。要有一個內部類,必須要有外部類的對象,因為成員內部類要用外部類訪問。

成員內部類可以訪問外部類的所有屬性,成員內部類不能定義有靜態屬性。

靜態內部類:

在成員位置上用static修飾的內部類為靜態內部類。靜態內部類只能訪問外部類的靜態成員和本內部類的成員;且不能訪問外部類的非靜態成員。

局部內部類:

局部,在一個方法中內的類,為局部內部類,局部內部類不能用訪問修飾符,作用域在定義的它的區域內。

局部內部類可以訪問外部類的成員屬性和靜態屬性,也可以訪問final修飾的局部變量,但不能訪問非final的局部變量。

匿名內部類:

是一種特殊的局部內部類。

訪問外部類中的內部類,非靜態

Outer.Inner int = new Outer().new Innter();

對靜態內部類中的非靜態成員

Outer.Inner int = new Outer().new Innter();

非靜態內部類中不允許定義靜態成員,內部類被靜態修飾後,隨著外部類的加載而加載。

內部類

內部類:

在類Out的內部中定義一個類為Int,此時的Int類為內部類,Out則為外部類。內部類可被修飾為public或private,當對其訪問的限制和成員變量和方法相同。

內部類格式:

標識符 class 外部類的名稱 {

// 外部類的成員

標識符 class 內部類的名稱{

//內部類的成員

}

}

實例:

class Student{

int score = 100;

void add(){

Shu shu = new Shu();

shu.show();

}

class Shu{

void show(){

System.out.println("成績"+score);

}

}

}

// 測試

public class Demo{

public static void main(String[] args){

Student stu = new Student();

stu.add();

}

}

用static聲明的內部類,則內部類變成外部類,用static聲明的內部類不能訪問非static的外部類屬性,外部類的屬性要用static才能訪問。

內部類用static修飾的,無法訪問外部類的非static類型的屬性。

// 下方代碼出錯

class Student{

int score = 100;

void add(){

Shu shu = new Shu();

shu.show();

}

static class Shu{

void show(){

System.out.println("成績"+score);

}

}

}

// 測試

public class Demo{

public static void main(String[] args){

Student stu = new Student();

stu.add();

}

}

在類外部引用內部類

class Student{

int score = 100;

void add(){

Shu shu = new Shu();

shu.show();

}

public class Shu{

void show(){

System.out.println("成績"+score);

}

}

}

// 測試

public class Demo{

public static void main(String[] args){

Student stu = new Student();

Student.Stu inner = stu.new Shu();

// Stuent.Stu inner = new Student().new Shu();

inner.show();

}

}

在方法中定義內部類

class Student{

int score = 100;

void add(){

class Shu{

void show(){

System.out.println("成績"+score);

}

}

Shu shu = new Shu();

shu.show();

}

}

// 測試

public class Demo{

public static void main(String[] args){

Student stu = new Student();

stu.add();

}

}

final類型的局部變量

在內部類中的final類型的局部變量,可以被訪問,用final修飾的相當於一個常量,可以訪問。

// 錯誤

class Student{

int score = 100;

void add(final int s){

int t = 20;

class Shu{

void show(){

System.out.println("成績"+score+s+t);

}

}

Shu shu = new Shu();

shu.show();

}

}

// 測試

public class Demo{

public static void main(String[] args){

Student stu = new Student();

stu.add();

}

}

改:final int t = 20;

class Student{

int score = 100;

void add(final int s){

final int t = 20;

class Shu{

void show(){

System.out.println("成績"+score+s+t);

}

}

Shu shu = new Shu();

shu.show();

}

}

// 測試

public class Demo{

public static void main(String[] args){

Student stu = new Student();

stu.add();

}

}

內部類

內部類可以使用外部類所有的方法和變量,就算被私有化也一樣可以,如:

class Outer{

private int x;

// 創建內部類的實例

Inner inner = new Inner();

public void do(){

// 調用內部類的方法

inner.go();

}

// 內部類

class Inner{

void go(){

x = 30;

}

}

小編每天會定期更新論文及視頻,希望大家多多關注與支持 每天晚上20:00會在騰訊課堂上分享免費往期乾貨QQ:561487941


分享到:


相關文章: