构造器
构造器可以被重载但是不能被重写
同一个类里具有多个构造器, 多个额构造器的形参列表不同, 即被称为构造器重载. 构造器重载允许java雷利包含多个初始化逻辑, 从而允许使用不同的构造器来初始化java对象.
构造器是不能被继承的, 因为每个类的类名都不相同, 而构造器名称与类名相同, 所以根本和继承没有关系.所以构造器不能被重写
zilei虽然不会继承父类的构造器, 但是子类构造器里可以调用父类构造器的初始化代码. 在一个构造器中调用另外一个重载的构造器 使用this来完成, 在子类够傲气中调用父类构造器使用super来调用
继承
java语言中, 每个类最多只有一个直接父类, 实际上 java类可以无限多个间接父类
例如:
A extends B
C extends A
子类重写父类的方法
从子类角度看, 子类extends(扩展)了父类, 但是从父类的角度看, 父类derive(派生)了一个子类.
子类是父类的一个特殊类,. 大部分的时候, 子类是以父类为基础, 额外增加新的成员变量和方法.. 但是有一种情况例外: 子类需要重写父类的方法
例如:
public class A(){
public void test(){
syso("测试A")
}
}
public B extends A(){
@Override //继承的时候回自动显示
public void test(){
syso("测试A")
}
}
//重写就是修改syso()的内容
public B extends A(){
@Override //继承的时候回自动显示
public void test(){
syso("重写")
}
}
重写需要遵循规则:
方法名相同、 形参列表相同丶子类方法的返回值类型比父类的返回值类型更小或者相等、 子类方法的访问权限应该比父类方法的访问权限更大或者相等
当子类覆盖了父类的方法之后, 子类的对象无法访问父类中**被覆盖**的方法, 但是在子类方法中可以调用父类中被覆盖的方法, 如果需要在子类方法中调用父类被覆盖的方法, 则可以使用super或者父类名 作为调用者来调用父类中被覆盖的方法.
super
super是java提供的一个关键字, super 用于限定该对象调用它从父类继承得到的实例变量或者方法, 整如this不能出现在static修饰的方法中一样, super也不能出现在static修饰的方法中, static修饰的方法是属于类的, 该方法的调用者只能是一个类而不是对象, 因此super的限定也就失去了意义
但是 如果在构造器中使用super, 则super用于限定该构造器初始化的是该对象从父类继承得到的实力变量,而不是该类自己的实力变量, 如果 子类定义了和父类同名的实例变量,则会发生子类实例变量隐藏父类实例变量的情形. 在正常情况下, 子类里面定义的方法直接访问该实例变量默认会访问到子类中定义的实例变量,而 无法访问到父类中被隐藏的实例变量
多态
因为子类其实是一种特殊的父类, 因此java中语序把一个子类对象直接赋给一个父类引用变量.无需任何类型转换,
当把一个子类对象直接复制给父类引用变量时,
Class A{
public void test1(
syso{"A的方法"}
)
public void test2(){
syso("要被子类覆盖的方法")
}
}
Class B extends A(){
public void test2(){
syso("子类覆盖父类的方法")
}
public void test3(){
syso("子类自己的方法")
}
public static void main(String[] args){
//编译和运行时类型是一样的, 因此不存在多态
A a=new A();
a.test2();//要被子类覆盖的方法
//编译和运行时类型是一样的, 因此不存在多态
B b=new B();
b.test2();//子类覆盖父类的方法
//编译时类型和运行时类型不一样的, 因此存在多态
A ab=new B();
ab.test2();//子类覆盖父类的方法
}
}
注意: 多态只限于方法, 类里面声明的常量或者变量,不具备多态性
本文是在阅读<< 疯狂Java>>的时候所做的笔记,