在java中,我么可以在一个类中继续定义另一个类,那么在类中的类就叫做内部类,而外面的类叫做外部类。
内部类又可以分为,成员内部类(静态和非静态)和局部内部类(方法内、代码块内、构造器内)
* 成员内部类(静态、非静态)
* >作为类的成员
* >可以调用外部类的结构,
* >可以被Static修饰
* >可以别权限修饰符修饰
* >作为一个类
* >可以定义属性、方法、构造器、
* >可以被final修饰,表示此类不可被继承
* >可以被abstract修饰
* 局部内部类(方法内,代码块内、构造器内)
就是把类定义在类的内部的情况就可以形成内部类的形式。
A类中又定义了B类,B类就是内部类,B类可以当做A类的一个成员看待:
内部类 特点:
1) 内部类可以直接访问外部类中的成员,包括私有成员
2) 外部类要访问内部类的成员,必须要建立内部类的对象
3) 在成员位置的内部类是成员内部类
4) 在局部位置的内部类是局部内部类
* 3个问题:
* 1,如何实例化成员内部类的对象
public class PersonTest {
public static void main(String[] args) {
//创建dog实例(静态成员内部类)
Person.Dog dog = new Person.Dog();
dog.method2();
//创建Bird实例(非静态成员内部类)
Person p=new Person();
Person.Bird bird= p.new Bird();
bird.method();
}
}
* 2,如何在成员内部类中区分调用外部类结构
public void display(String name){
System.out.println(name);//方法形参
System.out.println(this.name);//内部类成员
System.out.println(Person.this.name);//外部类成员
}
* 3,开发中局部内部类的使用
public class InterclassTest {
//开发中很少见
public void method(){
//局部内部类
class AA{
}
}
//开发中很常见的局部内部类使用方法
public Comparable getComparable1(){
//创建了一个实现了Comparable接口的类
class MyComparable implements Comparable{
@Override
public int compareTo(Object o) {
return 0;
}
}
return new MyComparable();
}
public Comparable getComparable2(){
//创建了实现了这个接口的匿名实现类的匿名对象
return new Comparable() {
@Override
public int compareTo(Object o) {
return 0;
}
};
}
}
整段代码演示:
public class PersonTest {
public static void main(String[] args) {
//创建dog实例(静态成员内部类)
Person.Dog dog = new Person.Dog();
dog.method2();
//创建Bird实例(非静态成员内部类)
Person p=new Person();
Person.Bird bird= p.new Bird();
bird.method();
}
}
class Person{
String name;
public static void eat(){
System.out.println("eating!");
}
//成员内部类
static class Dog{
String name;
public Dog(){
}
public void method2(){
System.out.println("i am a dog!");
// Person.this.eat();//eat();
eat();
}
}
class Bird{
String name;
public Bird(){
}
public void display(String name){
System.out.println(name);//方法形参
System.out.println(this.name);//内部类成员
System.out.println(Person.this.name);//外部类成员
}
public void method(){
System.out.println("我是一只鸟");
Person.this.eat();
}
}
//局部内部类
public void method(){
class AA{
}
}
{
class BB{
}
}
public Person(){
class CC{
}
}
}