先回顾一下, 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. React Native错误汇总(持续更新)

    错误1 Element type is invalid-: 错误描述: Element type is invalid: expected a String(for built-in componen ...

  2. Python基础:02数字

    1:Python标准整数类型等价于C的(有符号)长整型.整数一般以十进制表示,但是Python也支持八进制或十六进制来表示整数.八进制整数以数字“0”开始, 十六进制整数则以“0x”或“0X”开始. ...

  3. Celery后台任务

    Celery 在程序运行过程中,经常会遇到一些耗时耗资源的任务,为了避免这些任务阻塞主进程的运行,我们会采用多线程或异步任务去处理.比如在Web中需要对新注册的用户发一封激活邮件来验证账户,而发邮件本 ...

  4. 同一个C语言工程不同C文件之间的函数互相调用问题

    定义一个function.h文件来声明这些函数: //#ifndef __FUNCTION_H__//#define __FUNCTION_H__   int fun(int,int);   int ...

  5. 检查进程启动情况,开始时间、启动时间、启动进程数、进程数是否正确、PID

    #!/bin/sh bin=$(cd ``;pwd) cd ${bin} ### 定义检查函数 chk(){ programName=$ correctNum=$ programSubName=$ # ...

  6. hdu 1532 Drainage Ditches(最大流模板题)

    Drainage Ditches Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  7. Spring MVC 解决 Could not write JSON: No serializer found for class java.lang.Object

    Spring MVC 解决 Could not write JSON: No serializer found for class java.lang.Object 资料参考:http://stack ...

  8. 2018-9-1-win10-uwp-轻量级-MVVM-框架入门-2.1.5.3199

    title author date CreateTime categories win10 uwp 轻量级 MVVM 框架入门 2.1.5.3199 lindexi 2018-09-01 16:24: ...

  9. 获取checkbox返回值

    <div class="checkbox"> <label> <input type="checkbox" value=" ...

  10. PHP利用纯真IP数据库在本地实现IP地址信息查询

    https://blog.csdn.net/myweishanli/article/details/45098693 准备工作: 建议本地IP地址数据库,请到http://www.cz88.net/这 ...