关于java中的继承
我们都知道java中的继承是复用代码、扩展子类的一种方式,继承使得java中重复的代码能够被提取出来供子类共用,对于java程序的性能以及修改和扩展有很大的意义,所以这是一个非常重要的知识点。
那么对于继承的知识点,你真的都了解了吗?
首先,我们都知道子类继承父类,就能直接访问父类的公共属性以及受保护属性(public和protected),同时也能直接访问父类的公共方法以及受保护方法;其次,对于父类的私有属性,子类并不能直接访问,但是可以通过父类提供的getter和setter方法进行访问,而父类的私有方法,子类无法直接访问;还有,对于父类的包访问权限属性和方法(default),如果子类和父类在同一个包下,子类可以继承并且直接访问到,如果二者不在同一个包下,则子类无法直接访问到这些方法和属性,但是同样的可以通过父类的getter和setter方法去访问这些属性;最后一点,我们很多人其实都有疑问,子类继承父类,不是应该继承了父类的所有东西吗,为什么访问不到那些私有属性?其实这里要从内存分析来看,当我们要创建一个子类的对象时,java虚拟机会先帮我们生成对应的父类对象,因为我们都知道,在子类的构造方法中中,首行代码必须是父类构造方法的调用,即通过super关键字来调用,如果不写,则虚拟机会自动帮我们加入super()(前提是父类有无参构造方法),如果父类没有无参构造方法而有有参构造方法,那么子类的构造方法必须显性的调用父类的构造方法,否则会报错。通过这一点我们就知道在创建子类对象的时候,java虚拟机是先创建父类的对象,然后在这个父类对象的基础上加上子类特有的方法和属性,从而创建出子类对象,因此从这里我们可以得知,子类是拥有父类的所有属性和方法的,但是拥有不代表能够访问!!!父类私有的方法和对象是子类无法直接访问的,子类仅仅是拥有但访问不到!
这里补充一下特殊的情况,就是父类中的final属性和方法以及static属性和方法子类是能够继承并直接访问的,但是final的属性子类无法修改,final的方法子类无法重写,说明final修饰的方法并不具备动态绑定;而static的属性和方法会存在隐藏现象,即当子类中出现与父类static变量或者方法同名的变量或者方法时,子类的成员变量和静态方法会被隐藏,如:父类中有public static int nun = 1,而子类中有public static int num = 2,这时候用向上转型的对象(比如father father = new son(),其中father是父类,son是子类)去输出num属性会发现输出为1!static方法的隐藏理论同属性一致。如果你想调用子类的static方法和属性,你需要定义明确子类(如son son = new son())的对象去调用,从这里看出static方法和属性也不支持动态绑定!所以子类并不能重写父类的static方法。
以上是我个人对java继承一些见解,如果有补充或者修改的地方请在评论区指出来,谢谢!
知识点扩展:java中的动态绑定,是实现多态的本质,它只针对普通方法,而且仅仅是方法,不包括成员变量那些!所以说如果你用一个向上转型的父类对象去调用父类对象中的非final、非static属性,即使它对应的子类中有一样的属性,最终输出还是父类对象的属性!最后补充一点,java中除了final、static、private修饰的方法以及构造器(构造器默认为static)为静态绑定之外,其他方法皆为动态绑定。