Java中的内部类,代码块

前言

学习Java过程中,对内部类和代码块部分知识比较模糊,容易忘掉。今天再学的时候有一些其他的收获,整理记录一下。

1. 代码块

代码块的作用可以为初始化变量。都在在构造器方法之前执行,分为静态代码块和匿名代码块。静态代码块是在类加载时执行,因此只执行一次。匿名代码块在new实例化时执行,每个new新实例都会执行。

public class User{
    public static int age;
    {
        age=2;
        dosomething();  //匿名代码块
    }

    static{
        age=1;
        dosomething();   //静态代码块
    }

    public User(){
        age=3;
        dosomething();  //构造器
    }
    public static void  dosomething(){
        System.out.println(age);
    }
}

public static void main(String[] args) {
        new User();
        System.out.println("============");
        new User();
    }

实验结果

可知

  1. 执行顺序: 静态代码块-> 匿名代码块-> 构造器。
  2. 静态代码块只执行一次。

内部类

内部类分为四种,成员内部类、静态内部类、局部内部类、匿名内部类。 因为内部类可以单独继承,这使得多继承方案得以完整。

成员内部类(同方法同一级别)

  1. 可以访问外部类。
  2. 访问同名外部类时 外部类名.this.变量名
  3. 实例化内部类之前需要先实例化外部类,new Outer().new Inner()
  4. 注意
    - 可以使用权限修饰符(public...)
public class Outer {
    private  int ak =1;

    public  class inner{
         private  int ak =2;
         public void doSomething() {
             System.out.println(Outer.this.ak);
             System.out.println(ak);
         }
    }
}

public static void main(String[] args) {
        Outer out = new Outer();
        out.new inner().doSomething();
    }

静态内部类

  1. 在成员内部类加static,效果是无法访问内部类的非静态方法,因为静态内部类加载在实例化之前。

成员内部类(在方法中)

  1. 可以访问方法的局部变量
  2. 不可以使用修饰符(no public...、static)
  3. 可以访问外部类
  4. 调用内部类的方法需要在 内部类之外,方法之外 实例化+调用
public class Outer {
    String name ="外部类";
    public void method() {
         class Inner{
            String name="内部类";
            public void print(){
                System.out.println(name);
                System.out.println(Outer.this.name);
            }
        } //局部内部类之外,方法之内
        Inner in = new Inner();
        in.print();
    }
}

public static void main(String[] args) {
        Outer out = new Outer();
        out.method();
    }

匿名内部类(方法内)

  1. 一般用于隐含的实现接口
  2. 调用内部类的方法,一般“自产自销”。内部类的}后面直接调用内部类的方法。注意;号
public class Outer {
    public void method() {
        new UserService(){
            @Override
            public void run() {
                System.out.println("匿名内部类");
            }
        }.run();  //自产自销
    }
}

public class Application {
    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.method();
    }
}
posted @   不準  阅读(24)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示