先回顾一下, Java 面向对象的三大特性包括:封装、继承、多态。

PS:还有一些说四大特性,加了一个抽象

封装:将属性私有化,对外提供访问属性的方法,也可以不提供方法,这个特性叫做封装。

继承:

  1. 子类拥有父类对象所有的属性和方法(包括私有属性和私有方法),但是父类中的私有属性和方法子类是无法访问,只是拥有。
  2. 子类可以拥有自己属性和方法,即子类可以对父类进行扩展。
  3. 子类可以用自己的方式实现父类的方法

多态:多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。   简单得说,就是一个类有多个子类,在创建类得对象时,不同的子类,表现出来方法结果是不一致的,可以有多种形态。

现在主要探讨,子类拥有父类的所有属性和方法,包括私有属性和私有方法。

父类:

package com.entity;

/**
* @author Robert_mml
*/
public class BaseUser { public BaseUser(String name) {
this.name = name;
} public BaseUser(String name, String age) {
this.name = name;
this.age = age;
} public BaseUser() {
System.out.println("父类");
} private BaseUser getInstance() {
return new BaseUser();
} private String name; private String age; public String like; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getAge() {
return age;
} public void setAge(String age) {
this.age = age;
} public String getLike() {
return like;
} public void setLike(String like) {
this.like = like;
} public String zToString() {
return "BaseUser{" +
"name='" + name + '\'' +
", age='" + age + '\'' +
", like='" + like + '\'' +
'}';
}
}

子类:

package com.entity;

/**
* @author Robert_mml
*/
public class SysUser extends BaseUser { private String name; private String age; public String like; public SysUser(String name) {
super(name);
} public SysUser(){
System.out.println("子类");
} // @Override
private SysUser getInstance() {
return new SysUser();
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getAge() {
return age;
} public void setAge(String age) {
this.age = age;
} @Override
public String getLike() {
return like;
} @Override
public void setLike(String like) {
this.like = like;
} public String getSuperLike() {
return super.getLike();
} public void setSuperLike(String like) {
super.setLike(like);
} public String zToString() {
return "SysUser{" +
"name='" + name + '\'' +
", age='" + age + '\'' +
", like='" + like + '}' +
" BaseUser{ " + super.zToString() + '\'' +
'}' + " BaseUser{ " + super.toString() + '\'' +
'}';
} }

发现子类拥有父类的私有属性时,子类已经可以自己拥有这些私有属性。并不会出现冲突。子类使用 @Override 标识相同的私有方法时,也会报错。

从这些看来,子类似乎不拥有父类的私有属性。

根据相关资料, 子类创建时,是会先创建一个父类对象,父类对象外层是一个子类,子类包含父类,在外层是子类的独有方法。

当子类和父类拥有相同名称的public属性,使用 @Override 标识依然报错,可以猜测,子类和父类,属性是在不同的内存空间。

Main:

package com.entity;

public class Main {

    public static void main(String[] args) {

        SysUser sysUser = new SysUser();

        sysUser.setLike("乒乓球");
sysUser.setSuperLike("羽毛球");
System.out.println(sysUser.toString());
System.out.println(sysUser.zToString());
} }

结果:

父类
子类
com.entity.SysUser@7cd84586
SysUser{name='null', age='null', like='乒乓球} BaseUser{ BaseUser{name='null', age='null', like='羽毛球'}'} BaseUser{ com.entity.SysUser@7cd84586'}

可以看出,父类的内存空间,是在子类上。

说明,父类在初始化时,是在子类的内存空间上进行初始化的,但是并没有创建一个真正的实例,但是子类属性是跟父类分开的。

PS:当把父类的无参构造方法去掉,仅保留有参构造方法时, 子类必须实现一个相同的有参构造方法,不实现会报错。

  当父类拥有多个构造方法,子类只需要实现其中一种即可。

Java 继承父类子类内存分配解释:

https://blog.csdn.net/smithdoudou88/article/details/12756187

探讨 java 的三大特性之一:继承的更多相关文章

  1. 【转】java提高篇(二)-----理解java的三大特性之继承

    [转]java提高篇(二)-----理解java的三大特性之继承 原文地址:http://www.cnblogs.com/chenssy/p/3354884.html 在<Think in ja ...

  2. Java 浅析三大特性之一继承

    上文Java 浅析三大特性之一封装我们说到Java是一个注重编写类,注重于代码和功能复用的语言.Java实现代码复用的方式有很多,这里介绍一个重要的复用方式--继承. 在介绍继承之前,我们要明确一点, ...

  3. java提高篇(二)-----理解java的三大特性之继承

    在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...

  4. java提高篇(二)-----理解java的三大特性之继承

    在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...

  5. (转)java提高篇(二)-----理解java的三大特性之继承

    在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...

  6. java基础(二)-----java的三大特性之继承

    在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...

  7. Java的三大特性之继承

    此处我会分为这几个部分来理解继承是怎么样的: 1.区分封装.继承和多态 2.区分限定词的范围 3.区分隐藏.覆盖.重载 4.继承的理解 5.一道面试题的原型 --------------------- ...

  8. java面向对象三大特性之继承

    通过重用已经测试并验证通过的代码,怎样才减少开发工作,所有开发团队都在为一问题而努力.一个久经考验的方法是通过有效地使用Java继承优化应用程序开发. 继承的从某种意义上讲,继承的短暂美就如同宇宙中所 ...

  9. 深入理解Java面向对象三大特性 封装 继承 多态

    1.封装 封装的定义: 首先是抽象,把事物抽象成一个类,其次才是封装,将事物拥有的属性和动作隐藏起来,只保留特定的方法与外界联系 为什么需要封装: 封装符合面向对象设计原则的第一条:单一性原则,一个类 ...

随机推荐

  1. 【转载】Combination Sum

    Combination Sum Given a set of candidate numbers (C) and a target number (T), find all unique combin ...

  2. iOS runtime整理

    iOS利用Runtime自定义控制器POP手势动画 http://www.cocoachina.com/ios/20150401/11459.html  Objective C运行时(runtime) ...

  3. JVM问题诊断

    https://gitbook.cn/books/5d2d822f175a450263e945f9/index.html

  4. Git的提交与查看差异

    本文转载于:http://blog.csdn.net/crylearner/article/details/7685158 代码提交 代码提交一般有五个步骤: 1.查看目前代码的修改状态 2.查看代码 ...

  5. phpstudy2016安装redis扩展

    第一步:查看phpstudy版本 第二步:查看phpinfo信息,看Architecture所属类型. 第三步:下载redis扩展 去http://windows.php.Net/downloads/ ...

  6. NLP --- 条件随机场CRF详解 重点 特征函数 转移矩阵

    上一节我们介绍了CRF的背景,本节开始进入CRF的正式的定义,简单来说条件随机场就是定义在隐马尔科夫过程的无向图模型,外加可观测符号X,这个X是整个可观测向量.而我们前面学习的HMM算法,默认可观测符 ...

  7. 洛谷P2146 [NOI2015]软件包管理器 题解 树链剖分+线段树

    题目链接:https://www.luogu.org/problem/P2146 本题涉及算法: 树链剖分: 线段树(区间更新及求和,涉及懒惰标记) 然后对于每次 install x ,需要将 x 到 ...

  8. iptables [match] 常用封包匹配参数

    参数 -p, --protocol 范例 iptables -A INPUT -p tcp 说明 匹配通讯协议类型是否相符,可以使用 ! 运算符进行反向匹配,例如: -p !tcp 意思是指除 tcp ...

  9. [转]SpringBoot整合Swagger2以及生产环境的安全问题处理

    1.创建springboot项目 https://www.cnblogs.com/i-tao/p/8878562.html 这里我们使用多环境配置: application-dev.yml(开发环境) ...

  10. mysql 第二课 DML操作

    DML 数据操纵语句:INSERT UPDATE DELETE SELECT 主要用来对数据库的数据进行一些操作; DCL 数据定义语句:CREATE ALTER DROP  主要是用在定义或改变表的 ...