目录
什么是内部类?
一.成员内部类:
二.局部内部类
三.匿名内部类
四. 静态内部类
什么是内部类?
将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类.
一.成员内部类:
成员内部类是最普通的内部类,它的定义为位于另一个类的内部
代码:
public class Animal {
class Dog{
}
}
Dog就是Animal的内部类,Dog就像Animal的一个成员一样
用法:
第一点:
内部类可以用protected public private 和默认访问权限修饰,它与成员变量的访问权限一样,与外部类不同的是,外部类只能被public和默认访问权限。
第二点:
内部类可以无条件访问外部类的成员变量和方法(包括静态和私有)
public class Animal {
private int age=10;
public String name="animal";
private class Dog{
public void fun(){
System.out.println(age); // age = 10
System.out.println(name);// name = animal
}
}
}
第三点:
如果外部类和内部类的成员变量和方法重名,外部类同名的方法和属性就会失效,默认内部类优先使用自己的
public class Animal {
private int age=10;
public String name="animal";
private class Dog{
private int age = 20;
public String name="Dog";
public void fun(){
System.out.println(age); // age = 20
System.out.println(name);// name = Dog
}
}
}
第四点:
如果外部类想要访问内部类的属性和方法,需要有内部类的对象,下面通过 new Dog()创建了一个Dog对象来对内部类的成员和方法进行访问
public class Animal {
private int age=10;
public String name="animal";
public void fun(){
new Dog().fun();
System.out.println(new Dog().name);
}
private class Dog{
private int age = 20;
public String name="Dog";
public void fun(){
System.out.println(age); // age = 20
System.out.println(name);// name = Dog
}
}
}
第五点:
如果外部类和内部类的属性和方法重名,在内部类想要访问外部类的属性和方法,我们可以这样访问
外部类.this.成员变量 外部类.this.成员方法
public class Animal {
private int age=10;
public String name="animal";
public void fun(){
System.out.println("animal");
}
private class Dog{
private int age = 20;
public String name="Dog";
public void fun(){
System.out.println(Animal.this.age);
Animal.this.fun();
}
}
}
第六点:
成员内部类是依附外部类而存在的,也就是说,如果要创建成员内部类的对象,前提是必须存在一个外部类的对象
public class TestDemo2 {
public static void main(String[] args) {
Animal animal = new Animal();
Animal.Dog dog = animal.new Dog();
}
}
二.局部内部类
局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。局部内部类就像是方法里面的一个局部变量一样,是不能有 public、protected、private 以及 static 修饰符
public class Animal {
private int age=10;
public String name="animal";
public void fun(){
class Cat extends Animal {
public void fun(){
System.out.println("fun");
}
}
}
}
三.匿名内部类
这个类只能使用一次 通过 new 类()的方式
public class Animal {
private int age=10;
public String name="animal";
public void fun(Animal animal){
System.out.println(animal.age);
}
}
public class TestDemo2 {
public static void main(String[] args) {
Animal animal = new Animal();
animal.fun(new Animal());
}
}
这种写法虽然能达到一样的效果,但是既冗长又难以维护,我们一般不这样写,除了一些场景,我们要使用一次这个对象,我们可以使用匿名内部类的方式
四. 静态内部类
静态内部类也是定义在另一个类里面的类,只不过在类的前面多了一个关键字static。静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法,这点很好理解,因为在没有外部类的对象的情况下,可以创建静态内部类的对象,如果允许访问外部类的非static成员就会产生矛盾,因为外部类的非static成员必须依附于具体的对象。
public class Animal {
private int age=10;
public String name="animal";
static class Dog{
int age =10;
public void fun(){
System.out.println(age);
}
}
}
public class TestDemo2 {
public static void main(String[] args) {
Animal.Dog dog =new Animal.Dog();
}
}
注意静态内部类和成员内部类两者的调用区别。
关于内部类的深入了解和它们的关系等,可以通过反编译,通过观察字节码文件来说明,这里不再举例,关于内部类,更多的是知道如何使用。



