面向对象的特性二继承:
继承的好处:
1、减少代码的冗余、提高了代码的复用性 2、便于功能的扩展 3、为之后多态的使用,提供了前提
继承的格式:
class A extends B{} A:子类、派生类、subclass B:父类、超类、基类、superclass
体现:一旦子类A继承父类B以后,子类A中就获取了父类B中声明的所有的属性和方法。 特别的,父类中声明为private的属性或方法,子类继承父类以后,仍然认为获取了父类中私有的结构。 只有因为封装性的影响,使得子类不能直接调用父类的结构而已。 子类继承父类以后,还可以声明自己特有的属性或方法:实现功能的拓展。 子类和父类的关系,不同于子集和集合的关系。 extends:延展、扩展
java是只能单继承的 不可以多继承,
eg:
class A{} class B extends A{} class C extends B{} 如果c想要继承A和B那就要先继承B去继承A,这样c就有了B和A的所有内容了,不可以直接继承B和A
如果我们继承了一个类连这个类的私有属性也继承了只不过使用的时候要用set和get方法来获取
方法的重写:
重写:当子类继承父类时,可以对父类中同名通参数的方法进行覆盖
重写之后当创建子类以后,通过子类调用父类中的同名同参数的方法时,实际执行的就是子类中重写的父类方法
public class ext { public static void main(String[] args) { C c = new C(); c.eat(); // 我是C中的eat方法 } } class A{ private int age; private String name; public void eat(){ System.out.println("我是A中的eat方法"); } } class B extends A{ //B继承 public void eat(){ System.out.println("我是B中的eat方法"); } } class C extends B{ public void eat(){ System.out.println("我是C中的eat方法"); } }
重写的规定:
方法的声明: 权限修饰符 返回值类型 方法名(形参列表){ //方法体 } 约定俗称:子类的叫重写方法,父类中的叫被重写的方法 1、子类重写的方法名和形参列表与父类被重写的方法的方法名和形参列表相同 2、子类重写的方法权限修饰符不能小于父类被重写的方法修饰符。>= 注意点: 子类中不能重写父类中私有(private)的方法 3、返回值类型: >父类被重写的方法返回值类型是void,则子类重写方法的返回值类型只能是void >父类被重写的方法返回值类型是A类型,则子类重写的方法返回值类型可以是A类或者A类的子类
>父类被重写的方法是基本数据类型,则子类重写的方法的返回值类型必须是相同的基本数据类型
4、子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常
子类和父类中同名同通参数的方法要么都声明为非static(考虑重写),要么都声明为static(不是重写)静态方法不能被覆盖
eg:
class A{ private int age; private String name; public void eat(){ System.out.println("我是A中的eat方法"); } public static void ss(){ } } class B extends A{ //B继承 public void eat(){ System.out.println("我是B中的eat方法"); } // public void ss(){} // 父类中的方法是static子类的也需要是static的不然就报错 public static void ss(){} }
super关键字:
super就是调用父类的方法时候使用的关键字,当子类重写了父类中的方法时候 我们还想再子类中继续使用父类中被重写的方法的时候就需要用到super了
public class ext { public static void main(String[] args) { C c = new C(); c.eat(); //输出: 我是C中的eat方法,我是B中的eat方法,我是A类中的show方法 } } class A{ private int age; private String name; public void eat(){ System.out.println("我是A中的eat方法"); } public static void ss(){ } public void show(){ System.out.println("我是A类中的show方法"); } } class B extends A{ //B继承 public void eat(){ System.out.println("我是B中的eat方法"); super.show(); // 调用父类中的show方法 } // public void ss(){} // 父类中的方法是static子类的也需要是static的不然就报错 public static void ss(){} public void show(){ System.out.println("我是B类中的show方法"); } } class C extends B{ public void eat(){ System.out.println("我是C中的eat方法"); super.eat(); // c类再执行自己继承的B类中的方法 } }
我们可以在子类的方法或者构造器中,通过使用“super.属性”或'super.'方法的方式,显示的调用 父类中声明的属性或方法,但是通常情况下 我们会省略这个“super”
super调用构造器
1 我们可以在子类的构造器中 使用 "super(形参)" 的方式来调用父类中对应的构造器 2 "super(形参列表)" 的方式调用父类的构造器必须声明在子类构造器的首行 3 我们再类的构造器中 针对 "this(形参列表)" 或者"super(形参列表)" 只能二选一 不能同时出现\
4 在构造器的首行 没有显示的声明"this(形参列表)" 或者"super(形参列表)" 则默认调用的是父类中空参的构造器
5 在类中的多个构造器 至少有一个类的构造器中使用了 "super(形参列表)"调用父类中的构造器
.