类中的五大成分之一(成员变量、方法、构造器、内部类、代码块),如果一个类定义在另一个类的内部,这个类就是内部类。

public class Test {
    public static void main(String[] args) {
        //Car car=new Car();
        //Engin engine =car.new Engine()

        //1.几乎用不到
        //2.先new出来外部类new 对象.new 内部类
        Car.Engine engine = new Car().new Engine();
        engine.fire();
    }
}

class Car {
  
    public static String brand="马自达";
    String name="2023新款马自达";
    //内部类
    public class Engine {
        String name="雕牌引擎";
  
        public void fire(){
            String name="马氏点火";
            System.out.println(name);
            System.out.println(this.name);
            //调用外部类的变量方法
            System.out.println(Car.this.name);
        }
    }
}

内部类使用场景

定义在另一个类中的类,它体现了一种代码的隐藏机制和访问控制机制。当往往只有外部类调用此类时,所以就没必要专门设置一个JAVA文件存放这个类。

内部类特点

总结一下内部类访问成员的特点

既可以访问内部类成员、也可以访问外部类成员

如果内部类成员和外部类成员同名,可以使用类名.this.成员区分

静态内部类

使用static修饰内部类
public class Outer{
  public int age=100;
  public static String schoolName="北大";
  //静态内部类
  public static class Inner{
     public void test(){
       //静态内部类不能访问外部实例成员
   
      //静态内部类可以访问外部静态成员
      System.out.println(schoolName);
     }
  }
}

局部内部类

定义在方法里面的类
public class Student{
  public void study(){
   //局部内部类:定义在外部类中的方法中 
   //只能在外部类之中创建对象
   class Mobie{
     public void test(){
       System.out.prinln("局部内部类Mobile,test方法执行了")
    }
   }
  }
}

匿名内部类

匿名内部类是一种特殊的局部内部类;所谓匿名,指的是程序员不需要为这个类声明名字。
public class Test{
    public static void main(String[] args){
        //定义一,定义子类继承父类 实现抽象方法
        Animal a1=new Dog();
        a1.say();
        //方法二 不定义子类 用匿名内部类写法
        Animal a2=new Animal(){
            @Override
            public void say(){
                System.out.println("kkkkk");
            }
        };
        a2.say();
        animalPkSay(new Animal() {
            @Override
            public void say() {
                System.out.println("鹅鹅鹅饿");
            }
        });
    }
  
    public static void animalPkSay(Animal animal){
        animal.say();
    }
}
abstract class Animal{
    String name;
    public abstract void say();
}
class Dog extends Animal{
    @Override
    public void say(){
        System.out.println("汪汪");
    }
}

匿名内部类的使用场景

方法参数是抽象类或者接口时 可以使用匿名内部类简化写法

如果方法实现简单 推荐使用匿名内部类 如果方法实现复杂 推荐定义子类

最后修改:2023 年 05 月 04 日
如果觉得我的文章对你有用,请随意赞赏