七千字带你了解封装等机制下

简介: 七千字带你了解封装等机制下

一、代码块

4.1普通代码块

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

在这里插入图片描述
直接定义在方法中的代码块,即为普通代码块

4.2静态代码块

用于static修饰的代码块即为静态代码块,可初始化静态成员变量。

class Student {
    public static String classHome;
    static {
        classHome = "001";
    }
}
public static void main(String[] args) {
        System.out.println(Student.classHome);
    }

在这里插入图片描述
我们可以发现我们为new对象,直接打印static成员变量时,static成员变量已经经过static代码块赋值.

==1.静态代码块在程序中只会执行一次(用于静态变量初始化)==
==2.静态成员变量时类的属性,JVM在加载类时开辟空间并初始化==
==3.一个类如果有多个静态代码块,编译时,按照顺序执行==

4.3实例代码块

实例代码块又称构造代码块,顾名思义是用来初始化普通成员变量的

class Student {
    public String name;
    public int age;
    {
        name = "张三";
        age = 18;
    }
}
 public static void main(String[] args) {
        Student student = new Student();
        System.out.println("name: "+student.name+" age: "+student.age);
  }

在这里插入图片描述

我们可以发现我们在创建对象时实例代码块执行对对象进行赋值,因为它是依赖每一个对象的,因此会多次执行。

二、内部类

5.1什么是内部类

简单地说就是:定义在一个类内部的类

class OutClass{//外部类
   class InnerClass{//内部类
   }
}

注意: 虽然内部类外部类在一个java文件,但编译后会形成两个不同的字节码文件.

5.2静态内部类

class OutClass {
    public int size;
    static int age;
    public void funcSize() {
        System.out.println(size);
    }
    public static void funcAge() {
        System.out.println(age);
    }
    static class InnerClass {
    //静态内部类只能访问外部的静态成员和方法.
        public void funInner() {
            age = 18;
            funcAge();
        }
    }

    public static void main(String[] args) {
        OutClass.InnerClass innerClass = new OutClass.InnerClass();
        innerClass.funInner();
    }
}

在这里插入图片描述

==1.在静态内部类只能访问外部类中的静态成员和方法==
==2.创建内部类对象时,不需要先创建外部类对象==

在内部类如何访问外部类的成员和方法?

 static class InnerClass {
        public void funInner() {
            OutClass outClass = new OutClass();
            outClass.size = 20;
            outClass.funcSize();
            age = 18;
            funcAge();
        }
    }

在这里插入图片描述
我们可以通过外部类对象在内部类访问外部类成员变量和方法.

5.3实例内部类

class OutClass {
    public int size;
    static int age;
    public  void funcSize() {
        System.out.println("size: "+size);
    }
    public static void funcAge() {
        System.out.println("age: "+age);
    }
    class InnerClass {
        String name;
        public void funcInnerClass() {
            size = 20;
            age = 18;
            name = "张三";
            funcSize();
            funcSize();
            System.out.println("name: "+name);
        }
    }

在这里插入图片描述
当内部类中的成员变量和外部类重名了,怎么访问?

class InnerClass {
        int size;
        public void funcInnerClass() {
            OutClass.this.size = 20;
            age = 18;
            funcSize();
            funcAge();
        }
    }

在这里插入图片描述
可以通过外部类名.this.成员变量名访问.

  1. 外部类中的任何成员都可以在实例内部类方法中直接访问
  2. 实例内部类所处的位置与外部类成员位置相同,因此也受public、private等访问限定符的约束
  3. 在实例内部类方法中访问同名的成员时,优先访问自己的,如果要访问外部类同名的成员,必须:外部类名

称.this.同名成员 来访问

  1. 实例内部类对象必须在先有外部类对象前提下才能创建
  2. 实例内部类的非静态方法中包含了一个指向外部类对象的引用
  3. 外部类中,不能直接访问实例内部类中的成员,如果要访问必须先要创建内部类的对象。

5.4局部内部类

class OutClass {
    int size = 20;
    public void funcSize() {
        int age = 18;
        class InnerClass{
            public void funcInnerClass() {
                System.out.println(size);
                System.out.println(age);
            }
        }
        InnerClass innerClass = new InnerClass();
        innerClass.funcInnerClass();
    }
  }

在这里插入图片描述
局部内部类是定义在外部类方法体或者普通代码块中的内部类.

==1.局部内部类只能使用在所定义的方法体内部==
==2.不能被public,static修饰==
==3.编译器有自己的字节码文件,命名为:外部类$内部类.class==

在这里插入图片描述

目录
相关文章
|
XML Java 数据格式
Spring框架(二) 底层架构核心概念解析-四万字你值得一看
上面说到解析为BeanDefintion之后会注册到Spring容器中 , 那么什么是容器? 其实在DefaultListableBeanFactory这个类中就有体现 , 源码中是这样定义的
91 0
|
3月前
|
存储 安全 Java
"Java编码魔法:揭秘图片与文件的Base64神秘转换术,让数据在指尖跳跃!"
【8月更文挑战第16天】Base64编码在Java开发中常用于将二进制数据如图片转换为ASCII字符串以便传输。编码使用64个字符及等号填充,每3字节数据编码为4个字符。Java利用`java.util.Base64`类实现此功能:读取图片或文件为字节数组后进行编码。解码时将Base64字符串还原为字节数组并写入文件。需注意编码效率降低、不提供安全性及特殊字符兼容性等问题。掌握这些技巧有助于解决Web开发中的数据传输需求。
96 4
|
运维 前端开发 安全
万字长文搞懂产品模式和项目模式
万字长文搞懂产品模式和项目模式
178 0
|
存储 算法 安全
终于有人用1.6W字把分布式算法的系统模型给彻底讲明白了!
系统模型-进程 在真实的分布式系统中,可能存在服务器(节点)、处理器、进程、线程等并发执行的实体。 在分布式算法中,这些实体都被抽象为进程。 注意,这里的进程与操作系统中的进程不完全是一个概念,后者侧重于描述一组资源的集合,例如文件句柄、地址空间、数据、代码等,还可以有多个线程,而前者是一个有状态的自动机。
941 3
|
存储 资源调度 算法
打通任督二脉:4000字,一文,从代码拆到计算机底层。
一个业务场景 假设我们要编写一个购买商品的程序,程序的内容很简单: 商品的库存数量存放在数据库中,每次完成库存数量-1。我们很快可以写出伪代码
70 0
|
存储 SQL 安全
七千字带你了解封装等机制上
七千字带你了解封装等机制上
111 0
七千字带你了解封装等机制上
|
Java 数据库连接
七千字带你了解异常处理下
七千字带你了解异常处理下
95 0
七千字带你了解异常处理下
|
Java 程序员
七千字带你了解异常处理上
七千字带你了解异常处理上
63 0
七千字带你了解异常处理上
|
存储 缓存 负载均衡
两万字深度介绍分布式系统原理
两万字深度介绍分布式系统原理
185 0
两万字深度介绍分布式系统原理
|
算法 关系型数据库 5G
本书的目的和篇章结构 | 带你读《5G-NR信道编码》之五
2017 年 12 月,在葡萄牙里斯本的 3GPP RAN#78 次会议上,5G-NR 的第一 个版本获得通过 [17]。这标志着 5G 第一阶段的标准化工作已经完成(eMBB 部分)。 作为 5G 物理层的关键技术,先进的编码将对满足 5G 主要场景的性能指标发挥重 要作用。根据作者的了解,目前,无论是国外还是国内,尚未有一本能比较全面介 绍 5G 信道编码的书,这本书的目的就是给读者呈现 5G 信道编码的丰富画面。
本书的目的和篇章结构  | 带你读《5G-NR信道编码》之五