当前位置: 首页 > news >正文

【JAVA】十、基础知识“类和对象”干货分享~(三)

目录

1. 封装

1.1 封装的概念

1.2 访问限定符

public(公开访问)

 private(私有访问)

1.3 包

1.3.1 包的概念

1.3.2 导入包中的类

1.3.3 自定义包

 2. static成员

2.1 static变量(类变量)

2.1.1 static修饰成员变量

2.2 static方法(类方法)

2.2.1 static修饰成员方法

2.3 static成员变量初始化

3. 代码块

 3.1 代码块概念以及分类

3.1.1 普通代码块(少用)

3.1.2 构造代码块(实例代码块)

3.1.3 静态代码块


1. 封装


1.1 封装的概念

        在 Java 中,面向对象程序三大特征:封装,继承,多态。而封装是面向对象编程(OOP)的核心概念之一,它的核心思想是将数据(属性)和操作数据的方法(行为)捆绑在一起,并隐藏对象的内部实现细节,仅对外公开可控的访问接口来和对象进行交互。简单来说就是套壳屏蔽细节啦~

        并且封装通过限制对对象内部状态的直接访问,提高了代码的安全性、可维护性和灵活性。


1.2 访问限定符

        Java 中的访问限定符用于控制类、成员变量、方法和构造方法的可见性,是实现封装的重要机制。共有四种访问修饰符:public、protected、默认、private。在这里博主先介绍public修饰符,再介绍private修饰符,剩下两个修饰符不做过多描述~

  • public(公开访问)

作用范围:所有类均可访问。

使用的场景:

对外暴露的接口或工具类(如 public class Main)。

常量(如 public static final)。

public class Animal {
    public String name; // 任何类都可以访问
}
  •  private(私有访问)

封装性:优先使用 private,通过公共方法控制访问。

作用范围:仅限于声明它的类内部。

使用场景:

封装类的内部状态(如私有字段)。

单例模式的私有构造方法。

public class Student {
    private String id; // 仅本类可以访问

    public String getId() { // 通过公共方法暴露出来
        return id;
    }
}

1.3 包

1.3.1 包的概念

        在 Java 中,是一种用于组织类和接口的命名空间机制。它类似于文件系统中的文件夹,里面存有很多文件主要目的是避免命名冲突、控制访问权限。

        为了更好的管理,把多个类收集在一起成为一组,称为软件包。

        包有一个很重要的作用:不同包中可以存在相同名称的类,避免类名的冲突。

1.3.2 导入包中的类

下面这一段代码是输出数组的内容,我们通过这段代码来进行导入包中的类的讲解:

// 导入Arrays类(位于java.util包中)
import java.util.Arrays;

public class Test3 {  // 类名建议首字母大写
    public static void main(String[] args) {
        // 创建并初始化一个int数组
        int[] array = {1, 2, 3};
        
        // 使用Arrays类的静态方法toString()转换数组为字符串
        // 注意:Arrays是类名,Array是Java中的数组关键字,不要混淆
        System.out.println(Arrays.toString(array));// 输出 [1, 2, 3]
    }
}
  •  导入包

使用 Arrays 类前需导入包:可以使用import语句导入包:

import java.util.Arrays; // 必须添加在代码开头
  • Arrays.toString(array)
  1. Arrays 是 Java 提供的工具类(位于 java.util 包),用于操作数组。
  2. toString() 是它的静态方法,功能是将数组元素转换为可读的字符串格式。

        System.out.println(Arrays.toString(array)) 这行Java代码的作用是将数组 array 的内容转换为字符串并输出到控制台

        如果直接打印数组对象 System.out.println(array),输出的是数组的哈希值(如 [I@1b6d3586),这时候没办法看到实际内容。

        使用 Arrays.toString() 后,输出的是直观的数组元素[1, 2, 3]

        我们也可以使用import static导入包中的静态的方法和字段,后续代码中可以直接使用静态成员,无需通过类名调用

// 使用静态导入:导入Arrays类中的toString方法
// 使得可以直接调用toString()而无需写类名Arrays
import static java.util.Arrays.toString;

public class test3 {
    public static void main(String[] args) {
        // 定义一个int数组
        int[] array = {1, 2, 3};
        
        // 直接调用静态导入的toString方法,等价于Arrays.toString(array)
        System.out.println(toString(array));//输出[1, 2, 3]
    }
}

1.3.3 自定义包

        选中src,右键点击 src 目录,点击New(新建),再点击Package(软件包),创名字(名字全小写),最后就创建好了包。

 


 2. static成员

        在之前的博客中我们举了学生类来进行相关知识点讲解,现在同样我们再用学生类举例:

        上述三者都是成员变量。成员变量定义在方法的外部,类的内部。其中schoolName用static修饰之后,就不存在于对象当中了,而存在于方法区当中。

        所有学生共享学校名称:每个学生对象都有自己的 name 和 age,但 schoolName 是所有学生共享的。修改一次,所有对象看到的都会变化。

        直接通过类名访问:例如 Student.schoolName

2.1 static变量(类变量)

2.1.1 static修饰成员变量

  • static修饰的成员属于类本身(schoolName被static修饰)

  • 所有对象共享同一个static变量

  • 示例中的schoolName被所有Student对象共享

  • 静态成员变量访问方式:类名.变量名(而非静态成员变量属于对象,访问方式是:引用.变量名)

  • 静态成员变量不依赖于对象,不用实例化都可以


2.2 static方法(类方法)

2.2.1 static修饰成员方法

  • 静态成员方法中,使用时也是不依赖于对象
  • 静态成员方法无需实例化:可通过类名.方法名()直接调用

  • changeSchool() 通过类名调用(如 Student.changeSchool("希望中学")),修改所有学生共享的 schoolName

  • 在②静态成员方法里面,不能 直接 调用①非静态成员方法或成员变量在 changeSchool() 中尝试访问 name 或 age 会报错,因为static 方法中没有 this 引用

若是一定要在静态成员方法里调用的话,一定要通过对象的引用来调用!即:

完整代码如下:

public class Student {
    // 实例变量 - 每个学生对象独有的属性
    String name;    // 学生姓名
    int age;        // 学生年龄
    
    // static成员 - 属于类本身的属性(所有对象共享)
    static String schoolName = "阳光中学"; // 学校名称(所有学生相同)
    
    // 构造方法
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    // 实例方法 - 需要创建对象后才能调用
    void showInfo() {
        System.out.println(name + "," + age + "岁,就读于" + schoolName);
    }
    
    // static方法 - 通过类名直接调用
    static void changeSchool(String newName) {
        schoolName = newName; // 修改所有学生共享的学校名称
    }
}

// 测试类
public class Main {
    public static void main(String[] args) {
        // 访问static变量(不需要创建对象)
        System.out.println("当前学校:" + Student.schoolName);
        
        // 创建两个学生对象
        Student s1 = new Student("张三", 15);
        Student s2 = new Student("李四", 16);
        
        // 调用实例方法
        s1.showInfo(); // 张三,15岁,就读于阳光中学
        s2.showInfo(); // 李四,16岁,就读于阳光中学
        
        // 通过类名调用static方法修改学校名称
        Student.changeSchool("希望中学");
        
        System.out.println("\n修改后的学校信息:");
        s1.showInfo(); // 张三,15岁,就读于希望中学
        s2.showInfo(); // 李四,16岁,就读于希望中学
        
        // 再次直接访问static变量
        System.out.println("当前学校:" + Student.schoolName);
    }
}

2.3 static成员变量初始化

        静态成员变量一般不会放在构造方法中初始化,构造方法里面初始化的是与对象相关的实例属性。

        初始化方式分为两种:就地初始化和静态代码块初始化

就地初始化在定义时直接给出初始值:

static String schoolName = "阳光中学"; // 最常用的初始化方式

静态初始化我们在后面进行介绍


3. 代码块

 3.1 代码块概念以及分类

        如图,使用{ }定义的一段代码称为代码块。 可以分为四类:

  • 普通代码块     构造块      静态块     同步代码块

3.1.1 普通代码块(少用)

  • 在方法内部用{ }包裹的代码块
void showInfo() {
    { // 普通代码块开始
        int temp = 10;
        System.out.println("变量是:" + temp);
    } // temp变量在这里被销毁
    
    // System.out.println(temp); // 这里会报错,temp已经不可用啦
}

3.1.2 构造代码块(实例代码块)

  • 类中直接使用{ }包裹的代码块(不加修饰符)。也叫做实例代码块,构造代码块一般用于初始化实例成员变量,这个代码块在方法的外面,类的里面
  • 每次创建对象时自动执行,且在构造方法之前
public class Student {
    // 实例变量
    String name;
    int age;
    
    // ---------- 构造代码块 ----------
    {
        // 这个代码块会在每次创建对象的时候执行
        System.out.println("执行构造代码块");
        age = 10; // 为所有学生设置默认年龄10
    }
    // -----------------------------
    
    // 构造方法
    public Student(String name, int age) {
        System.out.println("执行构造方法");
        this.name = name;
        this.age = age; // 会覆盖构造代码块中的默认值
    }
}

3.1.3 静态代码块

  • 使用static { }包裹的代码块称为静态代码块。一般用于初始化静态成员变量。
  • 类首次加载时执行,且仅仅执行一次
public class Student {
    static String schoolName;
    
    // 静态代码块
    static {
        System.out.println("静态代码块啦~");
        schoolName = "希望中学";
    }

}

        静态代码块只会执行一次,只要类被加载,就会被执行,而实例代码块一定是实例化对象的时候被执行。 

        若是三者都存在时,执行顺序:静态代码块 实例代码块 不带参数的构造方法。

希望能帮到友友们的学习~


制作不易,更多内容加载中~感谢友友们的点赞收藏关注~~

如有问题欢迎批评指正,祝友友们生活愉快,学习工作顺顺利利!

相关文章:

  • HYCX笔试
  • GNSS有源天线和无源天线
  • 【每日一个知识点】多项式回归(Polynomial Regression)
  • Scala的集合(二)
  • Shopify全栈开发指南:技术架构、API集成与主题定制实战
  • 基于猜想的矢量场和标量场和暗旋量场
  • 中断嵌套、中断咬尾、中断晚到
  • 基于分布式指纹引擎的矩阵运营技术实践:突破平台风控的工程化解决方案
  • 设计模式-单例设计模式
  • 【学习笔记】RL4LLM
  • 新能源汽车动力性与经济性优化中的经典数学模型
  • 从盲目清运到精准调度:一个AI芯片引发的智慧环卫升级
  • 用 Python 构建一个简单的本地视频流媒体服务器
  • Wallaby‘s: Nightmare (v1.0.2)靶场渗透
  • RuntimeError: Error(s) in loading state_dict for ChartParser
  • 太阳帆板测试#卫星工程系列
  • Python魔法方法:深入理解__repr__方法
  • 53. 评论日记
  • 彩虹表是什么
  • 0401react中使用css-react-css-仿低代码平台项目
  • 退休夫妻月入1.2万负债1.2亿申请破产,律师:“诚实而不幸”系前置条件
  • 2025上海十大动漫IP评选活动启动
  • 巴军事行动致印度70%电网瘫痪
  • 国家主席习近平会见斯洛伐克总理菲佐
  • 春秋航空:如果供应链持续改善、油价回落到合理水平,公司补充运力的需求将会增长
  • 央行设立服务消费与养老再贷款,额度5000亿元