Java面向对象基础(二)——详解

封装

概述

  •  封装:告诉我们如何正确设计对象的属性和方法
  • 封装的原则:对象代表什么,就得封装对应的数据,并提供数据对应的行为

如何更好的进行封装?

  •  一般建议对成员变量使用private(私有、隐藏)关键字修饰(private修饰的成员只能在当前类中访问)

举个简单的例子便可以更好的理解了,如下有一个Student类,在其中定义了一个成员变量age。

public static class Student{
                int age;      //未定义修饰符的,默认为public
       }

然而此时在另外一个Java文件中,创建了一个Student类的对象s,对Student类中的成员变量age进行访问,并且对其进行赋值。

public class HelloWorld {
    public static void main(String[] args) {
        Student s = new Student();
        s.age = -100;
        System.out.println(s.age);      //-100
    }
    }

虽然对Student类中的成员变量age赋值为-100并不会报错,但是这样的情况是违背客观事实的,因此这样的变量是不能够被随意更改的,对于我们储存数据是不方便的。

Java面向对象基础(二)——详解_第1张图片

 此时我们如果把封装引入的话,会有什么变化呢?仍然是定义一个Stduent类,并且定义一个成员变量age,与之前不同的地方是不再默认修饰符public定义成员变量,而是使用private来修饰,(通过翻译我们可以得知,二者分别是public:“共有的,公共的”,private:“私有的,个人的”)

public static class Student{
                private int age;      //在原有的基础上加入了private修饰符
       }

之后如果要在另外一个Java文件中,创建了一个Student类的对象s,对Student类中的成员变量age进行访问的时候,会出现报错的提示,不允许我们访问Student类中的成员变量age。

public class HelloWorld {
    public static void main(String[] args) {
        Student s = new Student();
        s.age;        //会出现报错!!! 
    }
    }

由此我们可以清晰的理解对成员变量使用private的作用以及封装的好处。

Java面向对象基础(二)——详解_第2张图片

  •  为每个成员变量提供配套public修饰的getter(获取)、setter(设置)方法暴露其取值和赋值

那么使用private修饰符对其保护的话,该如何对类中的成员变量访问呢?当然是有办法的,可以通过在类中定义方法对它访问,既加以限制,又不完全限制。下面重新定义Student类,在原来的基础之上创建getAge()与setAge()方法,用来对成员变量age访问。

public static class Student {
        private int age;

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            if (age > 0 && age < 150) {
                this.age = age;
            }else {
                System.out.println("年龄输入有误!");
            }
        }
    }

 那么此时我们应该如何对成员变量age进行访问呢?通过引用Student类中的方法实现访问。

Student s = new Student();
s.setAge(20);        //对age访问并赋值
System.out.println(s.getAge());        //对age访问并获取其值

Java面向对象基础(二)——详解_第3张图片

 标准JavaBean

  •  也可以称为实体类,其对象可以用于在程序中封装数据。(所谓实体类,类似于学生类、汽车类等在现实生活中出现的)

 标准JavaBean应当的书写要求:

  • 成员变量使用private修饰;
  • 提供成员变量对应的setXxx() / getXxx()方法
  • 必须提供一个无参构造器,有参构造器可写可不写

 既然给出了标准JavaBean的书写要求,不妨尝试一下:

标准JavaBean具体书写格式

首先创建一个Student类,并对各成员变量使用private修饰;

public static class Student {
        private String name;
        private int age;
        private String sex;
    }

 其次是对各成员变量提供对应的setXxx() / getXxx()方法

public static class Student {
        private String name;
        private int age;
        private String sex;

        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 String getSex() {
            return sex;
        }

        public void setSex(String sex) {
            this.sex = sex;
        }
    }

在创建对应方法的时候有个小tips可以快捷生成(使用idea的前提下):

Java面向对象基础(二)——详解_第4张图片Java面向对象基础(二)——详解_第5张图片

Java面向对象基础(二)——详解_第6张图片

 最后是必须提供一个无参构造器,有参构造器可写可不写

public static class Student {
        private String name;
        private int age;
        private String sex;
        //无参构造器
        public Student() {
        }
        //含参构造器
        public Student(String name, int age, String sex) {
            this.name = name;
            this.age = age;
            this.sex = sex;
        }
}

这里仍然有个小tips可以快捷生成构造器(使用idea的前提下):

Java面向对象基础(二)——详解_第7张图片Java面向对象基础(二)——详解_第8张图片

 Java面向对象基础(二)——详解_第9张图片

标准JavaBean的调用 

在创建过标准JavaBean以后,应该开始实现对其的调用:

//1、无参构造器创建对象封装一个用户信息
Student s = new Student();
s.setName("何同学");
s.setAge(25);
s.setSex("男");
System.out.println(s.getName());
System.out.println(s.getAge());
System.out.println(s.getSex());
//输出结果:
//何同学
//25
//男

//2、有参构造器创建对象封装一个用户信息
Student s = Student("张同学",18,"女");
System.out.println(s.getName());
System.out.println(s.getAge());
System.out.println(s.getSex());
//输出结果:
//张同学
//18
//女

你可能感兴趣的:(Java基础,java,intellij-idea)