一、封装的定义
先来看一个简单的类结构:
public class student {
String name;
int score;
int age;
String adr;
double gpa;
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
}
public class main {
public static void main(String[] args){
student wyh=new student();
wyh.name="温宇辉";
wyh.score=100;
wyh.age=20;
wyh.adr="广东";
wyh.gpa=4.05;
}
此时对类的默认访问属性成员进行初始化,这样看好像没有什么问题,但是在大型程序的运行过程中这样的数据是不安全的,因为访问权限太大了,外界中本包里的所有方法都能访问。因此我们需要对包中的数据进行封装,即使用private关键字进行访问修饰。
封装的具体定义就是:隐藏实现细节,仅对外提供访问的接口。内部的具体实现细节并不关心。
二、封装后私有成员的使用
但是在进行数据成员私有化后,我们应该怎么进行使用其中的数据成员呢?以下面这个程序为例:
public class student3 {
private String name;
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
}
public class main {
public static void main(String[] args){
student3 xx=new student3();
xx.setName("xx");
System.out.println(xx.getName());
}
输出结果:xx
不难看出,对外的接口是setName和getName两个函数,在使用的时候,需要在main函数中调用它们,才能使用私有成员name。
- 一行代码搞定对象的创建与属性初始化
但是这又有一个问题:要是我类中的私有成员很多,难道我要一个个去编写set函数和get函数再调用吗?如果真是如此,那未免也太复杂了。要想更方便地解决这个问题,我们首先要知道类中的构造方法。
格式:public 类名(){}
对于每个类而言,都默认具有一个隐式的空参数构造方法。这个方法,在创建对象时会自动调用。默认的构造方法不能完成对象数据成员的初始化, 只能给对象创建一标识符, 并为对象中的数据成员开辟一定的内存空间。如果显式写了任意一个构造方法,空参数构造方法都会被覆盖。通过显性地编写,我们便可以解决上述问题。
实例如下:
public class student2 {
private String name;
private int score;
private int age;
private String adr;
private double gpa;
//访问修饰符: 限制访问范围 对象的 子类的
//普通方法 属性 进行 private 对象不能调用
//构造方法 private 在这个类的范围之外 对象不能创建对象
public student2(String name,int score,int age,String adr,double gpa){
this.name=name;
this.score=score;
this.age=age;
this.adr=adr;
this.gpa=gpa;
System.out.println("赋值流程结束 !!");
}
public class main {
public static void main(String[] args){
student2 w=new student2("哈哈",99,21,"广西",3.9);
}
}
需要注意的是,在创建对象的时候,必须按照构造函数中的参数顺序来给具体的参数。
- 单例模式(一个类中只能有一个对象)
要想实现单例模式,必须完成以下几个步骤:
①对构造方法进行私有化;
②在这个类的内部创建这个类(唯一)对象;
③提供一个对外的对象出口。
下面是一个简单的实例:
public class king {
//创建一个king类的对象
private static king fa=new king();
// 对构造方法进行私有化
private king(){}
//提供一个对外的对象出口
public static king getking(){
return fa;
}
//static作用是不需要创建对象就可以调用这个方法
public void showMessage(){
System.out.println("Hello World!");
}
}
public class main {
public static void main(String[] args){
//king wd=new king();
//编译时错误:构造函数king()是不可见的
king wd=king.getking();
wd.showMessage();
}
}
使用单例模式好处在于可以节省内存,节约资源,对于一般频繁创建和销毁对象的可以使用单例模式。因为它限制了实例的个数,有利于java垃圾回收。好的单例模式也能提高性能。
总结:这篇文章是作者初学时的一些见解,也参考了许多网上的资料,如有不对欢迎批评指正!