本篇博客主要给大家介绍以下内容:
大一狗学不过来了,大家多多支持呀~
1.🐧封装的概念
面对对象程序有三大特性:封装、继承、多态。而类和对象阶段,主要研究的就是封装特性。何为封装呢?简单来说就是套一个壳来隐蔽细节。
比如:电脑这样一个负责的设备,提供给用户的就只是一些很容易上手的功能:开关机、通过键盘输入,显示器,USB插孔等,让用户来和计算机进行交互,以此来完成日常事务。
但一个计算机,真正工作的是黑匣子里面的CPU、显卡、内存等一些硬件元件。
对于计算机使用者而言,不用去关心内部的核心不见,比如主板上的线路是如何布局的?CPU是如何设计的?
用户只需要知道,怎么开机、怎么通过键盘和鼠标与计算机进行交互即可。
因此计算机厂商在出厂的时候,在外部套上壳子,将内部的实现细节隐藏起来,仅仅对外提供开关机、鼠标以及键盘插孔等,让用户可以与计算机进行交互即可,这样能让用户操作更舒适,也更进一步得保护电脑主机。对于我们写的程序来说也是这样
那么就可以引出Java中封装的概念
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,进对外公开接口来和对象进行交互
2.🍨访问限定符
Java中主要通过类和访问权限来实现封装:类可以将数据以及封装数据的方法结合在一起,更符合人类对事物的认知,而访问权限用来控制方法或者字段能否直接在类外使用。
Java中提供了四种访问限定符:
No | 范围 | private | defaul | protected | public |
---|---|---|---|---|---|
1 | 同一包中的同一类 | 🍉 | 🍉 | 🍉 | 🍉 |
2 | 同一包中的不同类 | 🍉 | 🍉 | 🍉 | |
3 | 不同包中的子类 | 🍉 | 🍉 | ||
4 | 不同包的非子类 | 🍉 |
比如:
public:可以理解为一个人的外貌特征,谁都可以看到
default:对于自己家族中(同一个包中)不是什么秘密,对于其他人来说就是隐私了
private:只有自己知道,其他人都不知道
🐱【说明】:
- protected主要是用在继承中,这一部分后面我会给大家介绍
- defaul权限就是指默认权限
- 访问权限除了可以限定类中成员的可见性,也可以控制类的可见性
这是一个计算机的类
public class Computer {
private String cpu;
// CPU
private String memory;
// 内存
public String screen;
// 屏幕
String brand;
// 品牌-----》default属性
public Computer(String brand,String cpu,String memory,String screen){
this.brand = brand;
this.cpu = cpu;
this.memory = memory;
this.screen = screen;
}
public void Boot(){
System.out.println("开机~~~~");
}
public void PowerOff(){
System.out.println("关机~~~~");
}
public void SurfInternet(){
System.out.println("网上冲浪!!");
}
}
class TestComputer{
public static void main(String[] args){
Computer p = new Computer("HW","i7","8G","13*14");
System.out.println(p.brand);
// default属性:只能被本报中类访问
System.out.println(p.screen);
// public属性:可以任何其他类访问
//System.out.println(p.cpu);
// private属性:只能在Computer类中访问,不能被其他类访问
}
}
3.🍩封装扩展之包
3.1🍪包的概念
在面向对象体系中,提出了一个软件包的概念,即:为了更好的管理,把多个类收集在一起为一组,称为软件包。有点类似于文件目录。
在Java中也引入了包的概念,包是对类、接口等的封装机制的体现,是一种对类或者接口等的很好的组织方式,比如:一个包中的类不想被其他包中的类使用。包还有一个重要的作用:在同一个工程中允许存在相同名称的类,只要处在不同的包中即可。(听不懂没关系,下面我会举例一一分析的~)
3.2🎂导入包中的类
Java中已经提供了很多现成的类供我们使用.例如Date类:可以使用java.util.Date导入java.util这个包中的Date类.
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());
}
}
但是我们更建议显式的指定要导入的类名,否则还是容易出现冲突的情况
我们要完善好导入的路径
我们也可以使用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);
}
⚠️注意事项:import和C++的#include差别很大.C++必须用#include来引入其他文件内容,但是Java不需要,import只是为了写代码的时候更方便。import更类似于C++的namespace 和using(这里就不多说了,我也不太懂,哈哈哈)
3.3🧁自定义包
🍧基本规则
- 在文件的最上方加上一个package语句指定该代码在哪个包中
- 包名需要尽量指定成唯一的名字,通常会用公司的域名的颠倒形式(例如com.bit.demo1).
- 包名要和代码路径相匹配。例如创建com.bit.demo1的包,那么会存在一个对应的路径com/bit/demo1来存储代码
- 如果一个类没有package语句,则该类被放到一个默认包中。
🥧操作步骤
首先创建包
我们这样输入之后,出来的是一个只有一行的包
不用着急, 我们把compact middle packages取消勾选
这样层次感就出来啦
中间的bit包中依旧可以导包
我们这里观察一个小细节👇:
这时我们在src目录中再创建一个同名得TestDemo类👇:
我们在这里必须要通过这种类似于绝对路径的方式来调用,不能通过导包,因为它们的名字都相同,就算是导包也解决不了重名的问题,编译器识别不了 👇:
上面也介绍到了,包访问权限就是我们所说的默认权限。
是不是还有些模糊,不要着急,我再用代码为你演示一遍
包权限就是默认权限,意思就是a这个成员变量在demo1这个包底下都可以访问到
我们列举三种情况:
第一种:在本类中👇
第二种,所在包的其他类中👇
第三种:
其他包的类当中👇
我们就可以验证了包访问权限即是默认访问权限了(default)
那么我们来观察public private修饰过后的权限👇
我们在TestDemo中定义了a,b,c三个变量,它们拥有不同的访问限定修饰符所修饰👆
那么我们可以看到在TestDemo这个类中,我们是可以调用三个数据的
然后我们在继续看这个demo1底下的另外一个包的调用情况👇
我们可以看到,private修饰的c这个成员变量就访问不到了👆
接着我们看其他包中的类引用情况👇
我们可以看到只有public修饰的成员变量才可以被访问到👆
这个时候那张表格我们就可以差不多理解了,哪张表格?再给大家放出来看一下👇
No | 范围 | private | defaul | protected | public |
---|---|---|---|---|---|
1 | 同一包中的同一类 | 🍉 | 🍉 | 🍉 | 🍉 |
2 | 同一包中的不同类 | 🍉 | 🍉 | 🍉 | |
3 | 不同包中的子类 | 🍉 | 🍉 | ||
4 | 不同包的非子类 | 🍉 |
我们常用的包
- java.lang:系统常用的基础类(String、Object),此包从JDK1.1后自动导入
- java.lang.reflect:Java反射编程包
- java.net:进行网络编程开发包
- java.sql:进行数据库开发的支持包
- java.util:是java提供的工具程序包(集合类等)
- java.io:I/O编程开发包
希望能帮到你~
感谢阅读~