封装与隐藏

封装性有利于程序的“高内聚,低耦合”。

  • 高内聚:类的内部数据操作细节自己完成,不允许外部干涉;
  • 低耦合:仅对外暴露少量的方法用于使用。

隐藏对象内部的复杂性,只对外公开简单的接口。便于外界调用,从而提高系统的可扩展性、可维护性。把该隐藏的隐藏起来,该暴露的暴露出来。这就是封装性的设计思想。

权限修饰符

Java中通过将数据声明为私有的(private),再提供公共的(public)方法:getXxx()​和setXxx()​实现对该属性的操作,以实现下述目的

  • 隐藏一个类中不需要对外提供的实现细节;
  • 使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作;
  • 便于修改,增强代码的可维护性;

封装性的体现,需要权限修饰符来配合。

  • Java规定的4种权限(从小到大排列):private、缺省、protected 、public
  • 4种权限可以用来修饰类及类的内部结构:属性、方法、构造器、内部类
  • 具体的,4种权限都可以用来修饰类的内部结构:属性、方法、构造器、内部类
  • 修饰类的话,只能使用:缺省、public

例题1

class Animal {
    private int legs;// 将属性legs定义为private,只能被Animal类内部访问
    public void setLegs(int i) { // 在这里定义方法 eat() 和 move()
        if (i != 0 && i != 2 && i != 4) {
            System.out.println("Wrong number of legs!");
            return;
    }
    legs = i;
}
    public int getLegs() {
        return legs;
    }
}
    public class Zoo {
        public static void main(String args[]) {
            Animal xb = new Animal();
            xb.setLegs(4); // xb.setLegs(-1000);
            //xb.legs = -1000; // 非法
            System.out.println(xb.getLegs());
    }
}
修饰符类内部同一个包不同包的子类同一个工程
privateYesNoNoNo
default(缺省)YesYesNoNo
protectedYesYesYesNo
publicYesYesYesYes

例题1

创建程序,在其中定义两个类:Person和PersonTest类。定义如下:

  • 用setAge()设置人的合法年龄(0~130),用getAge()返回人的年龄。
  • 在 PersonTest 类 中 实 例 化 Person 类 的 对 象 b , 调 用 setAge() 和getAge()方法,体会Java的封装性。
public class Person {
    
    private int age;
    private String name;
    
    public void setAge(int a){
        if(a < 0 || a > 130){
            //throw new RuntimeException("传入的数据非法!");
            System.out.println("传入的数据非法!");
            return;
        }

        age = a;
        
    }
    
    public int getAge(){
        return age;
    }
    
    public void setName(String n){
        name = n;
    }
    public String getName(){
        return name;
    }
    
}
public class PersonTest {
    public static void main(String[] args) {
        
        Person b = new Person();
        
        p1.setAge(12);
        
        System.out.println("年龄为:" + p1.getAge());
    }
}

构造器constructor(构造方法)

作用:1.创建对象、2.初始化对象信息
说明:
  • 如果没显式的定义类的构造器的话,则系统默认提供一个空参的构造器
  • 定义构造器的格式:权限修饰符 类名(形参列表){}
  • 一个类中定义的多个构造器,彼此构成重载
  • 一旦我们显式的定义了类的构造器之后,系统就不再提供默认的空参构造器
  • 不能被static、final、synchronized、abstract、native修饰,不能有return语句返回值
  • 一个类中,至少会有一个构造器。

例题1

public class Animal {
    private int legs;
    // 构造器
    public Animal() {
        legs = 4;
    }
    public void setLegs(int i) {
        legs = i;
    }
    public int getLegs() {
        return legs;
    }
}

JavaBean

JavaBean是一种Java语言写成的可重用组件。

用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用Java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。

所谓javaBean,是指符合如下标准的Java类:

  • 类是公共的
  • 有一个无参的公共的构造器
  • 有属性,且有对应的get、set方法

this关键字

this可以调用属性、方法、构造器

在类的方法中,我们可以使用"this.属性"或"this.方法"的方式,调用当前对象属性或方法。但是,通常情况下,我们都择省略"this."。特殊情况下,如果方法的形参和类的属性同名时,我们必须显式的使用"this.变量"的方式,表明此变量是属性,而非形参。

在类的构造器中,我们可以使用"this.属性"或"this.方法"的方式,调用当前正在创建的对象属性或方法。但是,通常情况下,我们都择省略"this."。特殊情况下,如果构造器的形参和类的属性同名时,我们必须显式的使用"this.变量"的方式,表明此变量是属性,而非形参

说明:
  • 我们在类的构造器中,可以显式的使用"this(形参列表)"方式,调用本类中指定的其他构造器
  • 构造器中不能通过"this(形参列表)"方式调用自己
  • 如果一个类中有n个构造器,则最多有 n - 1构造器中使用了"this(形参列表)"
  • 规定:"this(形参列表)"必须声明在当前构造器的首行
public class PersonTest {
    public static void main(String[] args) {
        
        Person p1 = new Person();
        
        p1.setAge(1);
        System.out.println(p1.getAge());
        
        p1.eat();
        
        System.out.println();
        
        Person p2 = new Person("Jerry",20);
        System.out.println(p2.getAge());
        
    }
}

class Person{
    
    private String name;
    private int age;
    
    
    public Person(){
        
        //this.eat();
        String info = "Person初始化时,需要考虑如下的1,2,3,4...(共40行代码)";
        System.out.println(info);
    }
    
    public Person(String name){
        this();
        this.name = name;
        
    }
    
    public Person(int age){
        this();
        this.age = age;
        
    }
    
    public Person(String name,int age){
        this(age);
        this.name = name;
        //this.age = age;
        //Person初始化时,需要考虑如下的1,2,3,4...(共40行代码)
    }
    
    public void setName(String name){
        this.name = name;
    }
    public String getName(){
        return this.name;
    }
    public void setAge(int age){
        this.age = age;
    }
    public int getAge(){
        return this.age;
    }
    
    public void eat(){
        System.out.println("人吃饭");
        this.study();
    }
    public void study(){
        System.out.println("人学习");
    }
    
}
最后修改:2021 年 08 月 03 日 04 : 33 PM
如果觉得我的文章对你有用,请随意赞赏