我总是记不住继承是怎么个机制,今天我来彻底的总结一下。

先了解一下初始化的顺序

当程序执行时,需要生成某个类的对象,java执行引擎会先检查是否加载了这个类,如果没有加载,则先执行类的加载再生成对象,如果已经加载,则直接生成对象。

类加载的过程中,类的static成员变量会被初始化,类的static语句块会被执行。

java中类是按需加载,只有当用到这个类的时候才会加载这个类,并且只会加载一次

看看这个例子

public classT{public static voidmain(String[] args){

Shape shape1= newShape();

Shape shape2= newShape();

}

}classShape{static{

System.out.println("static is cout");

}publicShape(){

System.out.println("shape is cout");

}

}

会输出什么?

staticis cout

shape is cout

shape is cout

View Code

解释:在类加载时会执行static块,而且只执行一次。创建了两个Shape实例,所以shape的构造器被调用两次

再来看看

在生成对象的过程中,会先初始化对象的成员变量,然后再执行构造器。

public classT{public static voidmain(String[] args){newCircle();

}

}classShape{publicShape(){

System.out.println("shape is cout");

}

}classCircle{publicCircle(){

System.out.println("circle is cout");

}

Shape shape=newShape();

}

结果:

shape is cout

circle is cout

View Code

上面标记的字体已经解释清楚了,这里并没有用继承,想想circle继承shape会有什么不一样呢。

(偷偷的告诉你,会输出 shape is cout \n  shape is cout \n   circle is cout \n;因为构造circle前先构造Shape,输出第一句。然后初始化shape对象,调用Shape,输出第二句话。然后调用Circle的构造函数)

为了看是否真的清楚了,我出一个题目

public classT{public static voidmain(String[] args){newCircle();

}

}classRudio{publicRudio(String type){

System.out.println(type+" Rudio is cout");

}

}classShape{private Rudio r=new Rudio("shape");publicShape(){

System.out.println("shape is cout");

}

}class Circle extendsShape{publicCircle(){

System.out.println("circle is cout");

}private Rudio r=new Rudio("circle");

}

shape Rudio is cout

shape is cout

circle Rudio is cout

circle is cout

View Code

如果不能看懂,说明还要琢磨琢磨

再来看看下面这个例子

public classTest{public static voidmain(String[] args){

Shape shape=newCircle();

System.out.println(shape.name);

System.out.println(shape.age);

shape.printType();

shape.printName();

}

}classShape{public String name="shape";public static int age=10;publicShape(){

System.out.println("shape 的构造器");

}public voidprintType(){

System.out.println("this type shape");

}public static voidprintName(){

System.out.println("this name shape");

}

}class Circle extendsShape{public String name="Circle";public static int age=18;publicCircle(){

System.out.println("Circle 的构造器");

}public voidprintType(){

System.out.println("this type Circle");

}public static voidprintName(){

System.out.println("this name Circle");

}

}

想想结果是什么?

shape的构造器

Circle的构造器

shape10

thistype Circlethis name shape

View Code

解释一下:

创建了一个父类类型的子类实例,因此,shape中的变量是Shape中的变量。如果子类覆盖了父类的方法,调用子类的方法。如果父类某个方法加了static,final关键字,那么父类的该方法对子类隐藏,即使子类有同名方法,那依然是子类自己的方法,与父类无关。

先调用shape的构造器和Circle的构造器没什么疑问,然后输出shape和10,告诉我们shape的成员是从Shape获得。由于子类覆盖了父类的printType方法,因此调用该方法输出的是this type Circle。由于printName方法使用了static变量,对子类隐藏了,所以输出this name shape

其实这总结出来三句话

1、父类的构造器调用以及初始化过程一定在子类的前面

2、类中的变量会在任何方法调用之前得到初始化

3、子类覆盖父类,会调用子类的方法;父类成员和方法如果是static,final的会隐藏子类的同名成员和方法

再来看看这个

public classT{public static voidmain(String[] args){

Circle circle=newCircle();

System.out.println(circle.name);

System.out.println(circle.age);

circle.printType();

circle.printName();

}

}classShape{public String name="shape";public static int age=10;publicShape(){

System.out.println("shape 的构造器");

}public voidprintType(){

System.out.println("this type shape");

}public static voidprintName(){

System.out.println("this name shape");

}

}class Circle extendsShape{public String name="Circle";public static int age=18;publicCircle(){

System.out.println("Circle 的构造器");

}public voidprintType(){

System.out.println("this type Circle");

}public static voidprintName(){

System.out.println("this name Circle");

}

}

想想运行结果

shape的构造器

Circle的构造器

Circle18

thistype Circlethis name Circle

View Code

这是故意让你们明白究竟是怎么构造的

最后再总结一下

1、创建子类时会先创建父类

2、创建类时,最先是给类中成员变量初始化,然后才是调用构造函数

3、父类中加了static和final的方法会对子类隐藏。父类和子类同名的方法会被覆盖,被隐藏了的方法除外。

java继承circle类_java的继承相关推荐

  1. java 继承接口语法_java的继承、接口方面的语法及知识

    继承(inheritance):一个类只能继承一个类 代码复用 继承的语法: class ChildClass extends ParentsClass{ } 父类的属性子类中都存在,只是有没有权限访 ...

  2. Java怎么用继承回复信息_JAVA面向对象-继承

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Java继承: 1.继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类.继承可以理解为一个对象从另一个对象获取属性的过程. 2.如果类 ...

  3. 定义一个名为Cylinder类表示圆柱,它继承Circle类

    这里写目录标题 题目描述: Circle类 运行结果 Cylinder类 运行结果 题目描述: (1)定义一个名为Circle的类表圆,其中含有double型的成员变量centerX.centerY表 ...

  4. java声明像素的继承_15、Java语言的类间的继承关系是

    [判断题]中心原子中的几个原子轨道杂化时,必形成数目相同的杂化轨道. [填空题]3.在JAVA语言中,每个英文字符占 个字节,每个中文汉字占( )个字节. [填空题]在Java语言中,使用______ ...

  5. java常用class类_java常用类

    java常用类 内部类 1.成员内部类:在一个类的内部定义一个完整的类 例如:外部类public class Body{ 内部类class Header{ } } 内部类可以直接访问外部类的私有成员, ...

  6. java的Teacher类_java类的继承 - osc_tauwfamo的个人空间 - OSCHINA - 中文开源技术交流社区...

    类的继承是类的一个重要概念,通过类的继承子类可以继承父类的属性和方法,提高代码的复用性. eg: //** *创建一个父类Teacher,父类有两个属性name,age,两个方法sleep(),tea ...

  7. java中继承applet类_java.applet.Applet类

    1.applet是一种不能单独运行但可嵌入在其他应用程序中的小程序 2.该类直接继承于java.awt.Panel类,其直接子类为javax.swing.JApplet 3.常用方法 public U ...

  8. java继承多个类_java 可不可以继承多个类

    1,java是不可以继承多个类,java是单继承的,但是java通过接口可以实现多继承 2,也就是说,一个java类只能继承一个父类,但可以有多个接口. 3,若子类继承的父类中拥有相同的成员变量,子类 ...

  9. java 不能继承的类_java什么类不能被继承

    在java中有一些类并不能被继承,我们可以通过这些不能继承的类设计一些只读的不可变类.Java中不能被继承的类有哪些? 在Java中,只要是被定义为final的类,也可以说是被final修饰的类,就是 ...

最新文章

  1. MapReduce的并行执行效率
  2. 【机器学习】决策树代码练习
  3. Crontab使用详解
  4. 解密:LL与LR解析 2(译,完结)
  5. 虚拟dom_从0到1实现一个虚拟DOM
  6. 海口交警入驻百度地图交通云平台 市民可实时查询实景路况
  7. SQL 审核系统体验
  8. mysqlbinlog结合sed命令恢复update时未加where条件之前的数据
  9. 多线程之同步synchronized的使用不当造成java.lang.IllegalMonitorStateException 异常
  10. python import as 实例化_python中import list,dictionary常量在class实例化时遇到的坑
  11. Oracle数据库的下载与安装教程详解
  12. 行政区域村级划分数据库_最新行政区划省市区街道乡镇数据库 每月更新版
  13. Insecure Direct Object References
  14. java程序员昵称_那些神秘的Java程序员
  15. 开源spider一览(zz)
  16. Stochastic Weight Averaging (SWA) 随机权重平均
  17. Debian安装中文输入法
  18. Neo4j 完整版安装——neo4j-3.5.6
  19. 扭曲的空间和扭曲的能量场
  20. 2多线程之龟兔赛跑案例

热门文章

  1. Go大型项目实战:项目结构、配置管理、API设计
  2. 《微服务架构设计模式》总结,文末送书
  3. 【免费活动】解析腾讯云音视频通信三大核心网络技术实战与创新
  4. 视频加速方案的最优解 - Xilinx硬件加速技术专场(深圳站)
  5. FFmpeg优化 苏宁PP体育视频剪切效率提升技巧
  6. 视频直播:实时数据可视化分析
  7. 由STGW下载慢问题引发的网络传输学习之旅
  8. Serverless.com CEO首次访华!探讨无服务器技术落地
  9. IO虚拟化——Intel VT-d原理
  10. 根据这博客复习,我收到了BAT等大厂的技术岗offer