先回顾一下, 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. 2016 Asia Jakarta Regional Contest L - Tale of a Happy Man UVALive - 7722

    UVALive - 7722 一定要自己做出来!

  2. python 成员

    一.成员 1.实例变量 对象.属性=xxxx class Person: def __init__(self,name,id,gender,birth): self.name = name self. ...

  3. HDU 5584 LCM Walk【搜索】

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5584 题意: 分析: 这题比赛的时候卡了很久,一直在用数论的方法解决. 其实从终点往前推就可以发现, ...

  4. 关于使用JavaMail发送邮件

    import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import javax.activati ...

  5. 云原生生态周报 Vol. 8 | Gartner 发布云原生趋势

    业界要闻 Gartner 发布云原生基础设施未来的八大趋势:权威分析机构 Gartner 在对 2020 年技术趋势的展望当中指出:“预计2020年所有领先的容器管理软件均内置服务融合技术,到2022 ...

  6. 阿里云智能数据构建与管理 Dataphin公测,助力企业数据中台建设

    阿里云智能数据构建与管理 Dataphin (下简称“Dataphin”)近日重磅上线公共云,开启智能研发版本的公共云公测!在此之前,Dataphin以独立部署方式输出并服务线下客户,已助力多家大型客 ...

  7. console.log详细介绍

    console.log详细介绍 效果图: 代码如下: console.log("%c hello world!:http://www.baidu.com","color: ...

  8. DOMjudge配置

    DOMjudge配置补充 系统环境为 Debbian GNU/Linux 9 (stretch) 64-bit 在Web server configuration中, ln -s etc/apache ...

  9. Node.js 安装及环境配置 以及google浏览器安装插件并使用

    一.安装环境 1.本机系统:Windows 10 企业版(64位)2.Node.js:node-v10.16.0-x64.msi(64位) 二.安装Node.js步骤 1.下载对应自己系统对应的 No ...

  10. C# 判断两条直线距离

    本文告诉大家获得两条一般式直线距离 一般式的意思就是 Ax+By+C=0" role="presentation">Ax+By+C=0Ax+By+C=0 如果有两个 ...