Java—面向对象(2)封装

Java—面向对象(2) 封装

1.什么是封装

​ 在面向对象程式设计方法中,封装是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。Java中定义方法和类时,都用了封装的方式,方法中封装了方法的实现内容,类中封装了方法和属性,封装可以看作是将内容用容器打包封好,外部只留下一些接口、入口,防止该类的代码和数据被外部类定义的代码随机访问,要访问该类的代码和数据,必须通过严格的接口控制;而且我们在修改代码时只修改自己的实现代码,而不用修改那些调用我们代码的程序片段。

封装的好处:

  1. 提高了代码的安全性
  2. 提高了代码的复用性
  3. “高内聚”:封装细节,便于修改内部代码,提高可维护性。
  4. “低耦合”:简化外部调用,便于调用者使用,便于扩展和协作。

2.使用访问控制符:私有private

当想对外隐藏方法和属性时,可以使用private来修饰,将方法属性私有化。

例: 一个Person类:

public class Person {
    public String name;//姓名
    private String sex;//性别
    private int age;//年龄
    //打招呼方法
    public void sayHello(){
        System.out.println(name+":Hello");
    }
}

在这个类中 性别和年龄被私有化,姓名和方法公有,下面定义一个类来进行访问。

public class text {

        public static void main(String[] args) {
            Person p=new Person();
            p.name="张三";
            p.sayHello();
        }
}

在这里插入图片描述

name属性和sayHello()方法可以随意使用和赋值。

当我们访问私有属性时:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
编译器无法找到私有属性,当我们访问时,编译时报错。

由此我们可以看到 可以通过访问控制符来控制封装中需要隐藏和对外公开的属性和方法。

3.构造函数(构造方法)

构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们,即构造函数的重载。

构造函数的特点:

  1. 构造函数没有返回值类型。也不需要写返回值。因为其是为构建对象的,对象创建完,函数就执行结束。

  2. 构造函数名称必须和类保持一致。

  3. 构造函数主要作用是完成对象的初始化,是创建对象时调用的第一个方法。

  4. 构造方法可以重载,一个类可以定义多个构造方法,用哪个方法取决于创建对象时使用的方法。

    构造函数分为有参构造函数和无参构造函数(参数列表为空),当我们没有定义构造函数时,编译系统会自动插入一个无参数的默认构造器,这个构造器不执行任何代码;当我们定义了带参构造方法时,编译器不会自动添加无参构造方法,需要使用无参构造方法时需要手动定义。

例:上述Person类并没有定义构造函数,但编译器里自动插入了无参构造方法:
在这里插入图片描述

在Person类中加入带参构造函数,创建对象时利用带参构造函数初始化:

public class Person {
    public String name;//姓名
    private String sex;//性别
    private int age;//年龄
    Person(String n,String s,int a){//带参构造函数
        name=n;
        sex=s;
        age=a;
    }
    //打招呼方法
    public void sayHello(){
        System.out.println(name+":Hello");
    }

}
public class text {

        public static void main(String[] args) {
            Person p=new Person("张三","男",6);

            p.sayHello();
            System.out.println("性别:"+p.getSex());
            System.out.println("年龄:"+p.getAge());
        }
}

​ 构造函数可以完成对象初始化,但只在创建对象时执行一次,当我们将属性和方法隐藏后初始化时赋予了错误的值,又需要对隐藏的属性和方法经行访问和修改,这时就要对外提供相应的公有方法,以公有的访问方法为桥梁,来实现对私有成员的访问和修改。

一般对私有成员属性的访问动作:赋值(设置 set),取值(获取 get),因此对私有的变量访问的方式可以提供对应的 setXxx或者getXxx的方法。

例:在上述Person中提供 年龄age和性别sex的get和set方法:

public class Person {
    public String name;//姓名
    private String sex;//性别
    private int age;//年龄
    //年龄获取方法
    public int getAge() {
        return age;
    }
    //年龄赋值方法
    public void setAge(int age) {
        this.age = age;
    }
    //性别获取方法
    public String getSex() {
        return sex;
    }
    //性别赋值方法
    public void setSex(String sex) {
        this.sex = sex;
    }

    //打招呼方法
    public void sayHello(){
        System.out.println(name+":Hello");
    }
    
}

在为外部类进行私有成员赋值和获取操作:

public class text {

        public static void main(String[] args) {
            Person p=new Person();
            p.name="张三";
            p.setAge(6);
            p.setSex("男");
            p.sayHello();
            System.out.println("性别:"+p.getSex());
            System.out.println("年龄:"+p.getAge());
        }
}

运行结果:
在这里插入图片描述

4.this调用构造函数

this关键字主要有三个应用:

  1. this调用本类中的属性,也就是类中的成员变量。
  2. this调用本类中的其他方法。
  3. this调用本类中的其他构造方法,调用时要放在构造方法的首行。

this代表的是对象本身,哪个对象调用了this所在的函数,this就代表哪个对象。用this可以解决成员变量和局部变量同名的问题,this.变量名 就表示该变量是成员变量。函数之间调用时,可以通过函数名进行调用,可是针对构造函数,无法通过构造函数名来相互调用,要完成调用就要使用this关键字来完成。

class Person 
{
	// Person的成员属性
	private int age;
	private String name;
	//无参数的构造函数
	Person()
	{
	}
	//给姓名初始化的构造函数
	Person(String nm)
	{
		name = nm;
	}
	//给姓名和年龄初始化的构造函数
	Person(String nm , int a)
	{
		//由于已经存在给姓名进行初始化的构造函数 name = nm;因此只需要调用即可
		//调用其他构造函数,需要通过this关键字来调用
		this(nm);
		//给年龄初始化
		age = a;
	}
}

调用其他构造函数的语句必须定义在构造函数的第一行,原因是初始化动作要最先执行。

猜你喜欢

转载自blog.csdn.net/m0_49297152/article/details/107430585
今日推荐