Point07(java--类的封装与继承)

173 阅读5分钟
封装

定义:在java中类的封装是一条重要的面向对象编程原则,将数据(属性)和操作数据的方法(行为)绑定在一起,作为一个整体进行考虑。同时,将对象内部实现细节隐藏起来,只暴露必要的接口给外部使用。

核心思想

  1. 数据隐藏:保护对象内部数据,防止数据被外部直接访问和修改。
  2. 提供访问方法:通过公共方法(getter和setter)来访问和修改私有数据,增强灵活性和安全性。
  3. 增强安全性:通过控制对数据的访问,确保对象的状态始终有效和一致。
  4. 代码复用与维护:封装使得对象的内部实现细节对外部透明,便于代码的维护和扩展。

通过代码实现:封装一个studens类,包括姓名,年龄,性别,身份(默认为student,不可修改)

package Day01;

public class Students {
    //属性设置为私有变量,防止数据被直接访问
    private String name;
    private int age;
    private String sex;

    private static int identity = 1;

    //私有方法,外部不可调用,内部数据处理方法,不对外开放
    private String getIdentity(){
        switch (identity){
            case 1:
                return  "学生";
            case 2:
                return  "老师";
            default:
                return  "未知身份";
        }

    }
    //公共方法外部可以调用
    public String introduce(){
        String identity = getIdentity();
        return "我是"+name+",今年"+age+"岁,我是"+sex+"生,我的身份是"+identity;

    }

    // get 和 set方法,通过Alt+Ins快捷键生成。
    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;
    }
}

经过封装,封装后的类符合封装的核心思想,外部调用如下:

package Day01;

public class Cyj {
    public static void main(String[] args) {
        Students students = new Students();
        students.setName("cyj");
        students.setAge(18);
        students.setSex("男");
        System.out.println(students.getName());
        System.out.println(students.getAge());
        System.out.println(students.getSex());
        String introduce = students.introduce();
        System.out.println(introduce);
    }
}

其实在之前的学习中已经对类的封装有了一定的认识,所以这里的学习也是比较轻松的。

继承

定义:在Java中,类的继承是指一个类(子类)可以从另一个类(父类)继承属性和方法。通过继承,子类可以重用父类的代码,同时也可以添加新的属性和方法,或者重写父类的方法。

关键字:extends

在类的继承中,需要使用extends关键字来表示继承那个类,语法如下:

class 父类 {
    // 父类的属性和方法
}

class 子类 extends 父类 {
    // 子类的属性和方法
}

继承的分类:

单继承:java中常见的继承形式,一个子类只继承一个父类;

多层继承:一个类可以继承另一个另外,且这个类也可以被其他类继承,形成多层继承的关系;

  class Grandparent {}
  class Parent extends Grandparent {}
  class Child extends Parent {}

层次继承:多个子类继承同一个父类,形成参差结构;

  class Parent {}
  class Child1 extends Parent {}
  class Child2 extends Parent {}

接口继承:一个类可以实现多个接口,或者一个接口可以继承多个接口;(接口会在后续的学习中学习,这里只做了解)

  interface Interface1 {}
  interface Interface2 {}
  class ImplementClass implements Interface1, Interface2 {}

注意:

  1. java中不支持多继承(一个类继承多个类),但是可以通过实现多个接口来达到类似的效果。
  2. 继承关系中,子类hui继承父类的属性和方法,但不会继承构造方法。

到这里你已经学会了如何去继承父类,但是要使用父类的属性和方法还需要通过另一个关键字: super;

super关键字在java中,用于引用当前对象的直接父级(超类)。主要用于以下几种情况

  1. 调用父类的构造方法

当子类的构造方法中需要调用父类的构造方法时,可以使用super();

如果父类没有无参构造函数时,子类的构造方法必须显示调用父类的某个构造函数;

//父类
public class Parent {
    //属性
    private String name;
    private int age;
    private String sex;
    //构造函数
    public Parent(String name, int age, String sex){
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    ……

}

//子类
class   extends Parent {
    ……
    public Child(String name, int age, String sex){
        super(……) //不写此构造函数会报错
    }
}

  1. 访问父类的成员变量

在父类中没有和子类的同名变量时,可以通过super来访问父类中的变量

  1. 调用父类的方法

当子类重写了父类的方法,并且希望在子类的方法中调用父类的方法时,可以使用 super。

有时子类需要父类的方法,并且子类有自己的特有的内容时,子类需要对父类的方法进行重写。(子类中需要和父类一样的方法)

//父类
public class Parent {
    public String sayHello(){
        return "hello";
    }
}

//子类
public class Child extends Parent{
    public String sayHello(){
        return "我是子类"+super.sayHello();
    }
}


同时还可以使用注解--@Override(注解用于表示子类中的方法重写了父类中的同名方法,该注解可以帮助我们检测重写方法的方法声明的正确性)

注意:

  1. 父类中的私有方法不能被重写(父类中的私有方法不能被继承)
  2. 子类重写的方法访问权限不能更低(public>protected>private)

虽然不加 @Override 注解代码仍能运行,但为了确保代码的健壮性和可维护性,建议保留 @Override 注解。它不仅提高了代码的可读性,还提供了编译时的检查机制,避免潜在的错误。