java中类的继承
我们都知道java的四大特性:抽象、继承、封装、多态;
那么关于继承有哪些特性呢?下面看具体实例:
(1)
public class Person {
public int a=2;
public void see(int a){
System.out.println(a);
}
}
public class Hello extends Person {
public int a = 3;
public void see(int s){
System.out.println("11");
} public static void main(String[] args){
Person a1 = new Person();
System.out.println(a1.a); //a1.a的值由声明类型决定,所以值是2
a1.see(1); //调用的方法由引用对象的类型决定,这里对象是子类的对象,所以值是11,总结:属性绑定到类型,方法绑定到对象!
}
}
(1)继承成员变量
当子类继承某个类时,子类就可以使用这个类的成员变量,但不是完全继承这个类中所有的成员变量,具体原则如下:
<1>子类能够继承父类的public、protected、default 修饰成员变量,不能继承private修饰的成员变量
<2>对于子类可以继承父类的成员变量,如果子类出现了同名的成员变量,那么子类就会屏蔽掉父类的成员变量,如果想调用父类的成员变量,就需要用到super关键字
(2)继承方法
当子类继承某个类时,子类就可以使用这个类的方法,但不是完全继承这个类中所有的方法,具体原则如下:
<1>子类能够继承父类的public、protected、default 修饰方法,不能继承private修饰的方法
<2>对于子类可以继承父类的方法,如果子类出现了同名的方法,那么子类就会屏覆盖父类的成员变量,如果想调用父类的成员变量,就需要用到super关键字,子类重写的方法的修饰符权限要大于父类的方法访问权限
总结:
程序运行时(一个类中),会第一时间加载运行静态代码块,一旦创建对象,就会执行非静态代码块以及无参构造方法。 而在继承中,程序运行时 会先加载父类中静态代码块 然后加载本身静态代码块,一旦创建对象(运用子类构造方法创建),就会调用 父类非静态代码块,父类构造方法,然后就是本身 非静态代码块,本身构造方法。
抽象类和接口的区别:
抽象类只能被继承,而且只能被单继承,接口需要被实现,而且可以多实现
抽象类中可以有非抽象方法也可以没有抽象方法(抽象类中可以没有抽象方法,但是有抽象方法的类肯定是抽象类),接口中全部都是抽象方法
抽象类的成员修饰符可以自己定义,接口中不能是private
----
继承:在方法覆盖时注意2点:
1、覆盖的方法修饰符权限不能小于比父类的方法权限
2、方法必须是全部静态或全部非静态
多态的弊端:父类的引用指向子类的对象,虽然提高了扩展性,但是只能方法父类具有的方法,不可以访问子类特有的方法
多态在成员变量和成员方法中的体现:
成员变量看编译运行左边
成员函数看编译看左边 运行看右边--覆盖
静态成员函数编译运行看左边--静态方法不属于对象 属于类
--也就是说静态函数和成员变量,静态成员变量原理一样