封装
定义:在java中类的封装是一条重要的面向对象编程原则,将数据(属性)和操作数据的方法(行为)绑定在一起,作为一个整体进行考虑。同时,将对象内部实现细节隐藏起来,只暴露必要的接口给外部使用。
核心思想
- 数据隐藏:保护对象内部数据,防止数据被外部直接访问和修改。
- 提供访问方法:通过公共方法(getter和setter)来访问和修改私有数据,增强灵活性和安全性。
- 增强安全性:通过控制对数据的访问,确保对象的状态始终有效和一致。
- 代码复用与维护:封装使得对象的内部实现细节对外部透明,便于代码的维护和扩展。
通过代码实现:封装一个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 {}
注意:
- java中不支持多继承(一个类继承多个类),但是可以通过实现多个接口来达到类似的效果。
- 继承关系中,子类hui继承父类的属性和方法,但不会继承构造方法。
到这里你已经学会了如何去继承父类,但是要使用父类的属性和方法还需要通过另一个关键字: super;
super关键字在java中,用于引用当前对象的直接父级(超类)。主要用于以下几种情况
- 调用父类的构造方法
当子类的构造方法中需要调用父类的构造方法时,可以使用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(……) //不写此构造函数会报错
}
}
- 访问父类的成员变量
在父类中没有和子类的同名变量时,可以通过super来访问父类中的变量
- 调用父类的方法
当子类重写了父类的方法,并且希望在子类的方法中调用父类的方法时,可以使用 super。
有时子类需要父类的方法,并且子类有自己的特有的内容时,子类需要对父类的方法进行重写。(子类中需要和父类一样的方法)
//父类
public class Parent {
public String sayHello(){
return "hello";
}
}
//子类
public class Child extends Parent{
public String sayHello(){
return "我是子类"+super.sayHello();
}
}
同时还可以使用注解--@Override(注解用于表示子类中的方法重写了父类中的同名方法,该注解可以帮助我们检测重写方法的方法声明的正确性)
注意:
- 父类中的私有方法不能被重写(父类中的私有方法不能被继承)
- 子类重写的方法访问权限不能更低(public>protected>private)
虽然不加 @Override 注解代码仍能运行,但为了确保代码的健壮性和可维护性,建议保留 @Override 注解。它不仅提高了代码的可读性,还提供了编译时的检查机制,避免潜在的错误。