1.メンバーの内部クラス
- 定義フォーマット:
クラス外部クラス{
修飾子クラスの内部クラス{}
}
- アクセス方法
メンバーの内部クラスは外部クラスに依存しています。つまり、メンバーの内部クラスを作成する場合は、外部クラスオブジェクトが存在している必要があります。
外部クラス名。内部クラス名変数名=新しい外部クラス名()新しい内部クラス名();
ケース:
/**
* 内部类
*/
public class demo1 {
public static void main(String[] args) {
//创建内部类对象
//Body.heart s=new Body().new heart();
//s.show();
Body b=new Body();
b.getheart();
}
}
class Body{
int num=1;
private class heart{
int num=2;
public void show(){
System.out.println("我是内部类中的方法");
//访问外部类中的成员变量
System.out.println(Body.this.num);
//访问外部类中的成员方法
Body.this.m1();
System.out.println(this.num);
}
}
//提供一个访问内部类的发式
public void getheart(){
heart h=new heart();
h.show();
}
public void m1(){
System.out.println("我是外部类成员");
}
}
2.ローカル内部クラス
-
ローカル内部クラスは、外部クラスメソッドで定義されたローカル位置です。ローカル内部クラスとの違いは、ローカル内部クラスへのアクセスがメソッドまたはスコープに制限されていることです。
注:ローカル内部クラスはメソッドのローカル変数のようなものであり、パブリック、保護、プライベート、または静的修飾子を持つことはできません。
- フォーマットを定義する
クラス外部クラス{
修飾子の戻り値のタイプメソッド名(パラメーター){
クラス内部クラス{
//その他のコード
}
}
}
- アクセス方法
内部クラスのメソッドで、内部クラスオブジェクトを作成してアクセスします。
注:ローカル内部クラスは、finalによって変更されたローカル変数にのみアクセスできます
理由:内部クラスオブジェクトのライフサイクルがローカル変数のライフサイクルを超える
ローカル変数の存続期間:メソッドが呼び出されると、メソッド内のローカル変数がスタックに作成され、メソッドが呼び出されると、スタックがアンロードされ、すべてのローカル変数が終了します。
他のクラスと同様に、内部クラスオブジェクトの有効期間は、ローカル内部クラスオブジェクトが作成されると、他の誰もそれを参照しない場合にのみ死にます。
したがって、メソッドが呼び出された(ローカル変数が停止した)可能性は十分にありますが、ローカルクラスのオブジェクトはまだ生きています。つまり、ローカルクラスのオブジェクトの寿命はローカル変数を超えます。
ケース:
package day0529;
/**
* 局部内部类
* 作用范围:方法内
*/
public class demo2 {
public static void main(String[] args) {
class Inner{
public void show(){
System.out.println("我是局部内部类中的方法");
}
}
Inner inner=new Inner();
inner.show();
}
}
3.匿名の内部クラス
- 目的:匿名の内部クラスは、特定のタイプのサブクラスオブジェクトを作成する便利な方法です。(匿名の内部クラスは、一度だけ使用する必要があるクラスの作成に適しています)
- フォーマット:
新しい親クラスまたはインターフェース(){
// メソッドを書き換えます
};
ケース:
package day0529;
import java.util.Scanner;
/**
* 匿名内部类
* 用法:多线程
*/
public class demo3 {
public static void main(String[] args) {
//正常方式
Zi zi=new Zi();
zi.show();
//匿名内部类
Inter inter=new Inter(){
//快捷键Alt+Enter
@Override
public void show() {
System.out.println("我是匿名内部类中的方法");
}
};
inter.show();
Abstractclass a=new Abstractclass() {
@Override
void show() {
System.out.println("使用匿名内部类创建抽象类对象");
}
};
a.show();
//普通类
Student student=new Student(){
@Override
public void show() {
System.out.println("调用m1(Student student)");
}
};
m1(student);
m2(a);
m3(inter);
}
public static void m1(Student student){
student.show();
}
public static void m2(Abstractclass aclass){
aclass.show();
}
public static void m3(Inter inter){
inter.show();
}
}
interface Inter{
void show();
}
class Zi implements Inter{
public void show(){
System.out.println("我是接口的实现方法");
}
}
abstract class Abstractclass{
abstract void show();
}
class Student{
public void show(){
System.out.println("我是普通类");
}
}