JavaSE--类和对象·下
1.封装
1.1封装概念
Java中的封装是指将类的数据和操作封装在一个单元内,对外部隐藏内部实现细节,并通过访问修饰符控制对类的成员的访问权限。
封装的关键在于使用访问修饰符来控制对类的成员的访问权限。Java提供了几种访问修饰符:

通过封装,我们可以隐藏类的内部实现细节,只暴露必要的方法给外部使用。这样可以提高代码的安全性和可维护性,同时还可以提供一些额外的功能,如数据验证、数据转换等。
下面是一个简单的示例代码,演示了如何使用封装:
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age < 0) {
throw new IllegalArgumentException("Age can't be negative");
}
this.age = age;
}
}
public class Main {
public static void main(String[] args) {
Person person = new Person();
person.setName("John");
person.setAge(30);
System.out.println("Name: " + person.getName());
System.out.println("Age: " + person.getAge());
}
}
在上面的示例中,Person类的name和age字段被声明为私有的(private),外部类无法直接访问它们。为了访问这些字段,我们提供了getName和setName方法来获取和设置name字段的值,以及getAge和setAge方法来获取和设置age字段的值。在setAge方法中,我们还添加了一个数据验证的逻辑,确保年龄不会为负数。这样,我们就可以在外部类中安全地使用Person对象的属性。
1.2封装扩展之包
1.2.1导入类中的包
Java 中已经提供了很多现成的类供我们使用。
public class Test {
public static void main(String[] args) {
java.util.Date date = new java.util.Date();
// 得到一个毫秒级别的时间戳
System.out.println(date.getTime());
}
}
import java.util.Date;
public class Test {
public static void main(String[] args) {
Date date = new Date();
// 得到一个毫秒级别的时间戳
System.out.println(date.getTime());
}
}
import java.util.*;
public class Test {
public static void main(String[] args) {
Date date = new Date();
// 得到一个毫秒级别的时间戳
System.out.println(date.getTime());
}
}
常见的包
- 1. java.lang:系统常用基础类(String、Object)。
- 2. java.lang.reflect:java 反射编程包;
- 3. java.net:进行网络编程开发包。
- 4. java.sql:进行数据库开发的支持包。
- 5. java.util:是java提供的工具程序包。
- 6. java.io:I/O编程开发包。
1.2.2自定义包
基本规则
- 在文件的最上方加上一个 package 语句指定该代码在哪个包中。
- 包名需要尽量指定成唯一的名字, 通常会用公司的域名的颠倒形式(例如 com.bit.demo1 )。
- 包名要和代码路径相匹配. 例如创建 com.bit.demo1 的包, 那么会存在一个对应的路com/bit/demo1 来存储代码。
- 如果一个类没有 package 语句, 则该类被放到一个默认包中。
2.static成员
2.1static修饰成员变量
静态成员变量特性
- 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中
- 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
- 类变量存储在方法区当中
- 生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁)
//三位同学共享一间教室
public class Student{
public String name;
public String gender;
public int age;
public double score;
public static String classRoom = "Bit306";
public static void main(String[] args) {
// 静态成员变量可以直接通过类名访问
System.out.println(Student.classRoom);
Student s1 = new Student("Li leilei", "男", 18, 3.8);
Student s2 = new Student("Han MeiMei", "女", 19, 4.0);
Student s3 = new Student("Jim", "男", 18, 2.6);
// 也可以通过对象访问:但是classRoom是三个对象共享的
System.out.println(s1.classRoom);
System.out.println(s2.classRoom);
System.out.println(s3.classRoom);
}
}
2.2static修饰成员方法
public class Student{
private static String classRoom = "Bit306";
public static String getClassRoom(){
return classRoom;
}
}
public class TestStudent {
public static void main(String[] args) {
System.out.println(Student.getClassRoom());
}
}//输出Bit306
静态成员方法特性
- 不属于某个具体的对象,是类方法
- 可以通过对象调用,也可以通过类名.静态方法名(...)方式调用,更推荐使用后者
- 不能在静态方法中访问任何非静态成员变量
- 静态方法中不能调用任何非静态方法,因为非静态方法有this参数,在静态方法中调用时候无法传递this引用
- 静态方法无法重写,不能用来实现多态
2.3成员方法或成员变量的调用
- 通过对象的引用调用
- 通过类名调用
在静态的方法当中不能直接使用任何非静态的成员变量和成员方法。要想使用,要通过new对象,然后通过对象的引用访问。但是在非静态方法当中,可以直接使用静态的成员方法或者静态的成员变量 。
2.4static成员变量初始化
- 就地初始化
- get set初始化
- 构造方法初始化
- 静态代码块初始化
3.代码块
Java代码块(Code Block)是一组用大括号 {} 包围的语句,它们可以被视为一个独立的单元。
代码块可以用来定义局部变量,这些变量只在代码块内部有效。这样可以控制变量的作用域,避免变量冲突和命名冲突。
代码块还可以用来组织代码,将相关的语句放在一起。例如,可以在代码块中定义一个局部变量,并在代码块内部使用这个变量,这样可以限制变量的作用范围,提高代码的可读性和可维护性。
代码块可分为以下几种:
- 静态代码块:用
static关键字修饰,用来初始化类的静态变量。- 实例代码块:不带任何修饰符,用来初始化实例变量。
- 构造代码块:也称为构造方法内部的代码块,在创建对象时执行。
例如:
public class Main {
public static void main(String[] args) {
int a = 10;
int b = 5;
// Java代码块开始
{
int sum = a + b;
System.out.println("Sum: " + sum);
}
// Java代码块结束
int c = 7;
int d = 3;
// Java代码块开始
{
int product = c * d;
System.out.println("Product: " + product);
}
// Java代码块结束
}
}
3.1静态代码块
静态代码块(Static Initialization Block)是一个特殊的代码块,在类加载时执行,并且只执行一次。它用 static 关键字修饰,用来初始化类的静态变量或执行一些静态方法。
静态代码块的语法如下:
static {
// 静态代码块中的代码
}
在静态代码块中,可以编写任意合法的 Java 代码。静态代码块中的代码会在类第一次加载的时候执行,并且只执行一次。
静态代码块的主要作用是在类加载时进行一些初始化操作,例如读取配置文件、加载驱动程序等。由于静态代码块在类加载时执行,因此它的执行顺序是在静态变量初始化之前。
下面是一个静态代码块的示例:
public class MyClass {
static {
// 初始化静态变量
// 执行其他静态代码
}
}
需要注意的是,静态代码块不能访问非静态成员(比如实例变量和实例方法),因为它是在类加载过程中执行的,而不是在对象创建过程中执行的。
3.2 实例代码块
实例代码块(Instance Initialization Block)是在创建对象时执行的一段代码,它在每次创建对象时都会执行一次。实例代码块不需要使用关键字修饰,直接在类中定义即可。
实例代码块的语法如下:
{
// 实例代码块中的代码
}
实例代码块与构造方法的执行顺序是在构造方法之前执行的。每当创建对象时,实例代码块都会被执行一次。
实例代码块的主要作用是在对象创建时进行一些初始化操作,例如初始化实例变量。也可以在实例代码块中执行其他任意合法的 Java 代码。
下面是一个实例代码块的示例:
public class MyClass {
{
// 初始化实例变量
// 执行其他代码
}
}
需要注意的是,实例代码块不能访问静态成员(比如静态变量和静态方法),因为它是在对象创建过程中执行的,而不是在类加载过程中执行的。
