面向对象特征之封装
封装 面向对象 特征
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关键字调用
我们发现但凡能被外部访问的成员都是有名字的。而初始化块是没有名字的,所以外界无从下手去调用它。
所以初始化块不能被访问权限控制符修饰。
相关文章
- GRE封装解封装过程
- Hbase学习之javaApI封装
- 【C/C++学院】0804-C语言和设计模式(继承、封装、多态)
- Java面向对象基础---名词概念的理解:方法的重载、构造函数、封装性
- 基于dispatch_after封装YXTimer
- Node.js模块封装及使用
- 6-1python语法基础-面向对象-类的定义属性和方法,类的作用域,类的封装继承多态,类的反射,单例模式
- python-面向对象-04_面向对象封装案例
- [Servlet&JSP] 封装器的使用
- iptables 面向对象封装
- 6-1python语法基础-面向对象-类的定义属性和方法,类的作用域,类的封装继承多态,类的反射,单例模式
- C# SQLite数据库 访问封装类
- Atitit usbQb212 oo 面向对象封装的标准化与规范解决方案java c# php js
- Atitit 面向对象 封装的实现原理
- iOS音视频开发九:视频封装,采集编码 H.264/H.265 并封装 MP4
- m基于光纤光栅传感网接入GPON的光纤通信系统matlab性能仿真,包括解码,解封装,分接,码率恢复,解帧,拆包,译码
- 使用SqlSugar封装的数据层基类
- 面向对象封装思想小结
- sqlite3数据库封装 - 动态链接库
- ISIS——基本概念1(邻居建立、路由计算、报文封装)
- C++CLR类库封装Native类库并用C#调用 - 草稿
- VS2019封装C++接口至可执行动态链接库.dll
- JAVA面向对象特征之——封装
- 【C++要笑着学】面向对象总结 | 瞎编的C++小故事 | 再次理解封装 | 再次理解面向对象