内部类可以定义为: 接口 , 抽象类
部类的命名不允许与外部类 重名,内部类可以继承同级的内部类,也可继承其它类(除内部类和外部类)
成员内部类 (高度内聚(不为外面知道))
package memberinner;
//成员内部类
public class Out{
public int i = 23;
//一个内部类
//它可以访问所有方法,字段和外部类本身的引用
class Inner{
public void say(){
System.out.println("内部类可以引用所有字段的引用:"+i);
mehtod1();
System.out.println("本身内部类的自身引用:"+this);
System.out.println("外部类的引用:"+Out.this);
}
}
//内部方法
public void mehtod1(){
System.out.println("这是一个方法");
}
//调用
public static void main(String[] args) {
Out o = new Out();
//创建内部类的 实例
Inner i = o.new Inner();
i.say();
}
public String toString() {
return "Out [i=" + i + "]";
}
}
输出为:
字段的引用:23
这是一个方法
本身内部类的引用:memberinner.Out$Inner@2a139a55
外部类的引用:Out [i=23]
方法内部类:(短暂性的 )
方法内的内部类不能加范围限定(protected public private)
方法内的内部类不能加static修饰符
方法内的内部类只能在方法内构建其实例
方法内的内部类如果访问方法局部变量,则此局部变量必须使用final修饰
package memberinner;
public class MothedInner {
public void methodInn(){
//方法内部类 调用这个方法时才是有效(短暂性)
//类内部 自己调用
class inn {
public void method() {
System.out.println("这里是方法内部类");
}
}
inn i = new inn();
i.method();
}
public static void main(String[] args) {
new MothedInner().methodInn();
}
}
运行的结果为:
这里是方法内部类
匿名内部类:
匿名内部类也就是没有名字的内部类
正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写
但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口
package memberinner;
//定义一个接口
interface Person{
public abstract void eat();
}
public class AnonyousClass {
//使用接口
public static void fun1(){
//通过匿名 内部类来实现 接口中方法
Person p = new Person(){
public void eat(){
System.out.println("人是可以吃饭的! 通过接口");
}
};
//调用 内部类的 方法;
p.eat();
}
//使用 Thread 线程
public static void fun2(){
Thread t = new Thread(){
public void run() {
System.out.println("通过继承thread 实现里面的方法");
}
};
t.run();
}
//使用 Runnable 线程
public static void fun3(){
Runnable t = new Runnable(){
public void run() {
System.out.println("通过实现 Runnable 接口 实现里面方法");
}
};
t.run();
}
public static void main(String[] args) {
fun1();
System.out.println("============");
fun2();
System.out.println("============");
fun3();
}
}
运行的结果为:
人是可以吃饭的! 通过接口
============
通过继承thread 实现里面的方法
============
通过实现 Runnable 接口 实现里面方法