封装
前言
面向对象的三大特性:封装(基础、简单)、继承、多态。(抽象)
在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法。
封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。
要访问该类的代码和数据,必须通过严格的接口控制。
封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。
适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。
1. 理解封装的作用
程序设计追求“高内聚,低耦合”。高内聚就是类的内部数据操作细节自己完成,不允许外部干涉。低耦合是仅暴露少量的方法给外部使用,尽量方便外部调用。
编程中封装的具体优点/作用:
1.降低了大型系统的风险,提高代码的安全性。
2.可以有效解决不合理赋值的问题,提高代码的复用性。
3.“高内聚”:封装细节,便于修改内部代码,提高可维护性
4.“低耦合”:简化外部调用,便于调用者使用,便于扩展和写作。(牵连小)
java中使用“访问控制符”来控制哪些细节需要封装。哪些细节需要暴露的。Java中4种“访问控制符”。分别为:private(私有的)、default(不履行;不参加)、protected(受保护的)、public(公共的),他们说明了面相对象的封装性。
2. 掌握封装的使用
1.打开eclipse,封装首先会通过private私有化变量,限制对类属性的访问,如下图所示:
2.通过set和get方法设置对每个属性对外访问接口,外部需要改变类的属性,需要通过这些公共public的方法,如下图所示:
3.这里介绍一个java封装类的实例,创建一个Test类,对变量进行私有,方法进行公共,set和get方法可以自动生成,如下图所示:
4.创建一个Test2类,创建Test类的对象,通过对象设置封装类的属性,然后通过get方法获取这些属性,如下图所示:
5.运行项目指挥,在控制台可以看到成功获取了封装类的属性,如下图所示:
封装使用的小总结:
- 属性私有化
- 提供公共的getter和setter方法
- 提供无参构造方法(通过方法获取属性)
- 实现序列化接口
- 输出打印
3.会使用Java的包来组织类
Java 包(package)的命名规范:
Java 包(package),为了更好地组织类,Java提供了包机制,用于区别类名的命名空间。
首先我们该知道的是,java的包名都是由小写单词组成的,类名的首字母都是大写,也就是我们常用的驼峰写法,包路径一般都是对系统模板的定义与归类。这样看了包名很容易就明白哪一个模块是干什么的,很容易通过对应的包路径找到对应的代码!
在java开发的过程中,每名Java开发人员都可以编写属于自己的java package,为了在编写中保证每一个java package命名的唯一性,要求开发人员在自己定义的包名前加上唯一的前缀。所以多数开发人员采用自己公司的名称.项目名 … 模块名在互联网上的域名称作为自己程序包的唯一前缀。例如: com.sun.xml …
例如一般个人的项目的命名方法如下:
indi :
个体项目,指个人发起,但非自己独自完成的项目,可公开或私有项目,版权主要属于发起者。
包名为indi.发起者名.项目名.模块名 ...
pers :
个人项目,指个人发起,独自完成,可分享的项目,版权主要属于个人。
包名为pers.个人名.项目名.模块名 ...
priv :
私有项目,指个人发起,独自完成,非公开的私人使用的项目,版权属于个人。
包名为priv.个人名.项目名.模块名 ...
另外,我为了区分团队项目和前面所说项目的区分,还有了以下扩展:
team :
团队项目指由团队发起,并由该团队开发的项目,版权属于该团队所有。
包名为team.团队名.项目名.模块名 ...
com :
公司项目:由项目发起的公司所有。
包名为com.公司名.项目名.模块名 ...
为什么使用包(包的好处):
- 可重用性。在java中开发项目时,我们常常觉得我们的代码中一遍又一遍地写的东西很少。使用包,您可以在包内部以类的形式创建这样的东西,并且只要您需要执行相同的任务,只需导入该包并使用该类。
- 用于对类和接口进行分类,以便更好的组织和维护它们。在我们有数百个类的大型Java项目中,总是需要将相似类型的类分组到一个有意义的包名中,以便您可以更好地组织项目,并在需要时快速定位它并使用它,这提高了效率。
- 防止命名冲突。我们可以在不同的包中定义两个具有相同名称的类,以避免名称冲突,我们就可以使用包。
如何使用包:
在定义好包之后,如果在包下定义类,类中一定要在有效代码的第一行添加package包声明。
如果在不同包中使用某个类:
那么一定要在使用类中声明包的导入语句。 import要引入的类地址; 例如:使用Scanner 、 Arrays
如果不这样做,JVM无法确认该类型的地址,也无法区分多个同名类型。
import导入包声明 需要放在package声明下,类声明上的位置,它们之间的位置顺序固定。
java.lang包下的内容不需要手动导入!例如:System、String
例如:
package cn.kgc.demo1;
// 导入时 可以使用精细导入(全类名 / 全限定名 / 全/类路径) 也可以使用批量通配导入*
import java.util.Scanner;
public class Test{
}
4. 理解和掌握使用访问修饰符
访问权限修饰符在类的成员变量和方法的应用:
- Public:公共访问权限,一个类中被public所修饰的成员变量或方法,能够被所有的类(包括这个类本身)访问。
- Protected:保护访问权限,一个类中被protected所修饰的成员变量和方法,只能够被同一个包内的类,它的子类,和该类本身所访问。
- default:默认包权限, 使用方式就是:不添加权限修饰符,那么这个类的成员变量或者方法就是default的了,它的成员变量和方法只能够被同一个包内的类,和这个类本身所访问。
- Privated:私有访问权限,一个类中被privated所修饰的成员变量和方法,只能够被这个类本身所访问。
static(静态的)关键字:
特点:
1.static是一个修饰符,用于修饰成员。(成员变量,成员函数)static修饰的成员变量 称之为静态变量或类变量。
2.static修饰的成员被所有的对象共享。
3.static优先于对象存在,因为static的成员随着类的加载就已经存在。
4.static修饰的成员多了一种调用方式,可以直接被类名所调用,(类名.静态成员)。
5.static修饰的数据是共享数据,对象中的存储的是特有的数据。
private static int age;//用static修饰的成员变量静态变量或者叫做类变量
private String name; //成员变量
public static void show(){//静态函数 可直接用类来调用
System.out.println(" ");
}
public void showDemo(){//成员函数 需要创建对象才可以调用
System.out.println(" ");
}
成员变量和静态变量的区别:
1.生命周期的不同:
成员变量随着对象的创建而存在随着对象的回收而释放。
静态变量随着类的加载而存在随着类的消失而消失。
2.调用方式不同:
成员变量只能被对象调用。
静态变量可以被对象调用,也可以用类名调用。(推荐用类名调用)
3.别名不同:
成员变量也称为实例变量。
静态变量称为类变量。
4.数据存储位置不同:
成员变量数据存储在堆内存的对象中,所以也叫对象的特有数据。
静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据。
public class Demo {
private static int age;//用static修饰的成员变量静态变量或者叫做类变量
private String name; //成员变量
public static void show(){//静态函数 可直接用类来调用
System.out.println(" ");
}
public void showDemo(){//成员函数 需要创建对象才可以调用
System.out.println(" ");
}
public static void main(String[] args) {
Demo.age = 1;//静态变量可以直接用类名调用。随着类加载而存在类的消失而消失
Demo b = new Demo();
b.age = 10;//静态变量也可以通过对象来调用(推荐用类名来调用)
b.name="张三";//成员变量只能通过对象来调用。随着对象创建而存在随着对象回收而释放。
Demo.show();//静态方法也可以直接用类名调用。
b.show(); //静态方法也可以通过对象来调用。
b.showDemo();//非静态方法只能通过对象来调用。
- static修饰的信息是属于类的,它是随着类的加载而加载的。
- 我们没有被static修饰的信息是非静态/实例的,多个实例/对象之间的信息是相互隔离。而static修饰时被多个实例共享。
- 被static修饰的信息可以直接采用类名.的形式来调用,也可以使用对象来调用(不推荐)。
运行例图:
加载顺序:
static可以用来修饰属性、方法,还可以用来修饰代码块。
静态代码块 -> 构造代码块 -> 构造方法