文档章节

java继承:父类和子类的关系

上官胡闹
 上官胡闹
发布于 2016/10/23 20:05
字数 1026
阅读 99
收藏 1

继承是java实现多态的一个重要元素之一,本文主要是自我学习了解java继承中父类和子类的关系。下面看父类和子类的源码

父类:

public class Parent {
    //公有属性
    private int a = 5;
    //公有属性b
    public int b = 10;
    //公有属性c
    public int c = 10;

    //静态代码块
    static {
        System.out.println("parent static");
    }
    //非静态代码块
    {
        System.out.println("Non-static block from Parent");
    }
    //构造方法
    public Parent(){
        System.out.println("Parent init constructor");
    }
    //获取私有属性a的值
    public int getA(){
        return a;
    }
    //公有方法
    public void say(){
        System.out.println("hello i am parent");
    }

}

子类:

public class Son extends Parent {
    //子类私有属性
    private int a = 6;
    //子类覆盖了父类的属性b
    public int b = 20;

    //子类的静态代码块
    static {
        System.out.println("Son static");
    }
    //子类非静态代码块
    {
        System.out.println("Non-static block from Son");
    }
    //子类的构造方法
    public Son(){
       // super();
        System.out.println("Son constructor");
    }
    //子类覆盖了父类的say方法
    @Override
    public void say() {
        System.out.println("I am son");
    }
    public int getA(){
        return a;
    }
    //子类新定义的方法
    public int getH(){
        return 5;
    }
}

用例1(父类引用指向子类对象)测试执行顺序:

本例主要测试父类和子类中静态代码块、非静态代码块、构造函数的执行顺序

public static void main(String[] args) {
       Parent parent = new Son();

}
//输出结果
parent static
Son static
Non-static block from Parent
Parent init constructor
Non-static block from Son
Son constructor

从运行结果可以看出执行顺序:父类静态代码块-子类静态块-父类非静态块-父类构造方法-子类非静态代码块-子类构造方法

因此可以得出结论:对于普通类代码的执行顺序为【静态代码块-非静态代码块-构造方法】;对于父子类继承关系的类, 无论是父类引用指向子类对象还是子类引用指向自身对象代码的执行顺序都为【父类静态代码块-子类静态块-父类非静态块-父类构造方法-子类非静态代码块-子类构造方法】,总之先执行父类的静态代码块然后紧跟着执行子类的静态代码块,其他的保持不变

注意:如果main方法在子类中时即便是父类引用指向父类对象也会执行子类中的静态 代码块,子类中的其他则不执行

用例2(父类引用指向子类对象)测试父子类对象中属性方法的执行情况:

public class Test {
    public static void main(String[] args) {
        Parent parent = new Son();
        parent.say();
        System.out.println(parent.getA());
        System.out.println(parent.b);
        System.out.println(parent.c);

    }
}
//测试结果,前面已经分析过一些,主要看后四项
parent static
Son static
Non-static block from Parent
Parent init constructor
Non-static block from Son
Son constructor
I am son
6
10
10

得出结论如下:

1、若子类覆盖了某方法,则父类引用调用子类重新定义的新方法

2、若子类未覆盖某方法,则父类引用调用父类本身的旧方法

3、若子类覆盖了某属性,但父类引用仍调用父类本身的旧属性

4、若子类未覆盖某属性,则父类引用调用父类本身的旧属性

5、父类引用不能访问子类新定义的方法

用例3(子类引用指向自身对象)测试父子类对象中属性方法的执行情况:

public class Test {
    public static void main(String[] args) {
        Son parent = new Son();
        parent.say();
        System.out.println(parent.getA());
        System.out.println(parent.b);
        System.out.println(parent.c);
        System.out.println(parent.getH());

    }
}
//执行结果
parent static
Son static
Non-static block from Parent
Parent init constructor
Non-static block from Son
Son constructor
I am son
6
20
10
3

得出结论如下:

1、若子类覆盖了某方法,则子类引用调用子类重新定义的新方法

2、若子类未覆盖某方法,则子类引用调用父类本身的旧方法

3、若子类覆盖了某属性,则子类引用调用子类重新定义的新属性

4、若子类未覆盖某属性,则子类引用调用父类本身的旧属性

5、子类引用可以访问子类新定义的方法

 

© 著作权归作者所有

上官胡闹
粉丝 56
博文 83
码字总数 59747
作品 1
成都
程序员
私信 提问
Java编程学习:继承的概念及方法

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰
2018/05/30
0
0
【Java】疯狂Java基础(一)——面向对象的特征:继承、封装和多态

一、前言 小编记得,刚接触计算机相关的课程的时候,接触的是c++,c++的老师一上来就说c++是面向对象的,c语言是面向过程的。面向对象比面向过程厉害,是从面向过程发展过来的的。 当时有一个...

kisscatforever
2018/03/28
0
0
初探设计:Java继承何时用?怎么用?

Writer :BYSocket(泥沙砖瓦浆木匠) 一、回顾继承 常见的如下: 1、依赖(”uses-a“) 2、聚合(”has-a“) 3、继承(”is-a“)类之间关系 也就是UML类图中常见的三种关系,另外常见的还...

泥沙砖瓦浆木匠
2015/11/12
0
2
Java面向对象概述及三大特征(封装,继承和多态)

一、面向对象思想 Java是面向对象的高级语言,对于Java语言来说,万事万物皆对象! 它的基本思想是使用类,对象,继承,封装,消息等基本概念进行程序设计。面向对象程序的最小单元是类,类代...

编辑之路
01/10
0
0
Objective-C类和Java类

1.类的定义 Objective-C类 @interface Circle:NSObject{int fillColor;int bounds;} (void)setFillColor:(int)fillColor; (void)setBounds:(int)bounds; (void)draw; @end// Circle 类接口部......

malawo
2012/11/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

通过微服务来正确实施SOA

对于组织来说,能够构建、发展和扩展大型应用程序是至关重要的, 但所涉及的挑战使其成为一项艰巨的任务。正因为如此, 微服务凭借能够将单个组件拆分成围绕特定业务功能的独立服务,已成为构建...

Linux就该这么学
25分钟前
2
0
从 Spark 到 Kubernetes — MaxCompute 的云原生开源生态实践之路

2019年5月14日,喜提浙江省科学技术进步一等奖的 MaxCompute 是阿里巴巴自研的 EB 级大数据计算平台。该平台依托阿里云飞天基础架构,是阿里巴巴在10年前做飞天系统的三大件之分布式计算部分...

阿里云官方博客
29分钟前
1
0
使用python来操作redis用法详解

1、redis连接 redis提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令,Redis是StrictRedis的子类,用于向后兼容旧版本的red...

dragon_tech
29分钟前
2
0
给研发工程师的代码质量利器 | SOFAChannel#5 直播整理

> SOFA:Channel,有趣实用的分布式架构频道。 > > 本文根据 SOFAChannel#5 直播分享整理,主题:给研发工程师的代码质量利器 —— 自动化测试框架 SOFAActs。 > > 回顾视频以及 PPT 查看地址...

SOFAStack
31分钟前
1
0
段错误总结

https://blog.csdn.net/e_road_by_u/article/details/61415732 一、段错误是什么 一句话来说,段错误是指访问的内存超出了系统给这个程序所设定的内存空间,例如访问了不存在的内存地址、访问...

悲催的古灵武士
32分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部