类中的五大成分之一(成员变量、方法、构造器、内部类、代码块),如果一个类定义在另一个类的内部,这个类就是内部类。
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("汪汪");
}
}
匿名内部类的使用场景
方法参数是抽象类或者接口时 可以使用匿名内部类简化写法
如果方法实现简单 推荐使用匿名内部类 如果方法实现复杂 推荐定义子类