一、封装
1、存在意义
public对属性的设置或者修改没有任何限制
隐藏该隐藏的,暴露该暴露的。
封装之后设置set和get方法
2、封装
//1、将需要封装的属性修饰符设置为private(私有的,在外界无法访问)
private int age;// 年龄
//正常情况下通过创建对象可以访问属性
Student stu1 = new Student();
stu1.age; //错误
//封装属性之后,不能直接使用了,需要通过方法使用
//2、因此在自定义Student类中提供set和get方法(右击生成)
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//3、通过对象调用自定义类方法实现属性设置和获取
Student s = new Student();
//set设置
s.setAge(20);
//get获取
System.out.println(s.getAge());
二、继承
1、存在意义
数据冗余,维护不方便
写好的类无法扩展,多个对象调用同一个类,不能够满足所有需要
2、定义
1、Java为单继承,程序中的继承,是类与类之间特征和行为的一种赠与或获得。
2、提高了代码的复用性和可扩展性
3、两个类之间的继承关系,必须满足is a的关系。
4、在实际开发中,可根据程序需要使用到的多个具体类,进行共性提取,进而定义父类。
5、被继承的类称为父类,继承的类称为子类
6、子类继承父类时,构造方法不会被继承。
//父类的定义 正常的类
[修饰符] class 父类名{
//属性
//构造方法
//方法
}
//子类的定义 单继承
[修饰符] class 子类名 extends 父类名{
//属性 子类自己的
//构造方法
//方法
}
//产生继承关系之后,子类可以使用父类中的属性和方法,也可以定义子类独有的属性和方法。
//一个类的父类是可以有父类的 - 一个类可以有多个间接父类,多级继承
//Object类是所有类的“父类” - 直接、间接
3、方法重写
1、方法之间的关系有两种:方法重载(同一个类里面)和方法重写(子类和父类)
2、父类中的方法不能满足子类的要求 - 子类重写一个方法覆盖父类的方法
3、要有继承关系才能重写,重写方法的三要素和父类完全相同 (返回值类型、方法名、参数列表),访问修饰符可与父类相同或是比父类更宽泛。
4、子类重写父类方法后,子类调用时优先执行子类重写后的方法
5、@Override - 编译器帮助我们检查方法是否是重写正确
4、super关键字
//如果父子类的属性或方法存在重名(属性遮蔽、方法重写)时,需要加以区分
//代表父类对象 super关键字可在子类中访问父类的方法。
super.属性
super.方法()
//代表父类的构造方法 首行
super() //表示调用父类无参构造方法,如果没有显式书写,隐式存在于子类构造方法的首行。
super(...) //在子类中调用父类有参的构造方法
5、super和this
// 区分父类属性、子类属性、局部变量
父类属性 super.属性名
子类属性 this.属性名
局部变量 局部变量名
//同名同类型情况下被调用优先性
局部 子类本身 父类
//this和super不能同时存在于子类构造方法中,因为super方法会创建父类对象,但是this又代表了子类构造方法,所以会致使多次创建父类对象
//this或super使用在构造方法中时,都要求在首行。
//当子类构造中使用了this()或this(参数),就不可再同时书写super()或super(参数),
//可以使用this调用当前类的构造方法,构造方法内含有默认无参或者显式有参的super(...),以此来由this()指向的构造方法完成super()的调用:
//子类中
public Student(String name, int age, String gender, String addr) {
//super();
super(name,age,gender,addr); //调用父类的构造方法
}
public Student(String name, int age, String gender, String addr, String school) {
this(name,age,gender,addr); //调用子类的构造方法,目的是super()
this.school = school; //子类特有的属性
}
//测试类
Student student1 = new Student("父类", 20, "z", "z", "z");
System.out.println(student1);
6、访问控制修饰符
public 本类 同包 非同包子类 其他
private 本类
default 本类 同包 //不写修饰符,默认
protected 本类 同包 非同包子类
7、初始化的顺序
//继承中对象创建
1. 单个对象初始化(没有继承)的顺序:
1) 属性初始化
2) 调用构造方法
2. 存在继承关系的初始化的顺序:
1) 父类属性初始化
2) 父类构造方法
3) 子类属性初始化
4) 子类构造方法
三、多态
1、存在意义
当存在多个子类,main方法需要使用各个子类的内部特有的方法或者各自重写的父类的方法时,一个个调用会很麻烦而且代码繁多
编译和运行时呈献不同的状态 ===> 多态
使用父类作为方法形参实现多态,使方法参数的类型更为宽泛
使用父类作为方法返回值实现多态,使方法可以返回不同的子类对象
2、定义
//1. 如何实现多态:
//父类引用指向子类对象/子类对象赋值给父类引用
基于父类的多态
Person p1 = new Student();
Person p2 = new Teacher();
//1)父类引用仅可调用父类所声明的属性和方法,不可调用子类独有的属性和方法;
//2)子类对象赋值给父类引用,如果运行被重写的方法,实际运行的是子类中的方法
//2、多态的细节:
//1) 编译时,看左边,左边有的方法才能调用
//2) 运行时,看右边,右边实际是什么类型就调用该类型的方法
3、基于接口的多态
//接口的引用指向实现类的对象/实现类的对象赋值给接口的引用
Vehicle v1 = new Car();
//接口作为方法的参数
//接口作为方法的返回值
4、向上或向下转型
//向上转型
//将子类对象的引用赋值给父类类型的变量。
//向上转型是自动进行安全的,因为子类对象是父类类型的实例。
//目的:使父类引用能够指向子类对象,从而可以调用父类中定义的方法,或者通过父类引用访问子类对象。
Person p1 = new Student();
p1.eat();
//向下转型
//将父类类型的引用转换为子类类型。
//需要显式类型转换,如果父类引用中的子类对象类型和目标类型不匹配,则会发生类型转换异常(ClassCastException)。
//目的:访问子类特有的属性和方法。
Person ps = new Student(); //实际上这里已经进行了向上类型转换
Student s = (Student) ps;
s.study();
//总结来说,向下转型并不一定需要先进行向上转型,但向下转型确实发生在父类引用已经指向子类对象的情况下。
//向下转型的前提条件是父类引用实际上指向的是子类的对象。如果父类引用没有指向正确的子类对象,那么向下转型将会导致 ClassCastException。
//注意:
类型安全:确保父类引用确实指向了一个子类对象。
类型检查:在进行向下转型之前,可以使用 instanceof 操作符来检查对象是否是特定子类的实例。
//如何判断p到底是教师还是学生
// (对象/引用 instanceof 类型) 检查是否是类的对象
Person ps = new Student();
if(ps instanceof Teacher) {
Teacher t = (Teacher) ps;
t.teach(); //调用其特有的方法 Teacher teach
//p.eat();
} else if(ps instanceof Student) {
Student s = (Student) ps;
s.study(); // Student study
}
标签:JavaWeb,构造方法,子类,方法,面向对象,Student,JavaSE,父类,super
From: https://blog.csdn.net/weixin_59096017/article/details/142422655