Java内部类详解

一:为什么使用内部类?

1.每个内部类都能够独立的继承自一个(接口的)实现,所以无论外部类是否继承了一个(接口的)实现,对这个内部类都没有影响。

2.内部类提供了更好的封装,只有外部类能访问内部类。

二:内部类的使用

1.成员内部类:

如果一个类定义在了另一个类的内部,那么这个类就是成员内部类。成员内部类可以直接访问外部类的所有方法和属性。

public class Outter {
    private int x = 1;
    private static int y = 2;
    
    private void outterMethod(){
        System.out.println("outterMethod");
    }public class Inner{
        public void innerMethod(){
            System.out.println(x); //访问外部类的属性
            System.out.println(y);
            outterMethod(); //访问外部类的方法
        }
               
    }
    
}
public class JavaSeTest {    
    @Test
    public void innerTest(){
//成员内部类的创建方式:先创建一个外部类,然后再创建成员内部类 Outter outter
= new Outter(); Outter.Inner inner = outter.new Inner(); inner.innerMethod(); } }

外部类不能直接访问内部类的方法和属性,需要通过内部类来访问

public class Outter {
    private int x = 1;
    private static int y = 2;
    
    public void callInnerMehtod(){
        new Inner().innerMethod(); //先创建内部类,然后通过这个内部类对象来访问内部类的方法
    }
    
    public class Inner{
        public void innerMethod(){
            System.out.println("innerMethod");
        } 
        
    }
    
}

2.局部内部类

如果一个类定义在了方法或者作用域内,那么这个类称之为局部内部类;局部内部类不能用private,protected,public,static修饰,仅能用abstract,final来修饰。它的访问权限在这个方法或者作用域内。注意,成员内部类的访问权限是在外部类。

 定义在方法内:

//Outter是外部类,Inner是局部内部类,定义在了getInnerClass方法中
public
class Outter { public InnerInterface getInnerClass(String str){ class Inner implements InnerInterface{ private String name; public String getName(){ return this.name; } public Inner(String str){ this.name = str; } } return new Inner(str); }

3.匿名内部类

匿名内部类注意:

3.1 匿名内部类必须实现一个接口或者继承一个抽象类,同时要实现这个抽象类或者接口中的所有方法;

3.2 匿名内部类不能定义构造函数,匿名内部类也是一个局部内部类,匿名内部类不能存在静态方法或静态成员变量。

public class Person {
    private String name;
    
    public Person(String name){
        this.name = name;
    }
    
    public void driveCar(Car car){
        System.out.println(name+"驾驶"+car.run());
    }
    
}

public interface Car {
    public String run();
}

    @Test
    public void innerTest(){
        Person person = new Person("梁朝伟");
//以下蓝色代码块就是匿名内部类 person.driveCar(
new Car(){ public String run() { return "保时捷跑1000公里"; } }); } }

4.静态内部类

静态内部类只能访问外部类的静态方法和静态成员变量,不能访问外部类的非静态方法和非静态成员变量

public class Outter {

    private static int age;
    
    private String name;
    
    static class Inner{
        public void innerMethod(){
            System.out.println(age);
        }
        
    }
}
原文地址:https://www.cnblogs.com/51life/p/9295788.html