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

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

一、代码块

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==

在这里插入图片描述

目录
相关文章
|
运维 监控 安全
在Linux中,如何进行故障排查?
在Linux中,如何进行故障排查?
|
存储 设计模式 开发框架
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(7) -- 图标列表展示和选择处理
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(7) -- 图标列表展示和选择处理
|
数据采集 人工智能 监控
数字孪生(Digital Twins)给我们带来了什么?
数字孪生,英文名叫Digital Twin(数字双胞胎),也被称为数字映射、数字镜像,通俗的讲,就是在一个物理设备或物理系统的基础上,创造一个数字版的“克隆体”。那么数字孪生中的关键技术是什么,又给我们人机交互带来了什么呢?
1056 0
数字孪生(Digital Twins)给我们带来了什么?
|
机器学习/深度学习 存储 人工智能
【机器学习】Qwen1.5-14B-Chat大模型训练与推理实战
【机器学习】Qwen1.5-14B-Chat大模型训练与推理实战
1617 0
|
机器学习/深度学习 存储 人工智能
探索Python编程的魔法:从基础到进阶
【9月更文挑战第16天】本文将带领你进入Python编程的世界,无论你是初学者还是有一定经验的开发者。我们将一起揭开Python编程的神秘面纱,通过实际案例和代码示例,深入浅出地探讨Python的基础语法、数据结构、面向对象编程以及函数式编程等核心概念。文章旨在提供一条清晰的学习路径,帮助你构建坚实的编程基础,并逐步过渡到更高级的编程技巧。无论你的目标是数据分析、网络开发还是机器学习,这篇文章都将为你打下扎实的基础,让你在编程的道路上越走越远。
68 6
|
弹性计算 开发者
阿里云99元和199元服务器配置和性能怎么样?
阿里云99元和199元的服务器配置和性能测评如下,阿里云服务器99元一年配置为云服务器ECS经济型e实例,2核2G配置、3M固定带宽和40G ESSD Entry系统盘,新用户和老用户均可买;企业用户ECS u1实例,2核4G、5M固定带宽、80G ESSD Entry盘优惠价格199元一年,企业客户专享。活动如下:
|
编解码 图形学 计算机视觉
viewpoint与rem、百分比、px 基础与面试题:viewpoint 与 rem、百分比高度、px
该文档介绍了网页设计中的尺寸单位,包括`viewpoint`、`rem`、百分比和像素`px`的概念和差异。`viewpoint`(如`vw/vh`)基于用户视口大小,常用于移动端适配;`rem`相对于根元素字体大小,适合做响应式设计;百分比相对于父元素尺寸,两者在响应式和基准上有所不同;像素`px`是图像和数字图形的基本单位,常用于精确布局。像素密度(PPI)影响图像清晰度,不同设备中像素表现形式不一。
219 0
|
虚拟化 Docker 容器
【Docker】安装及配置 Elasticsearch 详解
【Docker】安装及配置 Elasticsearch 详解
389 0
IP地址格式化处理
IP地址格式化处理
150 0
|
机器学习/深度学习 人工智能 自然语言处理
【产品进化论】支持100+种单证分类:开放免费测试
依托深源恒际自研的技术结合多重规则引擎,为健康险理赔流程提供集收单、初审、录入、扣费、理算、审核于一体的全流程自动化解决方案,助推理赔业务构建结构化数据,同时可结合医疗票据业务数据自动化无感地进行模型迭代训练,自动部署,形成优质的数据闭环和数据生态。
【产品进化论】支持100+种单证分类:开放免费测试