面向对象的三大特征:继承封装多态
Java的继承通过 extends关键字实现的,实现继承的类为子类(派生类),被继承的类为父类(基类或超类)。
集成的分类 A 单继承----子类只能有一个父类
B多重继承---------子类可以有多个直接父类。
Java不允许多重继承 转变成回字符串
[修饰符] class 子类名 extends 父类名{
//子类子类继承父类的语法格式
代码部分
}
例5.1 编写程序示范子类继承父类的特点。
public class Animal{
public double weight;
public void eat(){
System.out.println("动物在吃东西");
}
}
public class Dog extends Animal{
public void say(){
System.out.pringln(“狗叫:汪汪汪”);
}
public static void main(String[] args) {
Dog d= new Dog();
d.weight = 150;
d.eat();
d.say();
}
}
重写父类方法
¯ 重写父类的方法
子类扩展父类--总是以父类为基础,额外增加新的属性和方法。但有一种情况例外:子类需要重写父类的方法。
例5.2 子类重写父类的方法
public class Bird{
public void fly(){
System.out.println("我在飞");
}
}
public class Ostrich extends Bird{
//重写Bird类的fly方法----方法覆盖(override)
public void fly(){
System.out.println("我只能在地上奔跑");
}
public static void main(String[] args){
Ostrich os = new Ostrich();
os.fly(); //调用的是Bird的fly还是Ostrich的fly?
}
}
子类扩展父类-----总是以父类为基础,但是有一种特殊:子类要重写父类。(方法覆盖 overrde)
重载 overload
重写的方法遵循“三同一小一大”
三同:方法名相同 形参类表相同 返回值相同
一大:子类方法的访问权限大于或等于父类的访问权限。
重载 是在同一个类中的多个方法的关系。重写是在子类和父类间的。
如果在子类方法中调用父类被覆盖的实例方法。用super作为关键字他是直接默认的引用。
This不能出现在static修饰的方法
用super访问覆盖父类的子类
子类构造方法调用父类构造方法
1 子类构造方法执行体的第一行代码使用super显示调用父类构造方法,系统将根据super调用里传入的实参类表调用父类对应的构造方法
2 子类构造方法执行体的第一行代码使用this显示调用本类中重载的构造方法,系统将根据this调用里传入的实参列表调用里传入的实参类表调用本类中另一个构造方法。执行本类中另一个构造方法时即会调用父类的构造方法
3 子类构造方法执行体中既没有super调用也没有this调用,系统将会在执行子类构造方法前,隐士调用父类无参数的构造方法。
创建任何java对象时,最先执行的总是java。Lang。Object
当子类方法覆盖父类方法后子类的对象将无法访问父类中被覆盖的的方法,
如果父类方法具有private访问权限,则该方法对其子类是隐藏的,其子类将无法访问该方法,也无法重写
Static修饰的方法属于类
¯ 方法重写和方法重载的区别
µ 覆盖是子类和父类之间的关系;而重载是同一类内部多个方法之间的关系。
µ 覆盖一般是两个方法间的,而重载可能有多个重载的方法。
µ 覆盖的方法有相同的方法名和形参表;而重载的方法只能有相同的方法名,不能有相同的形参表。
µ 覆盖时根据调用它的对象来区分方法;而重载是根据形参表来决定调用的是哪个方法。
¯ 父类实例的super引用
如果需要在子类方法中调用父类被覆盖的实例方法,可以用super作为调用者来调用父类被覆盖的实例方法。
public classOstrich extends Bird{
… … //子类中原有的内容
public voidcallOverridedMethod(){
super.fly(); //输出“我在飞”
}
… …
}
注意:
ü super是Java提供的一个关键字,它是直接父类对象的默认引用。
ü 正如this不能出现在static修饰的方法中一样,super也不能出现在static的方法中
ü 如果子类定义了和父类同名的属性,也会发生子类属性覆盖父类属性的情形。子类的方法直接访问该属性时,都会访问到覆盖属性,无法访问父类被覆盖的属性---通过super来访问父类被覆盖的属性
ü 调用父类构造方法
子类不会继承父类的构造方法,但有的时候子类构造方法里需要调用父类构造方法的初始化代码。
例写出下面程序的执行结果。
class Base{
protecteddouble size;
publicBase(){
size=0; System.out.println(“Base类无参构造”);
}
publicBase(double s){
size=s;System.out.println(“Base类有参构造”);
}
}
public class Sub extends Base{
privateString color;
publicSub(){
color=“blue”;System.out.println(“Sub类无参构造”);
}
publicSub(String c){
color=c;System.out.println(“Sub类有参构造”);
}
publicstatic void main(String[] args){
Sub s1=new Sub(); Sub s2=new Sub(“red”);
}
}
注意:super调用和this调用很像,区别在于super调用的是其父类的构造方法,而this调用的是同一个类中重载的构造方法。因此,使用super调用父类构造也必须出现在子类构造执行体的第一行,所以this调用和super调用不会同时出现。
,