zl程序教程

您现在的位置是:首页 >  前端

当前栏目

面向对象特征之封装

封装 面向对象 特征
2023-09-14 09:04:05 时间

思维导图

代码练习

符合封装要求的类需要具备

public class JavaBeanModel {
    // 私有化类的属性
    private String name;
    private int age;

    // 提供公开地getter方法来帮助外部获取类的私有化属性
    public String getName() {
        return name;
    }

    // 提供公开地setter方法来帮助外部修改类的私有化属性
    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

package关键字使用

// 使用package关键字指定一个类的包名
// package语法格式是: package packageName;
// package语句应该放在Java源文件的第一行非注释行
// 包名应该全小写
// 一个Java源文件只能指定一个包,即只能定义一个package语句
// 一个Java源文件中可以定义多个类,如果指定包的话,则这些类都在该包下
package encapsulation;

public class EncapSulationTest {

    public static int age ;

    public static void info(){
        System.out.println("hhhh");
    }

}

import(static)关键字使用

package encapsulation2;

// import(static)语句必须定义在package语句和class定义之间
// import(static)语句可以有0到多个
// java默认所有源文件隐式地import java.lang.*;

// 导入特定包下的特定类
import encapsulation.EncapSulationTest;
// 导入特定包下的全部类
import encapsulation.*;

// 导入特定包下的特定类下的特定静态成员
import static encapsulation.EncapSulationTest.age;
import static encapsulation.EncapSulationTest.info;

// 导入特定包下的特定类下的所有静态成员
import static encapsulation.EncapSulationTest.*;

public class EncapSulationTest2 {
    public static void main(String[] args) {
        // 使用不同包的类时,如果没有使用import导入该包下全部类,或者导入该包下对应类,则需要加加包名限定
        //new encapsulation.EncapSulationTest();

        // 如果已经使用import导入该包下全部类,或者导入该包下对应类,则不需要加加包名限定
        new EncapSulationTest();

        // 使用import static后,不需要加导入类的类名限定就可以直接调用该类的静态成员
        info();
        System.out.println(age);
    }
}

思考题

外部类可以被什么访问权限控制符修饰,为什么?

外部类只能被public和默认访问修饰控制符修饰,因为外部类的顶层不是类,而是包。
private表示只能在本类中被访问
protected有一个表示是被其他包中的子类访问。
这两个修饰符的顶层是类。

使用public修饰的外部类,可以被任意包下地类使用。
使用默认修饰的外部类,可以被同包的其他类使用。
这两个修饰符的顶层是包。

有package定义的源文件编译效果

javac JavaBeanModel.java

编译效果

javac -d . JavaBeanModel.java

编译效果

结论:当使用带-d参数的javac命令编译Java源文件时,该命令会根据Java源文件的包定义来创建对应的文件夹结构来存放class文件。

在学习java过程中,我们可能需要经常使用System.out.println()语句,为什么使用System类却无需特别导入该类?另外,有办法优化该语句吗,或者有简单方式实现简写该语句吗?

因为Java源文件默认隐式导入java.lang包下的所有类。而System类就是java.lang包下的,所以无需额外导入。

当前System.out.println()由于已经默认导入了java.lang.System,所以已经被简化过一次了,如果没简化的话则应该时java.lang.System.out.println()

我们发现out可以使用System类直接调用,则说明out是一个静态成员。

我们知道import static可以导入某包下某类下的某个(或所有)静态成员,且导入后,连类名都可以不写。所以

import static java.lang.System.out;

public class Test {
    public static void main(String[] args) {
        out.println("我是java.lang.System类下的静态成员,我可以被import static,被导入后,包名,类名都不要写了");
    }
}

所有的Java类的成员都可以被访问权限控制符修饰吗?

不是。

我们需要知道访问权限控制符的作用是什么?

访问权限控制符是控制被修饰的类或类的成员不被外部随意访问。

所以,类的成员想被访问权限控制符修饰,那要能具备被外界访问到的能力。

我们知道类的成员有成员变量,方法,构造器,初始化块,内部类,枚举类。

其中成员变量,方法,内部类,枚举类可以被外部用类名或对象名访问

构造器可以被可以被外部用new关键字调用

我们发现但凡能被外部访问的成员都是有名字的。而初始化块是没有名字的,所以外界无从下手去调用它。

所以初始化块不能被访问权限控制符修饰。