1.7
super和this都可以在成员方法中
this super
this.成员变量 super.成员变量
this.成员方法
this( )调用方法
当前对象
1.8什么是继承?继承有什么作用?
继承是将共性进行抽取,从而达到对代码的复用作用。
在dog和cat里面加上加上extands 对anmial进行代码复用。
1.8.1在子类当中,访问父类的成员方法和成员变量
1.同名的成员变量
2.不同名的成员变量
优先访问自己的,其次访问父类的。
1.8.2super指定访问父类的成员变量和成员方法----访问父类的构造方法
不能在静态方法中使用super
1.9子类构造方法
1.要放在第一行
2.当子类继承父类之后,在构造子类对象的时候,一定要先帮父类进行构造。
2.0继承关系上
父类和子类都包含静态代码块&实例代码块&构造方法
向上转型
2.1多态 多种形态??
通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生不同的状态。
同一个人 对待不同人,表现得形态是不一样的。
2.1.1要想实现多态,需要满足几个条件:
1.继承关系-》向上转型
2.子类和父类 有同名的 覆盖/重写 方法
3.通过父类对象的引用 去调用这个重写方法
完成以上三个部分,就会发生动态绑定 而动态绑定是多态的基础
结论:通过父类引用 只能调用父类自己特有的成员 方法或者成员变量。
2.1.2向上转型
子类------向上转型——父类
2.1.3常见的可以发生向上转型的三个时机
1.直接赋值
Animal animal =new Dog (name:"yuanyuan",age:19);
2.方法的参数 传参的时候向上转型
public static void func1(Animal animal){
}
public static void main(String[] args){
Dog dog =new Dog(name:"yuanyuan",age:19)
func1(dog);
}
3,返回值 向上转型
public static Animal func2(){
Dog dog =new Dog(name:"yuanyuan",age:19);
return dog;
}
2.1.4重写
如果在继承关系上,满足这三点,
1.方法的返回值一样2.方法名一样3.方法的参数链表一样 --( ) 那么就说这两个方法是重写
public void eat(){
System.out.println(this.name+"正在吃饭!");
}
父类
public void eat(){
System.out.println(this.name+"正在吃狗粮!");
}
子类
Animal animal=new Dog(name:"圆圆",age:19);
animal eat( );
此时忽然变成了调用子类的eat
我们把这个过程叫做动态绑定----- 程序运行的时候,绑定到了子类的eat
重写(override):也称覆盖。重写是对子类对父类非静态,非private修饰,非final修饰,非构造方法等的实现重新编写,返回值和形参都不能改变。即外壳不变,核心重写!重写的好处在于子类可以根据需要,定义自己的行为。也就是说子类能够根据需要实现父类的方法。
注解 @overrside 起一个检测作用
实现重写:
1.最基本的 返回值 参数列表必须事一样的
2.被重写的方法的访问修饰限定符 在子类中要大于等于父类的
private 默认的 protected public
3. 被private修饰的方法是不可以被重写的
4.被static final 修饰的方法是不可以 被重写的
协变类型 返回值构成父子关系
重写的规则
1.子类在重写父类的方法时,一般必须与父类方法原型一致:返回值类型 方法名 参数链表必须完全一致
2,被重写的返回值类型可以不同,但是必须具有父子关系的。
3.访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类方法被public修饰,则子类方法就不能声明为protected
4。父类被static private修饰的方法,构造方法都不能被重写。
5,重写的方法 可以用@Override 注解来显式指定,有了这个注解能帮我们进行一些合法性校验,例如将方法名拼错了,此时编译器就会发现父类中没有该方法,编译报错,无法构成重写。