目录
面向对象的思想里提出了继承的概念,专门用来共性抽取,以此来实现代码的复用
是面向对象程序设计过程中实现代码复用的重要手段,他允许在保持原有类特性的基础上,进行扩展,增加新功能,这样产生的类叫做子类,也叫派生类。继承主要解决的问题是,共性的抽取和代码的复用,父类也叫基类,子类也叫派生类
- class A extends B{
-
-
- }
1.子类在继承父类后,必须有新的成员以体现于父类的不同
1,没有同名变量时
可以通过this.成员变量或者直接使用变量名进行访问
2、父类与子类里有同名的成员变量时
可以通过super.成员变量
1、没有同名的成员方法时
可以通过this.成员方法,或者直接调用
2、有同名的成员方法时
super.成员方法
1.当父类不自己提供构造方法时,由编译器自己提供,此时子类也可以由编译器默认提供
2.当父类提供了代参或者不带参的构造方法时,此时父类必须提供构造方法,且必须在构造方法里先通过super关键字调用父类的构造方法来初始化,子类继承父类的那部分字段
要注意的时,在子类的构造方法里面,super调用父类的构造方法必须放在第一行
3.在构造对象时 ,先调用父类的构造方法,将继承父类的成员进行初始化,然后再第调用子类自己的构造方法,将子类新增的成员初始化完整
在类内部初始化时代码执行的顺序是:
先执行父类的静态代码块然后执行子类的静态代码块
接着执行父类里的实例代码块跟构造方法
最后执行子类里的实例代码块跟构造方法
要注意的是,静态代码块在实例多个对象时只会执行一次
1、访问父类里的成员变量
super.变量名
2、访问父类里的成员方法
super.方法
3、调用父类的构造方法
super()
4、super只能在非静态的方法里面使用
1、单继承
class A {
……
}
class B extends A{
……
}
2、多层继承
class A {
……
}
class B extends A{
……
}
class C extends B{
……
}
3、不同类继承了同一个类
class A {
……
}
class B extends A{
……
}
class C extends A{
……
}
class D extends A{
……
}
首先他是一个访问修饰限定符,在类里面修饰成员,当一个变量被protected修饰时
1、在同一个类里可以访问
2、在同一个包里的不同类也可以访问
3、在不同包里的子类可以访问
当不同包里有一个类继承了这个类时,在这个子类就可以访问这个被protected修饰的变量
类似于C语言结构体里成员变量有另一个结构体变量
与继承相比优先使用组合,组合与继承都可以实现代码的复用
对于老师类与学生类,他们的共性是都要名字和年龄走路等,于是共性抽取将其作为父类,然后定义老师类与学生类时就可以直接去继承这个类,实现了代码的复用
也是面向对象的一种思想 ,他是在具体完成某个行为时,不同对象所体现出了不同的状态
所谓的向上转型就是在一个类继承了一个类时,父类的引用,引用了子类的对象,通俗来说就是new一个子类的对象,用父类的类型来接收
一下三种情况都会发生向上转型
1、在方法里用父类类型来接收,传入时以子类对象传入
2、在方法返回时,返回子类的对象,接收反回值时用父类的引用来接收 3、直接用父类的引用引用子类的对象
方法重载是方法名相同,参数列表类型、个数、顺序不同 ,而方法重写是返回值相同,方法名相同,参数列表相同
static、private、final修饰的方法不能重写、子类重写的方法的修饰限定符权限必须大于等于父类被重写的方法
1、发生向上转型
2、完成方法重写
3、通过父类的引用调用重写的方法
这个过程会发生动态绑定,在编译时调用父类的方法,而在运行时调用子类的重写方法,也叫运行时绑定
1、发生向上转型
2、方法重写
3、通过父类的引用调用重写的方法
此时main函数里调用了两个walk方法,此时就会发生多态