
目录
1.java中允许将一个类A声明在另一个类B中,那么A就是内部类,类B就是外部类
2.内部类的分类:
3.成员内部类:
4.关注以下的四个问题:
5.总结:、
成员内部类(静态的、非静态的)
局部内部类(方法内、代码块内、构造器内)
一方面,作为外部类的成员:
>调用外部类的结构
>可以被static修饰
>可以被4种不同的权限修饰
另一方面,作为一个类:
>类内可以定义属性、方法、构造器等
>可以被final修饰,表示此类不能被继承。言外之意,不使用final,就可以被继承
>可以被abstract修饰
①如何实例化内部类的对象
②如何在成员内部类中区分调用外部类的结构和自己的结构
形参:直接来
自己的结构:this.
外部类的结构:类名.this.
public class InnerClassTest {
public static void main(String[] args) {
// 创建Dog实例(静态内部类) 静态的方法可以用类来调用
Person.Dog dog = new Person.Dog();
dog.show();
// 创建Bird实例(非静态内部类) 不能用类来调用
Person p = new Person();
Person.Bird bird = p.new Bird();// 用对象来调用内部结构
bird.show();
}
}
class Person {
public void eat() {
System.out.println("人吃饭");
}
// 静态的成员内部类
static class Dog {
// 静态的方法不能调用非静态的方法,还是生命周期的问题
public void show() {
System.out.println("我是一只狗");
}
}
// 非静态的成员内部类
class Bird {
public void show() {
System.out.println("我是一只鸟");
Person.this.eat();// 内部类调用外部类时省略了 类名.this.
}
}
// 局部内部类
public void method1() {
class A {
}
}
// 局部内部类
{
class B {
}
}
// 局部内部类
public Person() {
class C {
}
}
}
③开放中局部内部类的使用
package com.haiyu.java5;
public class InnerClassTest2 {
// 开发中很少见
public void method() {
class A {
}
}
// 返回一个实现了Comparable接口的对象
public Comparable getCompareable() {
// 方式一:
// 创建一个实现了Comparable接口的类:局部内部类
// class MyComparable implements Comparable {
//
// @Override
// public int compareTo(Object o) {
// return 0;
// }
//
// }
// return new MyComparable();
// 方式二:
return new Comparable() {
@Override
public int compareTo(Object o) {
// TODO Auto-generated method stub
return 0;
}
};
}
}
成员内部类和局部内部类,在编译以后,都会生成字节码文件。
格式:
成员内部类:外部类$内部类名.class
局部内部类:外部类$数字内部类名.class