java基础-封装

文章介绍了Java中封装的概念,通过示例展示了如何使用private修饰符限制对类成员属性的直接访问,并通过set和get方法进行安全赋值和取值。同时,文章还提到了this关键字的作用以及构造函数的功能,包括有参和无参构造函数的使用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.封装由来:

        继上篇java基础-面向对象文章来说,当定义一个Person类,类中有姓名,年龄,身高,肤色这几个静态特征(成员属性,就是成员变量),在使用创建出来的对象.成员属性赋值时,会出现不合常理的情况,比如说创建Person类对象,对象的年龄为-10或者200,这种情况便不符合现实生活人类寿命的合理范围,便需要封装,对不合理的操作进行提示

 代码演示:

        1.首先创建一个Person类,类中有姓名,年龄,身高,肤色这几个静态特征(成员属性,就是成员变量)

public class Person{

    //姓名
    String name;
    //年龄
    int age;
    //身高
    String height;
    //肤色
    String colour;

}

        2.再定义一个测试类

public class Test {
    public static void main(String[] args){
        //再main方法中创建Person类对象
        Person p=new Person();
        //给person类对象中的属性赋值
        p.name="李四";
        p.age=-10;
        p.height="178";
        p.colour="white";

        System.out.println(p.name);  //李四
        System.out.println(p.age);   //-10
        System.out.println(p.height);   //178
        System.out.println(p.colour);   //white

        System.out.println("================================================");

        p.age=200;
        System.out.println(p.age); //200
    }
}

        3.思考:

        年龄为-10或者200是不是不合常理,对于这种情况可以使用private修饰符解决,将类中的成员属性私有,不让外界随意创建对象访问属性赋值

        3.1 代码如下图:

        

       到此在测试类中会发现新的问题,就是在测试类Test类中无法对Person类的成员属性进行赋值以及获取属性值的操作

        3.2 代码如下图:

        4. 为防止外界随意创建对象随意赋值,已经将类中的成员属性进行私有化,就是使用private修饰符将成员属性私有化, 例如:(  private 数据类型   成员属性名; ),故而需要给外界提供可以访问Person类内部属性的方法,set方法和get方法,set方法用于给类对象内部的成员属性赋值,get方法用于获取类内部的成员属性值,

        注意:set和get方法无需static关键字(静态修饰符)去修饰

        代码如下 :

public class Person{

    //姓名
    private String name;
    //年龄
    private int age;
    //身高
    private String height;
    //肤色
    private String colour;

    //对name赋值的set方法
    public void setName(String n){
        name=n;
    }

    //获取name属性值的get方法
    public String getName(){
        return name;
    }

    //对age赋值的set方法
    public void setAge(int a){
        //对年龄的赋值加一个判断
        if (a<=0||a>100){
            System.out.println("年龄有误");
            return;
        }
        age=a;
    }

    //获取age属性值的get方法
    public int getAge(){
        return age;
    }

    //对height属性赋值的set方法
    public void setHeight(String h){
        height=h;
    }

    //获取height属性值的get方法
    public String getHeight(){
        return height;
    }

    //对colour属性赋值的set方法
    public void setColour(String c){
        colour=c;
    }

    //获取colour属性值的get方法
    public String getColour(){
        return colour;
    }

}

         5. 测试类对age属性赋值操作:

        测试1:对age的正常赋值

public class Test {
    public static void main(String[] args){
        //在main方法中创建Person类对象
        Person p=new Person();

       /* //给person类对象中的属性赋值
        p.name="李四";
        p.age=-10;
        p.height="178";
        p.colour="white";

        System.out.println(p.name);  //李四
        System.out.println(p.age);   //-10
        System.out.println(p.height);   //178
        System.out.println(p.colour);   //white

        System.out.println("================================================");

        p.age=200;
        System.out.println(p.age); //200*/

        //通过set方法赋值
        p.setName("aaa");
        p.setAge(12);
        p.setHeight("180");
        p.setColour("black");

        //通过get方法获取属性值
        System.out.println(p.getName()); //aaa
        System.out.println(p.getAge());     //12
        System.out.println(p.getHeight());  //180
        System.out.println(p.getColour());  //black
    }
}

     控制台:

        测试2: 对age的非正常赋值

public class Test {
    public static void main(String[] args){
        //在main方法中创建Person类对象
        Person p=new Person();

       /* //给person类对象中的属性赋值
        p.name="李四";
        p.age=-10;
        p.height="178";
        p.colour="white";

        System.out.println(p.name);  //李四
        System.out.println(p.age);   //-10
        System.out.println(p.height);   //178
        System.out.println(p.colour);   //white

        System.out.println("================================================");

        p.age=200;
        System.out.println(p.age); //200*/

        //通过set方法赋值
        p.setName("aaa");
        p.setAge(-30);
        p.setHeight("180");
        p.setColour("black");

        //通过get方法获取属性值
        System.out.println(p.getName()); //aaa
        System.out.println(p.getAge());     //0
        System.out.println(p.getHeight());  //180
        System.out.println(p.getColour());  //black
    }
}

 控制台:

 二. this关键字

         this关键字表示当前类对象的引用,谁访问类中的属性,this就是谁

        代码如下

        1. 修改Person类中的name属性的set方法和get方法

             

         2.测试类中对Person类中的name属性进行赋值操作

          3.注意:

                导致的原因是Person类中name属性的set方法无法区分成员变量和局部变量,并没有将方法上的局部变量值传给成员变量,所以使用get方法获取成员属性值,name属性依旧是将成员变量初始化值

       解决办法: 使用this关键字区分属性set方法中的成员变量和局部变量

        修改代码如下:

        

         4. 补充:打印输出this和类对象,比较地址值

 三. 类中成员属性的set方法和get方法的快捷键生成

       1. alt+insert或者Fn+Alt+i

        

        2.选中要生成set,get方法的属性,点击ok

四. 构造函数

        1.概念:

        构造函数分为有参构造方法无参构造方法,主要用于创建对象new一个类对象),默认会提供一个无参构造,当我们自定义有参构造方法后,类便不再会提供默认的无参构造方法,也就是无参构造方法会失效,因此我们创建有参构造方法的同时也应该创建无参构造方法

        2.区别:

                无参构造方法:

                        先创建类对象,再对类对象中的成员属性进行赋值

                有参构造方法: 

                         创建类对象的同时,就对类对象中的成员属性进行赋值

        3.代码如下

                无参构造方法:

        

                 

                 有参构造方法:

            

         4.构造方法快捷键

                1. alt+insert或者Fn+Alt+i

                        

                2.选中Constructor后可以对类中的属性进行选择点击ok生成有参构造方法,也可以点击Select None生成无参构造方法

         5.构造方法注意事项:

                1. 构造方法名必须和类名保持一致

                2. 构造方法没有返回值类型

                3. 构造方法没有返回值

                4. 构造方法可以重载

                5. 提供有参构造方法后,无参方法会失效,因此需要有参构造方法和无参构造方法同时提供

                6. 构造方法是可以被private修饰的,作用:其他程序无法创建该类的对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值