package cn.learn.extend; /* 定义一个父类 */ public class Employee { int num=20; private int age; private String name; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Employee(int age, String name) { this.age = age; this.name = name; } public Employee() { } public void method(){ System.out.println("我来自父类!!"); } }
package cn.learn.extend; /* 1. 由Employee生成的子类 注意:在子类创建的成员变量/成员方法与父类变量重名时 访问有两种方式(非private成员变量时) 直接:通过子类对象访问成员变量/成员方法(构造方法除外) 等号左边是谁就优先用谁,若没有则继续往上找,绝不会向下找(即对象是哪个类生成的就取谁的) 间接:通过成员方法访问成员变量 2.重写(override):在继承关系中,形参参数列表一样,方法名一样,覆盖掉父类 重载(overload):方法名称一样,参数列表不一样 3.重写注意事项:子类方法的返回值必须【小于等于】父类方法的返回值 扩展提示:java.lang.Object类是所有类的公共最高父类(祖宗类),java.lang.String就是Object的类 4.重写注意事项:子类方法的权限(修饰符)必须【大于等于】父类权限 扩展提示:public > protected > (default) > private(??这是类成员变量修饰的原因) @override -有效的重写注解,起到检测参数列表是否一致的作用 */ public class Teacher extends Employee { int num=100; //可以与父类重名 @Override public int getAge() { return age; } @Override public void setAge(int age) { this.age = age; } private int age; //重写method方法, //三中变量的调用,子类num,局部num,父类num @Override public void method() { int num=50; //局部变量 System.out.println("我是局部变量:"+num); System.out.println("我是子类里的变量"+this.num); //此类method方法外的的num System.out.println("我是父类里的变量"+super.num); //父类的num } }
package cn.learn.extend; /* 继承是多态的前提 子类定义格式 public class 子类名称 extends 父类名称{} 继承中: 构造方法的调用是父类的优先于子类,因为子类的构造方法中有一个默认的"super()",所以构造方法父类优先 但是若父类没写无参的构造方法,则默认调用会报错,【这也是标准类有无参构造的原因】 但是可以在子类的构造方法中自己有个有参函数防止报错,格式“super(参数数据)” **但是只有子类构造方法才有资格调用,且必须是第一个语句,且只能调用一次 子类必须调用父类构造方法,不写则会默认调用 super关键字用法 1.在子类方法中访问父类的成员变量 2.在与父类重名的子类方法中调用父类方法 3.在子类的构造方法中,访问父类的构造方法 this关键字,是在生成对象之后产生的,低于static 1.this在成员方法中用来访问本类的成员变量,用于区分成员方法的同名局部变量 2.在本类的成员方法中访问本类成员方法,可以省略,用来强调区分父类的同名方法 3.在本类的重载的构造方法中,访问另一个构造方法,格式:this(参数数据) 注:3中this必须是第一个语句且只能调用一次,可见this与super无法同时使用,还有一点就是有参的构造不能调用无参,会陷入死循环 */ public class Extends { public static void main(String[] args) { Teacher one=new Teacher(); one.method(); one.setAge(21); System.out.println("目前年龄:"+one.getAge()+" "+one.num);//21 100 } }