目录
系列文章目录
第二章 Java 封装
第三章 Java 继承
第四章 Java 多态
附:static关键字
附:this和super
前言
本篇博客主要讲解Java基础语法中的
面向对象系列之
封装的概念、四大访问修饰符的详细解释、封装成员变量配套的setter和getter方法及快捷键的使用、封装的意义。
包的概念的引入、如何导入包、快捷查看我们导入包中的类的方法、查看导入包的jdk中的源码、通配符*、import和c语言中include的区别、自定义包(如何分解)、常见的包的介绍。
大家好,本人是普通一本的在校大学生一枚,目前在学习java。之前也学了一段时间,但是没有发布博客。本人现在已经大二结束了,开学就大三了,时间过的真的很快。我会利用好这个暑假,来复习之前学过的内容,并整理好之前写过的博客进行发布。如果博客中有错误或者没有读懂的地方。热烈欢迎大家在评论区进行讨论!!!
喜欢我文章的兄弟姐妹们可以点赞,收藏和评论我的文章。喜欢我的兄弟姐妹们以及也想复习一遍java知识的兄弟姐妹们可以关注我呦,我会持续更新滴,并且追求完整。
望支持!!!!!!一起加油呀!!!!
语言只是工具,不能决定你好不好找工作,决定你好不好找工作的是你的能力!!!!!
学历本科及以上就够用了!!!!!!!!!!!!!!!!!!!!!!!!!!!!
封装的意义:
封装的主要作用在于对外隐藏内部实现细节,提高程序的安全性。
为了更好的讲封装,我们先引入包的概念。
软件包的引入
1.包的概念
在面向对象体系中,提出了一个软件包的概念,即:
为了更好的管理类,把多个类收集在一起成为一组,称为软件包。
类似于目录。
在Java中也引入了包
包是对类、接口等的封装机制的体现,是一种对类或者接口等的很好的组织方式,
比如:一个包中的类不想被其他包中的类使用。
包还有一个重要的作用:在同一个工程中允许存在相同名称的类,只要处在不同的包中即可。
2.导入包中的类
使用 import语句导入包
例如我们之前讲到的java键盘的输入,当我们写出Scanner。上方就会自动导包出现
import java.util.Scanner;
这个语句,实际上就是导入包中的Scanner类。
通配符:*
如果想导入java.util包下面的所有类。那么可以使用
import java.util.*;
这个语句。
注:更建议显式的指定要导入的类名. 否则还是容易出现冲突的情况.
比如:
import java.util.*;
import java.sql.*;
util 和 sql 中都存在一个 Date 这样的类, 此时就会出现歧义, 编译出错。
java.sql 中的类 java.sql.Date 和 java.util 中的类 java.util.Date 都匹配
更多关于包的概念在这篇文章的后面会再讲到
再了解封装之前我们首先了解一下四大访问修饰限定符。
一、四大访问修饰限定符
谈到封装我们首先了解一下访问修饰限定符。后面会用到
private:
是类访问权限。只能访问同一包中的同一类。
default:
是包访问权限。只能访问同一包下面的同类或者不同类。
是默认的,你不加访问修饰限定符,编译器默认就是default权限。
protect(难点):
不同包中的子类的访问权限。
可以访问在不同包之中是子类的访问(子类继承中的知识)。也可以访问同一包中的同类和不同类。
在其他包继承了protect修饰的类那么需要在非静态方法中使用super去访问父类的成员
public:
同包还是不同包,同类还是不同类,哪里都可以访问到。
我们用一张图,更直观的感受四大访问修饰符。
二、封装
2.1封装的概念:
将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节仅对外公开接口进行交互
(比如我们的电脑主机,只提供了一些接口供我们用户使用,而用户不需要去管内部是怎样实现的)
2.2封装的代码示例:
(被private修饰就相当于封装。)
class PetDog {
//成员变量
private String name;//名字
private String color;//颜色
private int age; //年龄
// 狗的属性
//构造方法
public PetDog() {
this("阿花", "花色", 25);
System.out.println("构造方法1");
}
public PetDog(String name, String color, int age) {
this.name = name;
this.color = color;
this.age = age;
System.out.println("构造方法2");
}
//成员方法
// 狗的行为
public void barks() {
System.out.println(this.name + ": 旺旺旺~~~");
}
public void wag() {
System.out.println(this.name + ": 摇尾巴~~~");
}
}
public class Test {
//在主函数中,我们进行实例化这个类。并对实例化出的类进行使用。
public static void main(String[] args) {
PetDog dog1 = new PetDog();
System.out.println("姓名:" + dog1.name);
System.out.println("颜色:" + dog1.color);
System.out.println("年龄:" + dog1.age);
dog1.barks();
dog1.wag();
}
}
我们发现与类和对象讲的相似的,我们这里代码的区别就是将成员变量用了private修饰,而不是以前的public。在前面我们看到private修饰之后这个变量就只能在当前类之中使用了,因此上述主函数中就不能这么写了。如下:会编译报错。
那么我们还想要去访问这个成员变量该如何访问呢,这里我们就用到了setter和getter这两个方法去初始化和访问它们。
Setter(初始化封装的成员变量)
代码示例:(相当于创建了setter这个公开的成员方法去初始化我们的对象)
快捷键:
快捷1:在这个类当中鼠标右键,点击generate...再点击Setter,之后我们可以选择参数,再点击ok就行了,如果需要选择多个参数,只需要按住Ctrl点击就可以选择多个参数了
快捷2:光标点在这个类当中,按键盘Alt+Insert,再点击Setter,之后与快捷1同理。
下面代码中还用到了Getter,Getter的快捷健我们也在下面说到了。
//创建一个狗类
class PetDog {
//成员变量
private String name;//名字
private String color;//颜色
private int age; //年龄
// 狗的属性
//构造方法,//我们在这里创建了多个构造方法,方便后面的使用。
public void setName(String name) {
this.name = name;
}
public void setColor(String color) {
this.color = color;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public String getColor() {
return color;
}
public int getAge() {
return age;
}
//成员方法
// 狗的行为
public void barks() {
System.out.println(this.name + ": 旺旺旺~~~");
}
public void wag() {
System.out.println(this.name + ": 摇尾巴~~~");
}
}
public class Test {
//在主函数中,我们进行实例化这个类。并对实例化出的类进行使用。
public static void main(String[] args) {
PetDog dog1 = new PetDog();
dog1.setName("阿绿");
dog1.setColor("绿色");
dog1.setAge(15);
System.out.println("姓名:" + dog1.getName());
System.out.println("颜色:" + dog1.getColor());
System.out.println("年龄:" + dog1.getAge());
dog1.barks();
dog1.wag();
}
}
输出结果:
姓名:阿绿
颜色:绿色
年龄:15
阿绿: 旺旺旺~~~
阿绿: 摇尾巴~~~
通过setter和getter我们就可以在外部成功初始化和访问我们已经封装好的成员变量。setter与构造方法类似,不过它不是构造方法,相当于成员方法。但是它方法实现的内容就是给我们的成员变量进行初始化。如果我们不想用setter去初始化对象,可以用构造方法去初始化,之后用Getter获取相应的值也是可以的,如下:
Getter((得到封装的成员变量的值))
快捷键:
快捷1:在这个类当中鼠标右键,点击generate...再点击Getter,之后我们可以选择参数,再点击ok就行了,如果需要选择多个参数,只需要按住Ctrl点击就可以选择多个参数了
快捷2:光标点在这个类当中,按键盘Alt+Insert,再点击Getter,之后与快捷1同理。
代码示例:
//创建一个狗类
class PetDog {
//成员变量
private String name;//名字
private String color;//颜色
private int age; //年龄
// 狗的属性
//构造方法,//我们在这里创建了多个构造方法,方便后面的使用。
public PetDog() {
this("阿花", "花色", 25);
System.out.println("构造方法1");
}
public PetDog(String name, String color, int age) {
this.name = name;
this.color = color;
this.age = age;
System.out.println("构造方法2");
}
public String getName() {
return name;
}
public String getColor() {
return color;
}
public int getAge() {
return age;
}
//成员方法
// 狗的行为
public void barks() {
System.out.println(this.name + ": 旺旺旺~~~");
}
public void wag() {
System.out.println(this.name + ": 摇尾巴~~~");
}
}
public class Test {
//在主函数中,我们进行实例化这个类。并对实例化出的类进行使用。
public static void main(String[] args) {
PetDog dog1 = new PetDog();
System.out.println("姓名:" + dog1.getName());
System.out.println("颜色:" + dog1.getColor());
System.out.println("年龄:" + dog1.getAge());
dog1.barks();
dog1.wag();
}
}
输出结果:
构造方法2
构造方法1
姓名:阿花
颜色:花色
年龄:25
阿花: 旺旺旺~~~
阿花: 摇尾巴~~~
如果不用setter,我们可以用构造方法进行初始化,之后直接用getter获取到也可以。
Setter和Getter
setter和getter相当于一个组合,一个对封装的变量进行赋值,另一个用来返回这个变量的值。如果要一起使用Setter和Getter,那么还有一个快捷健就是
快捷1:在这个类当中鼠标右键,点击generate...再点击Getter and Setter和,之后我们可以选择参数,再点击ok就行了,如果需要选择多个参数,只需要按住Ctrl点击就可以选择多个参数了
快捷2:光标点在这个类当中,按键盘Alt+Insert,再点击Getter and Setter,之后与快捷1同理。
这样Setter和Getter就可以一起被创建了。
三、封装的拓展之包
3.1导入包当中的类(上文简单讲过)
通过import去导入包当中的类。例如:
我们在打印数组时,将数组转换为字符串需要用到toString(数组名)这个方法,我们的写法是Arrays.toString(array);此时就需要导入包当中的类,我们才可以使用这个方法,我们的写法是在代码开头添加
import java.util.Arrays;
这样一个语句。
Arrays就是Java中给我们提供的现成的类。(这些源码是我们安装JDK时当中有个src里面的)
这个类存在在java.util这个包中。需要我们导入这个类,这样我们就可以在当前类中使用Arrays类中已经编译好的方法了。
如何查看导入类中的方法
1.按住Ctrl再点击我们使用的导入的类中的方法,我们就可以进入到这个类中看这个方法的源码是什么,
2.左下角有个structure点击它或者我们按Alt+键盘上方的数字7。在左下角我们就可以看到这样类中的所有的方法了。
查看JDK为我们提供的源码
IDEA左边有一个叫External Libraries文件,点开后我们可以看到我们安装的JDK的本版文件。
我安装的是JDK1.8。再点开这个1.8文件
我们看到了这些。而源码的文件在一个叫rt的文件中后缀名是jar。点开后我们就可以看到java,再点开java我们就能看到util这个包。我们导入的包中的类就是在这里啦!
让我们找到我们常用的Arrays这个类
我们发现它的顶行有一个
package
package java.util;
这样的声明。这个声明的作用是说明当前的(java文件)类在哪一个包里面。package java.util;意思就是当前这个类(文件)在包java中的包util里面。再用;表示结束
3.2import与c语言中include的区别
include 是在预编译时,将那个文件全部导入进来
import 并没有将那个文件全部导入进来,而是用到了这个文件中的哪个方法就去找对应的方法,不用也不会导入进来。
注意事项 : import 和 C++ 的 #include 差别很大 . C++ 必须 #include 来引入其他文件内容 , 但是 Java 不需要 .import 只是为了写代码的时候更方便 . import 更类似于 C++ 的 namespace 和 using
3.3 包的静态导入(了解即可)
在import后面加一个static再写出包中的类再
.* 星号是通配符的意思。意思是这个类中所有的方法都可以匹配到。
如下,这样静态导入之后我们就
不用再先写出Math再用点号来引用sqrt方法。相当于将这个方法变成静态。直接用就好了
直接写出方法就可以了,不过这样很少用,了解即可。
3.4自定义包
注:包名一般是公司域名的倒置。比如www.bat.com,而包名写成com.bat.www。这样写包名实际上我们创建了三个文件夹,我们想在哪个文件里写东西都是可以的。
1.在文件的最上方加上一个 package 语句指定该代码在哪个包中 .2.包名需要尽量指定成唯一的名字 , 通常会用公司的域名的颠倒形式 ( 例如 com.bit.www ).3. 包名要和代码路径相匹配. 例如创建 com.bit.www 的包 , 那么会存在一个对应的路径 com/bit/www 来存储 代码.4.如果一个类没有 package 语句 , 则该类被放到一个默认包中 .5.包名的所有字母都必须是小写。
![](https://img-blog.csdnimg.cn/352ccd4163a6433b9e3e7aecc91064c6.png)
建好之后,我们再建一个Test类,之后就如上图所示。顶上会自动有一个声明。表示这个类存在在哪个包里面。
点击小齿轮,我们可以将点号分开的名字转换成单个的包的形式。
将Compact Middle Packages的对勾取消掉即可。
就变成了这样
当我们打开电脑中Java项目中的文件夹,我们发现我们的包文件名被点号分成了三个文件,我们可以在任意文件也就是包中再去创建类。 (当然也可以在包中再去创建包)
3.5 常见的包
1. java.lang: 系统常用基础类 (String 、 Object), 此包从 JDK1.1 后自动导入。(lang底下直接的类不需要import导入。)其他都需要导入。2. java.lang.reflflect:java 反射编程包 ;3. java.net: 进行网络编程开发包。4. java.sql: 进行数据库开发的支持包。5. java.util: 是 java 提供的工具程序包。 ( 集合类等 ) 非常重要6. java.io:I/O 编程开发包。
以上就是我们将的包中的所有内容了。
总结
1.什么是封装?
对类的成员进行隐藏,通过关键字private,只是对类外提供公开的接口来进行访问。
2.封装的意义?
隐藏类的实现细节,从而达到安全性。