## 內部類詳解
**內部類簡介**
~~~java
/**
* 在java文件中只能存在一個public修飾的類,但是可以存在多個類
* 外部類
*/
public class JavaDemo {
public static void main(String[] args) {
Outer out = new Outer();
out.fun();
}
}
/**
* 該類不屬于內部類,僅僅只是沒有被public修飾
* Outer相對于內部類來講,是外部類
*/
class Outer {
//定義私有 成員屬性
private String str = "Hello,world";
//定義普通方法
public void fun() {
Inner in = new Inner();//實例化內部類對象
in.print();//通過內部類對象調用內部類方法
}
//定義內部類,類名也要大寫
class Inner {
int x = 10;
//定義內部類方法
public void print() {
//Outer.this.str 可以讀作 Outer類的對象的str屬性
System.out.println(Outer.this.str);//要打印Outer類的屬性
}
}
}
~~~
**成員內部類**
~~~java
public class JavaInnerClass1 {
public int a = 10;
protected int b = 10;
private int c = 10;
int d = 10;
public static int e = 10;
final int f = 10;
public static final int G = 10;
public String fun2() {
return "普通方法";
}
public static String fun3() {
return "靜態方法";
}
class Inner{//成員內部類-沒有用static修飾,位于外部類的內部
int b1 = b;
int c1 = c;
int d1 = d;
int e1 = e;
int f1 = f;
/*static*/ int g1 = G;//不能定義static成員
String s1 = fun2();
String s2 = fun3();
public static final int X = 10;
int a = 20;
int a2 = this.a;
int a3 = JavaInnerClass1.this.a;
}
Inner in = new Inner();//創建外部類的屬性,在外部類中調用內部類實例化對象還和之前一樣
public void fun() {
Inner i = new Inner();//不需要創建外部類實例
}
public static void fun1() {
/**
* 內部類創建實例的語法:
* [外部類.]內部類 變量名 = new 外部類構造器().new 內部類構造器();
*/
JavaInnerClass1.Inner i = new JavaInnerClass1().new Inner();//需要先創建外部類的實例,再創建內部類的實例
}
public static void main(String[] args) {
JavaInnerClass1.Inner i = new JavaInnerClass1().new Inner();
System.out.println(i.b1);
System.out.println(i.c1);
System.out.println(i.d1);
System.out.println(i.e1);
System.out.println(i.f1);
System.out.println(i.g1);
System.out.println(i.s1);
System.out.println(i.s2);
System.out.println("==========");
System.out.println(i.a);
System.out.println(i.a2);
System.out.println(i.a3);
}
}
~~~
**靜態內部類**
~~~java
public class Outer2 {
Inner in = new Inner();//在外部類中不需要使用外部類引導
int x = 5;
static int y = 5;
public void fun() {
//a = 5;在外部類中不可以直接訪問內部類的成員屬性
//b = 5;在外部類中不可以直接訪問內部類的靜態屬性
Inner.b = 2;
}
static class Inner {//靜態內部類-使用static修飾,位于外部類中
int a = 10;//成員屬性
static int b = 10;//靜態屬性
Outer2 o = new Outer2();
int t = o.x;
int m = y;
}
public static void main(String[] args) {
OutClass ot = new OutClass();
ot.fun2();
System.out.println("OntClass " + ot.in.a);
System.out.println("OntClass " +Inner.b);
}
}
class OutClass {
/**
* 靜態內部類實例創建語法:
* 外部類.內部類 變量名 = new 外部類.內部類構造器();
*/
Outer2.Inner in = new Outer2.Inner();
public void fun2() {
//靜態內部類中靜態屬性的訪問語法:外部類.內部類.屬性
Outer2.Inner.b = 5;
in.a = 3;
}
}
~~~
**方法內部類**
~~~java
public class Outer3 {
public int a = 5;
static int b = 5;
private int c = 5;
//Inner in = new Inner();
//Outer3.Inner in = new Outer3.Inner();
//Outer3.Inner in = new Outer3().new Inner();
public void fun(int x) {
int a = 10;
/**
* 方法內部類只能在方法中被使用
*/
class Inner {//方法內部類-不可以用static以及訪問控制符修飾,位于方法中
int a1 = a;
int b1 = b;
int c1 = c;
int d = x;
int e = Outer3.this.a;
}
Inner in = new Inner();
System.out.println(in.a1);
System.out.println(in.b1);
System.out.println(in.c1);
System.out.println(in.d);
System.out.println(in.e);
}
public static void main(String[] args) {
Outer3 ot3 = new Outer3();
ot3.fun(3);
}
}
~~~
**匿名內部類**
~~~java
public class Outer4 {
/**
* 繼承一個類
* 實現一個接口
*/
public static void main(String[] args) {
Out ot = new Out() {//new Out(){} 是一個匿名類繼承了Out類
void show() {
System.out.println("正在調用匿名內部類的show()方法");
}
};
ot.show();
}
}
class Out {
void show() {
System.out.println("正在使用out類的show()方法");
}
}
~~~
~~~java
public class ListSort {
public static void main(String[] args) {
Person xs = new Person("徐爽",23);
Person xcl = new Person("徐春林",22);
Person gjn = new Person("高峻楠",24);
List<Person> list = new ArrayList<Person>();
list.add(xs);
list.add(xcl);
list.add(gjn);
System.out.println(list);
Collections.sort(list, new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
int age1 = o1.age;
int age2 = o2.age;
int result = age1 - age2;
return result;
}
});
System.out.println(list);
}
}
class Person {
public String name;
public int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Person() {
super();
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
~~~
- 課程開始
- 第一課20191008
- 第二課20191009
- HTML
- CSS
- CSS第一課
- CSS第二課
- CSS第三課
- CSS第四課
- CSS第五課
- JavaScript
- Js第一課
- Js第二課
- Js第三課
- Js第四課
- Js第五課
- Js第六課
- Js第七課
- Js-事件模型
- Js-2019-10-31-標準庫
- Js-2019-11-01- 標準庫
- Js-2019-11-01-Json
- Js-2019-11-01-對象的創建
- Js-2019-11-04-this的使用
- Js-2019-11-05-storage與異常
- Js-2019-11-05-BOM與補充知識點
- Js-2019-11-06-正則表達式和計時器
- jQuery
- jQuery-2019-11-13-初識jQuery
- jQuery-2019-11-14-jQuery節點操作
- jQuery-2019-11-15-jQuery節點操作二
- jQuery-2019-11-16-jQuery效果與動畫
- Java
- Java-2019-11-27-變量直接量數據格式運算符
- Java-2019-11-28-流程控制
- Java-2019-12-02-數組
- Java-2019-12-04 面向對象
- Java-2019-12-05-封裝
- Java-2019-12-06-深入構造器
- Java-2019-12-09-繼承
- Java-2019-12-10-多態
- Java-2019-12-10-包裝類
- Java-2019-12-11-final修飾符
- Java-2019-12-11-包裝類
- Java-2019-12-11-接口
- java-2019-12-13-設計模式
- Java-2019-12-16-集合框架
- Java-2019-12-18-集合排序
- Java-2019-12-23-常用類學習
- Java-2019-12-25-異常處理
- Java-2019-12-31-內部類詳解