说到java基础那么就不能不说内部类,随着JDK版本的升级如今到JDK1.8对于内部类也做出了一定的改进,那么接下来就慢慢道来。
在我的认知下内部类分为四种:成员内部类,局部内部类,匿名内部类,静态内部类。
- 成员内部类
成员内部类是最为常见的内部类,因为它在类的内部定义,是这个类的成员。成员内部类可以无条件的访问外部类的所有成员属性和成员方法。
public class People {
private int age;
private int height;
public Eye getEyeInstance(){
return new Eye();
}
private class Eye{
void look(){
System.out.println(age);
System.out.println("Hi,I'm looking at you!");
}
}
public People(int age, int height) {
super();
this.age = age;
this.height = height;
}
public static void main(String[] args) {
People peo = new People(18, 178);
People.Eye eye = peo.new Eye();
eye.look();
peo.getEyeInstance().look();
}
}
需要注意的是:当内部类的变量或者方法与外部类的成员的名字相同的时候使用方式:
外部类.this.变量(或者方法名);
从上面的代码可以看出:当外部类想使用内部类成员的时候需要先创建一个内部类的对象然后通过对象引用
People peo = new People(18, 178);
People.Eye eye = peo.new Eye();
public Eye getEyeInstance(){ return new Eye(); }
通过这两种方式都能产生内部类对象,由于内部类是依赖于外部类的,所以需要先创建一个外部类对象。内部类可以被private,protected,public修饰。
2.局部内部类
局部内部类是定义在一个方法或者任何一个作用域中的类,对于使用它的地方是相当有限的,访问仅限于方法内或者作用域内。由于局部内部类是方法中的一个局部变量,所以不能用public,protected,private,static的修饰符,下面是使用方法:
public People getTeacher(){
class Teacher extends People{
public Teacher(int age, int height) {
super(age, height);
}
}
return new Teacher(1, 1);
}
3.匿名内部类
匿名内部类没有类名,匿名内部类只能使用一次,匿名内部类必须继承一个父类或者实现一个接口。
写法:
interface Person {
public void eat();
}
public class Demo {
public static void main(String[] args) {
Person p = new Person() {
public void eat() {
System.out.println("eat something");
}
};
p.eat();
}
}