📋 个人简介
- 💖 作者简介:大家好,我是阿牛,全栈领域新星创作者。😜
- 🎉 支持我:点赞👍+收藏⭐️+留言📝
- 📣 系列专栏:重走 java 路🍁
- 💬格言:要成为光,因为有怕黑的人!🔥
前言
这一节复习面向对象的特征之一继承,同时总结一下方法重写和重载的区别以及子类创建对象的全过程。
继承性
一、继承性的好处
- 减少了代码的冗余,提高了代码的复用性。
- 便于功能的扩展。
- 为之后多态性的使用,提供了前提。
二、继承性的格式
class A extends B{ }
A :子类、派生类、 subclass
B :父类、超类、基类、 superclass
-
体现:一旦子类 A 继承父类 B 以后,子类 A 中就获取了父类 B 中声明的结构:属性、方法。
-
特别的,父类中声明为 private 的属性或方法,子类继承父类以后,仍然认为获取了父类中私有的结构。只是因为封装性的影响,使得子类不能直接调用父类的结构而已。
-
子类继承父类以后,还可以声明自己特有的属性或方法:实现功能的拓展。
-
子类和父类的关系,不同于子集和集合的关系。
-
extends :延展、扩展
三、Java 中关于继承性的规定:
- 一个类可以被多个子类继承。
- Java中类的单继承性:一个类只能有一个父类(c++支持多继承)。
- 子父类是相对的概念。
- 子类直接继承的父类称为:直接父类 ;间接继承的父类称为:间接父类。
- 子类继承父类以后,就获取了直接父类以及所有间接父类中声明的属性和方法。
四、
- 如果我们没有显式的声明一个类的父类的话,则此类继承于 java.lang.Object 类。
- 所有的 java 类(除java.lang.Object 类之外)都直接或间接的继承于 java . lang .Object类。
- 意味着,所有的 java 类具有 java.lang.Object 类声明的功能。
方法重写(override)
1.重写,子类继承父类以后,可以对父类中同名同参数的方法,进行覆盖操作
2.应用:重写以后,当创建子类对象以后,通过子类对象调用子父类中的同名同参数的方法时,实际执行的是子类重写父类的方法。
- 重写的规定
- 子类重写的方法的方法名和形参列表与父类被重写的方法的方法名和形参列表相同。
- 子类重写的方法的权限修饰符不小于父类被重写的方法的权限修饰符。
>特殊情况 : 子类不能重写父类中声明为 private 权限的方法。
4.返回值类型:
>父类被重写的方法的返回值类型是 void ,则子类重写的方法的返回值类型只能是 void
>父类被重写的方法返回值类型是 A 类型,则子类重写的方法的返回值类型可以是 A 类或 A 类的子类
>父类被重写的方法的返回值类型是基本数据类型(比如: double ),则子类重写的方法返回值类型必须是相同的。
5.子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型。
6.子类和父类中的同名同参数的方法要么都申明为非sattic的(重写),要么都声明为static的(不是重写)。(也就是说,static的方法不能被重写)
重写与重载之间的区别
方法的重写和重载是Java多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载可以理解成多态的具体表现形式。
-
方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载;
-
方法重写是在子类存在方法与父类的方法的名字相同而且参数的个数与类型一样,返回值也一样的方法,就称为方法的重写;
-
方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。
子类创建对象的全过程
1.从结果上来看:
子类继承父类以后,就获取了父类中声明的属性或方法。
创建子类的对象,在堆空间中,就会加载所有父类中声明的属性。
2.从过程上来看:
当我们通过子类的构造器创建子类对象时,我们一定会直接或间接的调用其父类的构造器(上节写的super()),进而调用父类的父类的构造器,直到调用了 java.lang.Object类中空参的构造器为止。
正因为加载过所有的父类的结构,所以才可以看到内存中有父类中的结构,子类对象オ可以考虑进行调用。
注:虽然创建子类对象时,调用了父类的构造器,但是自始至终就创建过一个对象,即为 new 的子类对象!
案例
package 继承和方法重写;
public class Demo{
public static void main(String[] args) {
// 实例化子类对象stu,调用重写的talk()方法打印信息
Student stu = new Student("阿牛",21,"哔哩哔哩大学");
String str = stu.talk();
System.out.println(str);
}
}
class Person {
String name;
int age;
String talk(){
return "我是:" + this.name + ",今年:" + this.age + "岁";
}
}
class Student extends Person {
String school;
Student(String n,int a,String s){
super.name = n;
super.age = a;
this.school = s;
}
// 重写talk方法,并且将权限升高
@Override
public String talk() {
return super.talk() + ",我在" + this.school + "上学";
}
}
结语
如果你觉得博主写的还不错的话,可以关注一下当前专栏,博主会更完这个系列的哦!也欢迎订阅博主的其他好的专栏。
🏰系列专栏
👉软磨 css
👉硬泡 javascript
👉flask框架快速入门