? ?- 作用:代码复用
? ?- 通过extends来实现继承
? ?- 超类/父类:共有的属性和行为
? ? ?派生类/子类:特有的属性和行为
? ?- 派生类既能访问自己的,也能访问超类的,但超类不能访问派生类的
? ?- 一个超类可以有多个派生类
? ? ?一个派生类只能有一个超类-----------单一继承
? ?- 具有传递性
? ?- java规定:构造派生类之前必须先构造超类
? ? ?- 派生类的构造方法中若没有调用超类的构造方法,则默认super()调用超类的无参构造方法
? ? ?- 派生类的构造方法中若自己调用了超类的构造方法,则不再默认提供
? ? ?> super()调用超类构造方法,必须位于派生类构造方法的第一行
? ? ?```java
?
? ?//super的演示
? ? ?public class SuperDemo {
? ? ? ? ?public static void main(String[] args) {
? ? ? ? ? ? ?Boo o = new Boo();
? ? ? ? ?}
? ? ?}
? ? ?class Coo{
? ? ? ? ?Coo(int a){
? ? ? ? ?}
? ? ?}
? ? ?class Doo extends Coo{
? ? ? ? ?Doo(){
? ? ? ? ? ? ?super(5); //调用超类的有参构造
? ? ? ? ?}
? ? ? ? ?/*
? ? ? ? ?//如下代码为默认的:
? ? ? ? ?Doo(){
? ? ? ? ? ? ?super();
? ? ? ? ?}
? ? ? ? ? */
? ? ?}
? ? ?
? ? ?class Aoo{
? ? ? ? ?Aoo(){
? ? ? ? ? ? ?System.out.println("超类构造");
? ? ? ? ?}
? ? ?}
? ? ?class Boo extends Aoo{
? ? ? ? ?Boo(){
? ? ? ? ? ? ?//super(); //默认的,调用超类的无参构造
? ? ? ? ? ? ?System.out.println("派生类构造");
? ? ? ? ?}
? ? ?}
? ?- super.成员变量名----------------------访问超类的成员变量(了解)
? ?- super.方法名()---------------------------调用超类的方法----------明天讲
? ?- super()-------------------------------------调用超类的构造方法
? ? ?- 超类型的引用指向了派生类的对象
? ?//向上造型的演示
? ?public class UploadDemo {
? ? ? ?public static void main(String[] args) {
? ? ? ? ? ?Eoo o1 = new Eoo();
? ? ? ? ? ?o1.a = 1;
? ? ? ? ? ?o1.show();
? ? ? ? ? ?//o1.b = 2; ?//编译错误
? ? ? ? ? ?//o1.test(); //编译错误,超类不能访问派生类的
? ?
? ? ? ? ? ?Foo o2 = new Foo();
? ? ? ? ? ?o2.b = 1;
? ? ? ? ? ?o2.test();
? ? ? ? ? ?o2.a = 2; ?//正确
? ? ? ? ? ?o2.show(); //正确,派生类可以访问超类的
? ?
? ? ? ? ? ?Eoo o3 = new Foo(); //向上造型
? ? ? ? ? ?o3.a = 1;
? ? ? ? ? ?o3.show();
? ? ? ? ? ?//o3.b = 2; ?//编译错误
? ? ? ? ? ?//o3.test(); //编译错误,能点出来什么,看引用的类型
? ? ? ?}
? ?}
? ?
? ?class Eoo{
? ? ? ?int a;
? ? ? ?void show(){
? ? ? ?}
? ?}
? ?class Foo extends Eoo{
? ? ? ?int b;
? ? ? ?void test(){
? ? ? ?}
? ?}
? ? ? 继承(Inheritance)是面向对象编程中的一个重要概念,它允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和方法。通过继承,子类可以拥有父类的属性和方法,并且可以在此基础上进行扩展和修改。
? ? ?使用关键字extends
来实现继承。子类继承了父类的属性和方法,可以直接使用它们,也可以根据需要添加新的属性和方法。下面是一个简单的代码示例:
// 父类
class Animal {
public String name;
public void eat() {
System.out.println(name + " is eating");
}
}
// 子类
class Dog extends Animal {
public void bark() {
System.out.println(name + " is barking");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.name = "Tom";
dog.eat(); // 调用父类的方法
dog.bark(); // 调用子类的方法
}
}
? ? 在上面的例子中,Animal
是一个父类,Dog
是一个子类。Dog
继承了Animal
的属性name
和方法eat()
,并且还添加了一个新的方法bark()
。在Main
类中,我们创建了一个Dog
对象,并设置了它的名字为"Tom"。然后我们分别调用了父类的方法eat()
和子类的方法bark()
。
? ? ? 继承的好处是代码的重用和扩展性。通过继承,我们可以避免重复编写相同的代码,并且可以在子类中添加新的功能或修改父类的行为。此外,继承还可以通过多态的特性实现更灵活的代码设计。
? ? ?需要注意的是,一个子类只能继承一个父类(单继承),但可以实现多个接口(多实现)。如果一个类已经继承了一个父类,那么它可以通过接口来扩展它的功能。
? ??
当一个类继承另一个类时,子类继承了父类的属性和方法。在继承中,涉及到一些细节,如访问修饰符和构造函数的调用顺序等。
子类构造函数的第一行必须是调用父类的构造函数。可以使用关键字super来调用父类的构造函数。如果子类没有显示地调用父类构造函数,编译器会默认在子类构造函数的第一行插入super()。
如果父类有多个构造函数,子类必须调用其中一个构造函数。
如果子类的构造函数没有显式地调用父类的构造函数,则默认调用父类的无参构造函数。
如果父类没有无参构造函数,子类的构造函数必须显式地调用父类的有参构造函数,否则会编译错误。
? ? 继承涉及到访问修饰符和构造函数的调用顺序时,需要注意以下几点:
? ? ?