我们都知道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)为静态绑定之外,其他方法皆为动态绑定。

关于java中的继承的更多相关文章

  1. 关于Java中的继承和组合的一个错误使用的例子

    [TOC] 关于Java中的继承和组合的一个错误使用的例子 相信绝大多数人都比较熟悉Java中的「继承」和「组合」这两个东西,本篇文章就主要就这两个话题谈论一下.如果我某些地方写的不对,或者比较幼稚, ...

  2. java中的继承与oc中的继承的区别

    为什么要使用继承? 继承的好处: (1)抽取出了重复的代码,使代码更加灵活 (2)建立了类和类之间的联系 继承的缺点: 耦合性太强 OC中的继承 1.OC中不允许子类和父类拥有相同名称的成员变量名:( ...

  3. <Java中的继承和组合之间的联系和区别>

    //Java中的继承和组合之间的联系和区别 //本例是继承 class Animal { private void beat() { System.out.println("心胀跳动...& ...

  4. Java中的继承

    我们在以前的学习中,我们会了C#中的继承,今天我们来了解了解Java中的继承,其实都大同小异啦! 1.语法 修饰符 SubClass extends SuperClass(){ //类定义部分 } e ...

  5. extends:类似于java中的继承特征,extends="struts-default"

    extends:类似于java中的继承特征,extends="struts-default"就是继承struts-default.xml,它里面定义了许多跳转类型.拦截器等一些常用 ...

  6. Java中的继承、封装、多态的理解

    Java中的继承.封装.多态 继承的理解: 1.继承是面向对象的三大特征之一,也是实现代码复用的重要手段.Java的继承具有单继承的特点,每个子类只有一个直接父类. 2.Java的继承通过extend ...

  7. 浅析 Java 中的继承和重写

    浅析 Java 中的继承和重写 Java 中的构造方法不能被继承. Java 中 static 修饰的方法可以被继承,但不能被子类重写. Java 中 final 修饰方法不允许被子类重写,但是可以被 ...

  8. java中的继承关系

    1.定义 java中的继承是单一的,一个子类只能拥有一个父类:java中所有类的父类是java.lang.Object,除了这个类之外,每个类只能有一个父类: 而一个父类可以有多个子类,可以被多个子类 ...

  9. java中子类继承父类程序执行顺序

    java中子类继承父类程序执行顺序 FatherTest.java public class FatherTest { private String name; public FatherTest() ...

随机推荐

  1. Monthly Expense POJ 二分

    Description Farmer John is an astounding accounting wizard and has realized he might run out of mone ...

  2. 2015 测试赛 同构 hihoCoder

    题目1 : 同构 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定2个树A和B,保证A的节点个数>=B的节点个数. 现在你需要对树A的边进行二染色. 一个好的染色 ...

  3. volatile非原子性的示例

    volatile非原子性的示例 package com.stono.thread2.page124; public class MyThread extends Thread { volatile p ...

  4. UVa 10693 - Traffic Volume

    題目:車速為v,車之間的距離最少為v^2/(2f)(防止裝車),車長為L,問1小時最多能走過幾輛車. 分析:數學.物理.             根據題意能够列出方程:nL + (n-1)d = nL ...

  5. 使用Carthage安装及使用第三方库

    CocoaPods 安装不了,只好使用Carthage 参考:http://www.jianshu.com/p/52dff4cef8a2 http://www.jianshu.com/p/bf263c ...

  6. mysql20170404代码实现

    CREATE DATABASE IF NOT EXISTS school; USE school; CREATE TABLE tblStudent( StuId ) NOT NULL PRIMARY ...

  7. JS中split使用方法和数组中元素的删除

    JS中split使用方法和数组中元素的删除 JS中split使用方法 <script language="javascript"> function spli(){ d ...

  8. C++中的inline的用法

    C++中的inline的用法  参考:http://www.cnblogs.com/fnlingnzb-learner/p/6423917.html 1. 引入inline关键字的原因 在c/c++中 ...

  9. C++_class_powerpoint_1.2

    用英文编写(复制黏贴)果然比较吃力啊,果然还是要写中文. Expressions and Statements Operator summary Scope resolution   class::m ...

  10. C++ 单例模式(读书笔记)

    #include <iostream> class Singleton {    static Singleton s;    int i;    Singleton(int x):i(x ...