《JAVASE系列》类和对象篇:封装
《JAVASE系列》类和对象篇:封装
文章目录
- 《JAVASE系列》类和对象篇:封装
-
- 前言:
- 1.封装的概念
- 2.访问限定符
-
- 2.1 private
- 2.2 pubilc
- 2.3 protected
- 2.4 默认权限
- 3.封装扩展: 包
-
- 3.1 包的概念:
- 3.2 导入包中的类
- 3.3自定义包
- 3.4理解包访问权限:
- 3.5常见的包(了解即可)
- 总结:
前言:
本章主要学习:
- 封装的基本概念
- 访问限定符的基本概念
- 包的概念以及如何导包中的类,如何自定义包
参考书籍:《java核心卷1》
你若盛开,清风自来。
1.封装的概念
面向对象程序三大特性:封装、继承、多态。
而类和对象阶段,主要研究的就是封装特性。
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互
也就是说外部是无法访问这个对象的属性与具体实现方法的,只能通过公开的接口去调用这个对象的功能,使用者不需要知道这个对象的实现细节,只需要这个对象的接口能帮我们实现什么功能即可,大大提高了数据的安全性,提高了开发效率。
代码示例:
class A{ private String name; private String sex; private int age; public void printeas(String name,String sex,int age){ //相当于接口,可以被外部类访问 this.name = name; this.sex = sex; this.age = age; eat(); sleep(); } private void eat(){ System.out.println(name+"吃饭"); } private void sleep(){ System.out.println(name+"睡觉"); }}public class test { public static void main(String[] args) { A a = new A(); a.printeas("libai","boy",19); }}
运行结果:
通过简单的封装,我们不需要知晓类A的具体实现细节,我们只需要知道,这个公开的接口可以为我们打印一个人正在吃饭与睡觉的功能就可以了。
2.访问限定符
2.1 private
在类中被private修饰的属性与方法只能在本类中使用。
2.2 pubilc
哪里都可以访问,具有公共性。
但是要注意的是:
- 由public修饰的变量与方法不可以随意更改变量名与方法名,否则会带来不必要的麻烦。
- 由于public具有公共性,所以定义时应谨慎。
2.3 protected
由于与继承相关,本章不讲解。
2.4 默认权限
默认权限即不在成员变量与方法前加限定符,java编译器会赋予它一个默认的限定符。使这个被修饰的具有包访问权限
包访问权限:即只能在该文件夹底下访问类的属性与方法。
3.封装扩展: 包
3.1 包的概念:
在面向对象体系中,提出了一个软件包的概念。
软件包:将多个类统一放在同一个文件夹底下,更好地管理类。
java体系也引入了包的概念,让封装的优势极大得得到发挥,包的存在也允许了一个程序下可以存在相同名称的类,只要不在同一个包底下即可。提高了开发效率。
3.2 导入包中的类
在java中,已经提供了大量的类供我们使用,我们可以直接在工程中导入这个包中的类,就可以直接使用这个类了。
方式一:在每个类的前面加上前缀:java.文件名.类名
public class Test { public static void main(String[] args) { java.util.Date date = new java.util.Date(); // 得到一个时间戳 System.out.println(date.getTime()); }}
方式二:使用 import语句导入包.
import java.util.Date; //导入该包下的类public class Test { public static void main(String[] args) { Date date = new Date(); // 得到一个毫秒级别的时间戳 System.out.println(date.getTime()); }}
方式三:需要使用 java.util 中的其他类, 可以使用 import java.util.* 这样编译器会根据你使用的类去智能判断。
import java.util.*;public class Test { public static void main(String[] args) { Date date = new Date(); // 得到一个毫秒级别的时间戳 System.out.println(date.getTime()); }}
但是建议显式的指定要导入的类名. 否则还是容易出现冲突的情况.
例如:Date并不是只在一个文件下存在
import java.util.*;import java.sql.*;public class Test { public static void main(String[] args) { // util 和 sql 中都存在一个 Date 这样的类, 此时就会出现歧义, 编译出错 Date date = new Date(); System.out.println(date.getTime()); }}
编译器无法得知你要调用哪个包底下的类,导致编译出错
方式四:使用import static导入包中静态的方法和字段。
一般来说:
import java.lang.Math.*;public class Test { public static void main(String[] args) { double x = 30; double y = 40; double result = Math.sqrt(pow(x, 2) + Math.pow(y, 2)); System.out.println(result); }}
使用import static导入包中静态的方法和字段。
import static java.lang.Math.*;public class Test { public static void main(String[] args) { double x = 30; double y = 40; // 静态导入的方式写起来更方便一些. // double result = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)); double result = sqrt(pow(x, 2) + pow(y, 2)); System.out.println(result); }}
不建议使用,降低了代码的可读性
3.3自定义包
在idea底下:
然后输入:文件名.文件名.文件名
就可以得到如下有等级的三个文件夹:
在self包中创建一个类:self
可以看到:
这是
该类的包声明:声明了这个类在哪个包之下。
3.4理解包访问权限:
如下代码:
在两个文件夹下创建不同的类:
文件my.self下:
文件my.self2下:
会导致Test2无法识别Test下的private修饰的变量与默认权限下的变量
3.5常见的包(了解即可)
- java.lang:系统常用基础类(String、Object),此包从JDK1.1后自动导入。
- java.lang.reflect:java 反射编程包;
- java.net:进行网络编程开发包。
- java.sql:进行数据库开发的支持包。
- java.util:是java提供的工具程序包。(集合类等) 非常重要
- java.io:I/O编程开发包。
总结:
学习完需要能回答出以下问题:
- 说说java的封装
- 熟悉java的各类访问限定符吗(除了protected)
- 如何导包中的类,如何自定义包?
感谢阅读!
与君共勉!