Java面向对象编程-封装


一、什么是封装?

封装,顾名思义,在硬件中如同将数字线路隐藏在一个盒子里,只通过IO接口与外界进行数据交互,你可以隐藏内面内容,也可以公开里面内容。经过封装,外部权限被控制,数据被有效的隐藏在类的内部,用户可以通过一些接口对里面的数据进行访问。用户所能访问的权限的控制靠访问权限修饰符(private、public等)来控制。这里介绍private和public中的区别。
验证时出现的问题和解决方法:一个pakeage包里面只能有一个公共类,如果想验证public和private需要从两个类入手。解决方法:在一个public class类里面建立两个子类。

  • private:修饰的属性或方法只能在本类中调用 。在其他类中,对象不能直接调用属性。
  • public:修饰的属性或方法可以在不同类中使用,甚至不同包(同一个项目)也可以使用。
  • 默认修饰符:默认修饰符指的是声明时没有前缀。只能在同一个包中使用。
package com.zp1102;

public class user {

    public String name;//权限最宽,可以在不同包中使用
    private int age;//权限最窄,只能在此类中使用
    int score;//权限一般,可以在此包中使用
    public void printUserInfo1(){
        // 输出打印语句
        System.out.println ("虚拟货币名称:"+name);
        System.out.println ("虚拟货币年龄:"+age);
        System.out.println ("虚拟货币得分:"+score);
    }

    public void main(String[] args) {
        //对象属性
        user b = new user();
        b.age = 11;
        b.name = "以太坊";
        b.score = 100;
        b.printUserInfo1 ();
    }

}
class user2{
    public void main(String[] args) {
        //对象属性
        user c = new user();
        c.age = 11;
//        c.name = "以太坊";不可使用,因为在public类中,name属性为 private,只能在同一个类中使用。 
        c.score = 100;  //可以使用,不会标红,而另一个包中会出红
        c.printUserInfo1 ();
    }
}

我将所有权限标识符赋予不同的类、对象属性、方法,对应不同环境测试,对其权限得到相关认识。

二、构造方法

使用构造方法,创建初始化对象时比较方便,不需要一步一步赋予对象属性,一行代码就可以解决。创建对象的同时直接将属性传入值给对象。

    public user(String name,  int score, int age){
        this.name = name;
        this.score = score;
        this.age = age;
    }

    public void main(String[] args) {
        //对象属性
        user b = new user("以太坊",100,10);
    }

三、set、get用法

set、get可以说是访问封装数据的一个借口,当满足条件时,可以向封装内部传输数据或者获取数据。
代码如下(示例):

package com.zp1103a;

public class testa {
    private String name;
    private int age;
    public void setName(String name){
        this.name=name;
    }
    public void printtestcinfo(){
        // 输出打印语句
        System.out.println ("名字:"+name);
        System.out.println ("年龄:"+age);
    }
    public String getName(){
        return this.name;
    }
    public void setAge(int age){
        if(age>=0){
            this.age=age;
        }else if(age<0){
            System.out.println ("年龄不能为负数!!");
        }
    }
    public int getAge(){
        return this.age;
    }
    }

在相同包中的另一个class中:

package com.zp1103a;

public class testc {

    public static void main(String[] args) {
        testa t1 = new testa();
        //不能直接给name和age赋值,因为private 可以通过set和get赋值
        t1.setName("bitcoin");
        t1.setAge(-1);
        t1.printtestcinfo();
    }
}

最后显示结果为:

年龄不能为负数!!
名字:bitcoin
年龄:0

三、方法重载

定义:如果有两个方法的方法名相同,但参数不一致,哪么可以说一个方法是另一个方法的重载。 相当于方法的扩容,对不同类型的输入,产生不同的输出。如布尔型输入,返回ture or false。
把setAge和setName合并为setChara

    public void setChara(String name){
        this.name=name;
    }
    public void setChara(int age){
        if(age>=0){
            this.age=age;
        }else if(age<0){
            System.out.println ("年龄不能为负数!!");
        }
    }

以上就是方法重组。
实现结果与使用两个方法相同。

四、思考题

所有的构造方法都是私有的话? 在类的外面还能创建对象吗?
通过代码来测试,初步判断不行。

    private user(String name,  int score, int age){
        this.name = name;
        this.score = score;
        this.age = age;
    }

在idea中出现红色标识问题,指向另一个类中的创造对象语句,所以得到以下结论:
如果构造方法为私有,则不能在类外创造对象。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值