1 内部类
定义
一个类定义在另一个类里面,作为外部类的一个成员,
内部类可以被 private 修饰——当且仅当该类为内部类时
访问规则
1 内部类可直接访问外部类的所有类型成员
- 访问格式 外部类名.this.成员名
2 外部类想访问内部类成员,需要在访问前先建立内部类的对象
3 不能在 外部类外 直接建立内部类的对象,因为内部类基于外部类的存在而存在
- 在外部类访问内部类对象的格式
外部类名.内部类名 内部类的对象=new 外部类名().内部类名()
4 当内部类中有 静态成员时,该内部类也必须是 静态 的
应用场景
- 当某个类除了它的外部类,不再被其他的类使用时
- 待续……
示例代码
class Outer
{
private int num=4;
public void method_out()
{
System.out.println("Hello Outer");
//外部类访问内部类,先建立内部类对象
Inner i=new Inner();
i.function();
}
class Inner
{
int num=3;
void function()
{
int num=2;
//分别输出内部类方法中的变量值,内部类成员属性值,外部类成员属性值
System.out.println("Hello Inner "+"\nInner's function's num= "+num
+"\nInner's num="+this.num
+"\nOuter's num="+Outer.this.num);
}
}
}
class InsideClassDemo
{
public static void main(String[] args)
{
Outer out=new Outer();
out.method_out();
/*
不能在外部类外直接建立内部类对象
Inner i=new Inner();
i.function(); x
*/
}
}
2 方法的内部类
修饰符与访问规则
内部类定义在方法内时,
-
仍然 可以直接访问外部类中的成员
-
不可以被成员修饰符修饰
-
不可以访问它所在的方法中的变量。只能访问被final修饰的常量。
示例代码
class Outer
{
int x = 3;
void method(final int a)
{
final int y = 4;
class Inner
{
void function()
{
System.out.println(y+" "+a+" "+);
}
}
new Inner().function();
}
}
class InnerClassDemo3
{
public static void main(String[] args)
{
Outer out = new Outer();
out.method(7);
out.method(8);
}
}
(方法的)匿名内部类
前提
匿名内部类必须继承一个父类或者实现一个接口,**
说明
-
匿名内部类是内部类的简写。
-
因为有时候有的内部类bai只需要创建一个它的对象就可以了,以后再不会用到这个类,这时候使用匿名内部类就比较合适,而且也免去了给它取名字的烦恼。【1】
-
匿名内部类不是抽象类
-
在匿名内部类中需要
-实现抽象函数或接口中的所有抽象方法,
-或者重写普通类中的某些方法。 -
方法中的内部类的访问规则仍遵循 方法的内部类 的规则
示例代码(重要)
代码中有两种适用匿名内部类的方式
*/
abstract class Demo
{
abstract void show();
Demo()
{
System.out.println("\nDemo:\nconstructor in abstract class");
}
void show1()
{
System.out.println("ordinary method in abstract class");
}
}
class Demo2
{
Demo2()
{
System.out.println("\nDemo2:\nconstructor in ordinary class");
}
public void show2()
{
System.out.println("ordinary method in ordinary class");
}
}
class Outer1
{
public void function()
{
final int num=3;
System.out.print("Hello AnonymousInsideClass 1");
new Demo()//Demo 是抽象类的名称
{//体内也可以定义子类特有方法
void show()
{
System.out.println("implement abstract method in abstract class");
System.out.println("final variable in outer class: "+num);
}
void show1()
{
System.out.println("override ordinary method in abstract class");
}
}.show1();//.后的方法名在{}中,调用Demo 成员
new Demo2(){
public void show2()
{
System.out.println("override method in ordinary class");
}
}.show2();
}
}
class Outer2
{
public void function()
{
final int num=3;
System.out.print("\nHello AnonymousInsideClass2!");
Demo d=new Demo()
{
void show()
{
System.out.println("implement abstract method in abstract class");
}
};
d.show();
}
}
class AnonymousInsideClassDemo
{
public static void main(String[] args)
{
Outer1 o=new Outer1();
Outer2 o2=new Outer2();
o.function();
o2.function();
}
}
应用场景:
- 线程创建【1】
//第一种
new Thread(){
public void run(){
//你想做的事情
};
}.start();
//第二种:
new Thread(new Runnable() {
public void run() {
//你想做的事情
};
}) {
}.start();
- 待续……
参考文献
【1】Java匿名内部类怎样创建,有何作用和优点,创建线程怎样使用匿名内部类 nanwang21的回答