Java的封装、构造方法与匿名对象

成员属性封装

在类之中的组成就是属性与方法,一般而言方法都是对外提供服务的,所以时不会进行封装处理的,而对于属性由于其需要较高的安全性,所以往往需要对其进行保护,这个时候就需要采用封装性堆属性进行保护。

举例:

package com.chiyi;



class Person {//定义一个类

    String name; //人员的姓名

    int age;   //人员的年龄



    public void tell() {

        System.out.println("姓名:" + name + " 年龄:" + age);

    }



}



public class Main {



    public static void main(String[] args) {

        Person per = new Person(); //声明并实例化对象

        per.name = "张三"; //在类的外部修改属性

        per.age = -18;  //在类的外部修改属性

        per.tell();  //进行方法的调用(输出结果:姓名:张三 年龄:-18)

    }



}

此时在 Person 类中提供的 name 与 age 两个属性并没有进行封装处理,这样外部就可以直接进行调用了,但是有可能所设置的数据是错误的数据。如果要想解决这样的问题就可以利用 private 关键字对属性进行封装处理。

而属性一旦封装之后外部将不能够直接访问,即:对外部不可见,但是对类的内部是可见的,那么如果要想让我们外部的程序可以访问封装的属性,则在 Java 开发标准中提供有如下要求:

1. 【setter、getter】设置或取得属性可以使用 setXxx()、getXxx() 方法,以: private String name 为例;

   |- 设置属性方法:public void setName(String name);

   |- 获取属性方法:public String getName();

举例: 实现封装

package com.chiyi;



class Person {//定义一个类

    private String name; //人员的姓名

    private int age;   //人员的年龄



    public String getName() {

        return name;

    }



    public void setName(String name) {

        this.name = name;

    }



    public int getAge() {

        return age;

    }



    public void setAge(int age) {

        if (age < 0) {

            age = 0;

        }

        this.age = age;

    }



    public void tell() {

        System.out.println("姓名:" + name + " 年龄:" + age);

    }



}



public class Main {



    public static void main(String[] args) {

        Person per = new Person(); //声明并实例化对象

        per.setName("张三");

        per.setAge(-18);

        per.tell();  //进行方法的调用(输出结果:姓名:张三 年龄:0)

    }



}

在以后进行任何类定义的时候一定要记住,类中的所有属性都必须使用 private 封装,并且属性如果要进行访问必须要提供有 setter、getter 方法。

构造方法

现在的程序在使用类的时候一般都按照了如下的步骤进行:

1. 声明并实例化对象,这个时候实例化对象中的属性并没有任何的数据存在,都是其对应数据类型的默认值。

2. 需要通过一系列的 setter 方法为类中的属性设置内容。

等于现在要想要真正获得一个可以正常使用的实例化对象,必须经过两个步骤才可以完成。

而在 Java 里面为了考虑到对象初始化的问题,专门提供有构造方法。即:可以通过构造方法实现实例化对象中的属性初始化处理。只有在关键字 new 的时候使用构造方法,在 Java 程序里面构造方法的定义要求如下:

1. 方法名称必须与类名称保持一致;

2. 构造方法不允许设置任何的返回值类型,即:没有返回值定义;

3. 构造方法是使用关键字 new 实例化对象的时候自动调用的。

举例:

package com.chiyi;



class Person {//定义一个类

    private String name; //人员的姓名

    private int age;   //人员的年龄



    public Person() {

    }



    // 方法名称与类名称相同,并且无返回值定义

    public Person(String name, int age) { //定义有参构造

        this.name = name; // 为类中的属性赋值(初始化)

        this.age = age; // 为类中的属性赋值(初始化)

    }



    public String getName() {

        return name;

    }



    public void setName(String name) {

        this.name = name;

    }



    public int getAge() {

        return age;

    }



    public void setAge(int age) {

        this.age = age;

    }



    public void tell() {

        System.out.println("姓名:" + name + " 年龄:" + age);

    }



}



public class Main {



    public static void main(String[] args) {

        Person per = new Person("张三", 18); //声明并实例化对象

        per.tell();  //姓名:张三 年龄:18

    }



}

在 Java 程序里面考虑到程序结构的完整性,所以所有的类都会提供有构造方法,也就是说如果现在你的类中没有定义任何的构造方法,那么一定会默认提供有一个无参的,什么都不做的构造方法,这个构造方法是在程序编译的时候自动创建的。如果你现在已经在类中明确的定义有一个构造方法的时候,那么这个默认的构造方法将不会被自动创建。所以一个类至少存在有一个构造方法,永恒存在。

为什么构造方法上不允许设置返回值类型?

分析:

1. 程序编译器是根据代码结构来进行编译处理的,执行的时候也是根据代码结构来处理的。

2. 如果在构造方法上使用了 void,那么此结构就与普通方法的结构完全相同了,这样编译器会认为此方法是一个普通方法,普通方法与构造方法最大的区别: 构造方法是在类对象实例化的时候调用的,而普通方法是在类对象实例化产生之后调用的。

既然构造方法本身是一个方法,那么方法就具有重载的特点,而构造方法重载的时候只需要考虑参数的类型及个数即可。

匿名对象

经过了分析之后可以发现,利用构造方法可以传递属性数据,于是现在进一步分析对象的产生格式:

1. 定义对象的名称: 类名称 对象名称=null

2. 实例化对象:对象名称=new 类名称(就

如果这个时候只是通过实例化对象来进行类的操作也是可以的,而这种形式的对象由于没有名字就称为匿名对象。

举例:观察匿名对象

package com.chiyi;



class Person {//定义一个类

    private String name; //人员的姓名

    private int age;   //人员的年龄



    // 方法名称与类名称相同,并且无返回值定义

    public Person(String name, int age) { //定义有参构造

        this.name = name; // 为类中的属性赋值(初始化)

        this.age = age; // 为类中的属性赋值(初始化)

    }



    public String getName() {

        return name;

    }



    public void setName(String name) {

        this.name = name;

    }



    public int getAge() {

        return age;

    }



    public void setAge(int age) {

        this.age = age;

    }



    public void tell() {

        System.out.println("姓名:" + name + " 年龄:" + age);

    }



}



public class Main {



    public static void main(String[] args) {

        new Person("张三", 18).tell();  //姓名:张三 年龄:18

    }



}

此时依然通过了对象进行了类中 tell()方法的调用,但是由于此对象没有任何的引用名称,所以该对象使用一次之后就将称为垃圾,而所有的垃圾将被 GC 进行回收与释放。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

协享科技

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值