浅谈一下Java当中的:封装

对于Java ,想必在刚接触到Java的时候,大家都已经听过:Java主要是用来面向对象的,而面向对象有三大特性:封装继承,多态,今日所讲述的主要就是:封装!!

对于封装,我们首先需要知道的是:什么是封装??封装有什么意义呢??弄懂了这俩,那么封装你就学习的差不多了!!

对于封装的简单来说就是:套 壳屏蔽细节!!

封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互!!把类的实现细节进行了隐藏,对外只提供一些交互的接口就可以!!

下面就在Java中使用的四种访问修饰限定符来安排一波:

范围 private

default

(默认权限)

protected public
同一包中的同一类 可以 可以 可以 可以
同一包中的不一类 可以 可以 可以
不同包中的子类(继承关系) 可以 可以
不同包中的非子类 可以

下面就private进行简单讲解一下:提示,下面是错误的用法讲解!!!

class Student {
    private String name ;
    public int age ;
    
    public  void shou() {
        System.out.println("姓名: "+name);
    }
}

public class Main {
    public static void main(String[] args) {
        Student student = new Student();
        student.name = "小灶" ;  //错误用法!!
    }
}

在类Student中定义的: private String name ; 只能在当前类中才能使用!!否则,将会报错!!

因此,对private 修饰的,只能在当前类使用

public :可以理解为:一个人的外貌特征,谁都可以看得到!

default (默认权限):对于自己家族中(同一包中)不是什么秘密,对于其他人来说,就是隐私了!

private : 只有自己知道,其他都不知道!


注意:一般情况下:成员变量设置为:private

                                成员方法设置为:public

封装拓展之包!

在Java中引入了包,包是对类、接口等的封装机制的体现,是一种对类或者接口等的很好的组织方式,比如:一 个包中的类不想被其他包中的类使用。包还有一个重要的作用:在同一个工程中允许存在相同名称的类,只要处在 不同的包中即可。

在IDEA中自定义包的用法!

1.右键点击src ——》new ——》Package

 2.点击Package ,一般采用倒序命名方法!!(com.shandong.www)

通过下面图示操作,就可以对创建好的包的显示情况进行调整!!

 笔者就不再进行演示!!

封装之:private 只能在当前类中使用

下面就案列讲解一下(错误用法)!!

class Person {
    private String name ;
    private int age ;
    
    private void eat() {
        System.out.println("吃饭!");
    }

    public  void shou() {
        System.out.println("姓名: "+name);
    }
}

public class Main {
    public static void main(String[] args) {
        Person person = new Person() ;
        person.name = "changjiang ";//错误用法!!
        person.eat();//错误用法!
    }
}

在上述的代码中,name  , age  ,eat   这些成员已经被封装起来了!!只能在当前类当中使用!

使用private 关键字进行了封装时,name 的权限就变小了,他只能在当前类才能访问!!

因此,我们可以通过构造方法来读上述代码中,封装好的name ,age ,eat 进行赋值!!

构造方法包含:不带参数的构造方法,带有参数的构造方法!而IDEA可以帮我们自动生成构造方法!!鼠标右键,——》Generate ——》 Constructor ——》 选择想要构造的方法(摁住CTRL键,可以多选)  点击OK,然后就能生成带参数的构造方法了!!

 

 

然后生成的构造方法为:

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

因此,上述的总代码为:(正确代码)

class Person {
    private String name ;
    private int age ;

    private void eat() {
        System.out.println("吃饭!");
    }

    public  void show() {
        System.out.println("姓名: "+name +" 年龄 "+age+" 正在吃饭!");
    }

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

public class Main {
    public static void main(String[] args) {
        Person person = new Person("changjiang ",20) ;
        person.show();
    }
}

上述代码的运行结果为:

但是,疑问又来了:在上述的代码中,如果我想更改传过去以后的姓名,该如何操作??

需要getter 和setter 这两个方法!!

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

因为private不能直接访问,则通过getName和setName 来对那些封装(private)的数据来进行交互!

更改后的代码为:

class Person {
    private String name ;
    private int age ;

    private void eat() {
        System.out.println("吃饭!");
    }

    public  void show() {
        System.out.println("姓名: "+name +" 年龄 "+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 class Main {
    public static void main(String[] args) {
        Person person = new Person("changjiang ",20) ;
        person.show();
        System.out.println("=========="); //相当于分隔符
        person.setName("小金鑫");
        person.show();
    }
}

上述代码的运行结果为:

但是,上面内容仅仅更改一个,当我们想更改多个数据的时候,IDEA就可以帮助我们进行写!!右键——》Generate ——》Getter and Setter  …………然后就会帮我们自动生成!!

 

上面单独的Getter Setter会生成单独的对应方法!!(自行尝试!)

因此,总的来说:封装:对类的内部的细节进行了隐藏,但同时提供了相对应的公开的接口,供用户和数据进行交互!!

猜你喜欢

转载自blog.csdn.net/weixin_64308540/article/details/127954249