类的继承
类的继承要使用关键字 extends
实现类的复用,提高效率有两种方法
1、将一个类当作另一个类的属性(合成/聚合关系) 2、一个类继承另一个类,实现继承的类称为 子类 或者 叫 派生类
而被继承的类称为 父类 ,也叫做 超类 或 基类
通过 继承 一个现有的类,可以使用已经定义的类中的方法 和属性
类的方法 和属性可以被继承,但 类的 构造器(方法,函数)不能被继承
关键字super(其实就是父类的一个可变的对象)可以访问父类中定义的属性,成员方法 还可以用在子类构造器(方法,函数)
中调用父类的构造器
/** * 构造函数 * 1、子类new 对象的时候,必须调用父类构造函数 * 2、如果父类无法提供子类所需要的构造函数,这时会报错 * 报错现象: * 父类自定义带参数的构造函数,而子类使用默认的构造函数(无参数的) * 最佳的解法:自定义类时,自定义一个空参数的构造函数(养成习惯) * 3、可以通过,super进行调用父类的构造函数,进行初始化父类属性 * 4、构造函数不能被子类继承 */
public class Son extends Father { private String sonField; public Son(){ super(); //默认调用这个super空参数的 //第一种赋值方式 //有弊端,属性值固定 super.setAge(1); super.setFatField("1111"); } public Son(String field, int age){ /*//super(); //默认调用空参的父类构造函数 super(field, age); //调用父类的带参数的构造函数*/ //Constructor call must be the first statement in a constructor //super 跟this 在构造方法中,只能存在一个 //原因:super this 都必须是第一行执行 //强调一点:此处的this 是调用构造函数 /*this(field); super(age);*/ } public Son(String field){ //super(); //默认调用空参的父类构造函数 //System.out.println(); super(field); //调用父类的带参数的构造函数 this.sonField = field; }
public static void main(String[] args) { /*Son son = new Son(); System.out.println(son.getAge()); System.out.println(son.getFatField());*/ System.out.println("----------------------------"); Son son2 = new Son("2222", 2); System.out.println(son2.getAge()); System.out.println(son2.getFatField()); }}
---------------------------------------------------------------------------
/* * 继承属性的知识点: * 1、如果父类有某个属性,而子类刚好也一个一模一样的属性,子类访问时,访问的是子类的属性 * 如果子类没有这个属性,那么访问父类的属性, 这个特性叫:属性隐藏 * 2、如果子类非得去获取父类的属性,可以通过super去获取,注意super 自能在列的内部使用 * 3、子类继承父类的属性和方法,但是,无法继承父类private 修饰的方法或属性 * 4、子类也继承了父类的静态属性 */public class Son extends Father{ private int age = 18; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Son() { System.out.println("son 的构造方法...."); } public static void main(String[] args) { //知识点:子类初始化(创建对象)时,首先调用父类的构造器,生成父类对象, //然后在进行子类初始化。 Son son = new Son(); //father中有age ,子类也age 打印 son的age System.out.println(son.getAge()); //18 //father中有age ,子类没有age 打印 father的age System.out.println(son.getAge()); //40 System.out.println(son.fatname); System.out.println(Son.staticField); System.out.println(son.staticField); System.out.println(Father.staticField); }}
----------------------------------------------------------------------- /* * 类继承的方法知识点 * 一、方法的重写 * 如果父类中有一个方法,而子类中有个一个一模一样的方法,这个时候,我称为方法的重写 * 重写的条件注意点: * 1、方法名一模一样 * 2、参数列表一模一样 * 3、返回值一模一样 * 4、访问控制权限: * 1> 如果父类中有个方法,是private 修饰的,而子类刚好也有一个一模一样的方法, * 这个时候,不能称为方法的重写,子类的方法,是自定义的方法 * 2> 如果父类中有个方法,而子类刚好也有一个一模一样的方法,子类的方法,访问权限 * 必须大于或等于父类的方法的访问权限 * 5、抛出的异常 * 子类方法重写,抛出的异常,是父类抛的异常的子类或相同类 * * 二、静态方法 * 1、子类也可以继承父类的静态方法 * 2、子类不能重写父类的静态方法 * */public class Son extends Father { //方法名不一样,不算重写 public void info1(){ System.out.println("Son.info1()"); } //参数列表不一样,不算重写,不算重载,因为不在同一个类 public void info(int a){ System.out.println("Son.info(a)"); } /*Multiple markers at this line - Cannot reduce the visibility of the inherited method from Father - overrides com.qianfeng.demo6.Father.info*/ protected double info(){ System.out.println("Son.info()"); return 1; } /*@Override // overload public static void staticMethod(){ System.out.println("son.staticMethod()"); }*/ /*@Override //java 注解 private void privateMethod(){ System.out.println("son.privateMethod()"); }*/ public static void main(String[] args) { Son son = new Son(); son.info(); Son.staticMethod(); }}