封装
1.封装的思想
将对象的成员变量的实现细节隐藏起来,不允许外部直接访问
把方法暴露出来,让方法来控制这些成员变量进行安全的访问和操作
2.封装的好处
1.提高代码的安全性
2.提高代码的维护性。
3.封装关键字private介绍
封装在程序中的体现其实是四种访问权限,从大到小分别是:
public>protect>缺省(默认,什么都不写)>private
private 关键字:私有的
被private修饰的关键字只能在本类中进行访问,外部无法进行访问
私有化成员变量格式
private 数据类型 变量名;
4.封装的步骤:
private关键字只是封装思想的一种体现形式之一
1.私有化变量
2.被一个私有变量,就要对外提供一对公共的访问方式(存储方式setXXX()和获取方式getXXX())
以我们之前提到的学生类为例进行封装操作:
public class demo03close {
//实例变量的定义
private String name;
private int age;
//实例方法的定义
public void setName(String name){
this.name=name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
构造器
构造器的介绍和实现
构造器时类中的第三个成员,构造器的功能如下:
1.用来初始成员
2.如果是有参构造器可以给对象成员赋值
构造的的定义方式:
格式: 修饰符 类名(){}
构造器定义注意事项:1.构造器的名字必须跟类名相同 2.构造器没有返回值类型而其连void都没有 3.当一个类没有任何构造器是,JVM自动提供一个默认午餐的构造器,以便进行初始化;一旦类中含有构造器时,JVM将不再提供默认构造器。
以上述的学生类为例子,构造列中的构造器:
public class demo03close {
//实例变量的定义
private String name;
private int age;
//构造器定义
public demo03close(){
}
public demo03close(String name ,int age){
this.name=name;
this.age=age;
}
//实例方法的定义
public void setName(String name){
this.name=name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
在上述了代码中,我们定义而两种构造器的方法,一种是无参构造器,另一种时有参构造器。在定义时,有参构造器可以个类中的私有化变量赋值,但读取变量值还得使用封装中的getXX()的思想。如下代码:
public class demostudent {
public static void main(String[] args) {
demo03close s1=new demo03close();//调用构造器没定义的话,虚拟机会自动构造
s1.setName("张三");
s1.setAge(18);
System.out.println(s1.getName());
System.out.println(s1.getAge());
//有参构造器赋值
demo03close s2=new demo03close("李四", 20);
System.out.println(s2.getName() +" "+ s2.getAge());
}
}
构造器的代码块
代码块是类中的第四个成员,在编写类时,多个构造器中的相同代码可以提取构造器代码块中去实现,构造器代码块的定义格式如下:
{
多个构造器中的相同代码
}
构造器代码块的特点:
1.构造器代码块会在初始化对象时被构造器调用一次
2.构造器代码块总是优先于构造器中的显式代码进行作用
简单的构造器代码块实现方法
public class demo06 {
//无参构造器
public demo06(){
System.out.println("7");
}
//有参构造器
public demo06(int x){
System.out.println("8");
}
public demo06(int x,int b)
System.out.println("9");
}
//构造器代码块
/*{
System.out.println("1");
System.out.println("2");
System.out.println("3");
}*/
}
测试代码
package com.demo.OPP;
public class tr {
public static void main(String[] args) {
demo06 s=new demo06();//调用无参构造器
demo06 s1=new demo06(1);//调用无参构造器
demo06 s2=new demo06(1,2);//调用无参构造器
}
}
构造器中this介绍
当构造器没有能力进行初始化的时候,可以用this调用本类当中的其他构造器进行完成实例初始化 。this在构造器中的使用格式
this()
this在类中的使用
public class demo06 {
//无参构造器
public demo06(){
this(1);//无参构造器无法完成初始化的工作,将工作交给含有一个参数的构造器
System.out.println("无参构造器");
}
//有参构造器
public demo06(int x){
this(1,1);//含有一个参构造器无法完成初始化的工作,将工作交给含有两个参数的构造器
System.out.println("一个参数构造器");
}
//有参构造器
public demo06(int x,int b){//含有两个参数的构造器有能力完成实例初始化的工作
//调用构造器代码块
//执行完隐藏的内容后,开始执行构造器的显式内容
System.out.println("两个参数构造器");
}
//构造器代码块
/*{
System.out.println("1");
System.out.println("2");
System.out.println("3");
}*/
}
在初始化无参构造器时,无参构造器会调用有一个参数的构造器进行初始化,而有一个参数的构造器会调用有两个参数的构造器进行初始化。最后在两个参数的构造器这里完成初始化。值得注意的是,this()必须放在构造器代码的第一行。