Java基础12——内部类和匿名类

Java基础12——内部类和匿名类

内部类和匿名类

内部类

内部类是指将一个类定义在另一类里面,这个类就是内部类。内部类分为 static 内部类和普通内部类

public class A {
    class B{//内部类
        
    }
}

这个类编译后会产生两个 .class 文件,分别是 A.classA$B.class一个类可以有多个内部类,内部类可以实现接口和继承类。内部类可以解决 java 类单继承问题,因为内部类和外部类可以相互访问

数据访问

外部类与内部类可以相互访问类中的成员,包括私有域的

public class A {
    
    public String name;
    private int age;
    
    public class B{//内部类
        
    public String bName;
    private int bAge;
        
    private void setAge() {
        name = "";
        this.bAge = age;
	}	
}

public class C{
    public String cName;
        private int cAge;
    }
    public void compareAge() {
        B b = new B();
        this.age = b.bAge;
        
        b.setAge();
        C c = new C();
        
        c.cAge = 10;
    }

    public static void main(String[] args) {

    }
}

内部类的实例化,内部类依托于外部类,所以内部类的实例化要先实例化外部类,然后在实例化内部类。

import com.itlaobing.demo.A.B; //导包

public class ATest {
    public static void main(String[] args) {
        A a = new A();
        B b = a.new B();//实例化内部类 B b = new A().new B();
        b.bName = "";
    }
}

静态内部类

public class AA {
    static class BB{ //`static`内部类
        
    }
}

静态内部类不能直接访问外部类的成员,可以直接访问外部内的静态成员

import com.itlaobing.demo.AA.BB;//导包
    public class AATest {
    public static void main(String[] args) {
        AA a = new AA();
        BB b = new BB();//实例化内部类
    }
}

所有的访问修饰符都在修饰内部类

内部类和外部类区别**?**

访问修饰符: 外部类只能有两种访问权限: public 以及 package-access

内部类可以有四种访问权限: public / protected / package-access / private

static 修饰: 外部类不可以使用 static 修饰类,内部类可以

**使用:**外部类可以直接被使用,内部类的使用则依赖于外部类

匿名类

匿名类是没有明确的名称的类。

public static void main(String[] args) {
    Pet pet = new Dog();
    pet.cry();
    
    //匿名类
    Pet p = new Pet() {
        @Override
        public void cry() {
        	System.out.println("喵 喵 喵");
        }
        
    };
    p.cry();
}

注意:

  • 匿名类不能使用修饰符,在方法的内部,对外隐藏。不能是 static ,隐式 final 类。匿名类没有类名,没有构造方法。
  • 匿名类可以访问类中的成员,不能访问方法中的变量,除非是 final 的。
  • 匿名类一般是实现接口、继承抽象类。相当于实现、继承了这个接口/类。
public abstract class Pet {
    public abstract void cry();
    }

//匿名类
Pet p = new Pet() {
    @Override
    public void cry() {
    	System.out.println("喵 喵 喵");
    }
};

//等同于
public class 类名 extends Pet{
    @Override
    public void cry() {
    	System.out.println("喵 喵 喵");
    }
}

你可能感兴趣的:(java,Java基础,java,开发语言)