在上节博客中曾提到过类的继承,这篇文章主要是介绍类的继承、构造函数以及静态代码块的执行顺序。

首先接着分析在黑马基础测试中的一个关于继承的题目,题目描述如下:

声明类Person,包含2个成员变量:name、age。定义函数sayHello(),调用时输出:我叫***,今年***岁了。声明类Chinese继承Person。

这是一个很基础的题,第一步要构建一个父类:Person,Person包含name、age属性,已经一个成员方法sayHollo()。具体实现如下:

class Person{//建立父类

public int age;

public String name;

void sayHello(){

System.out.println("我叫"+this.name+",今年"+this.age+"岁了。");

}

}

第二步建立子类:

class Chinese extends Person{//子类继承父类,包括同名属性以及方法

public Chinese() {//自定义无参构造方法,当new该类时运行

name="月芽之上";

age=23;

this.sayHello();//调用父类成员方法

}

}

调用方法如下:

Chinese ch=new Chinese();//建立Chinese实例对象。

建立子类的对象,并开辟堆内存。子类在机场父类时会继承父类的属性以及方法。所以在子类中也有name、age属性,同样子类也有父类的sayHello方法。子类中在给父类属性赋值的时候会覆盖父类的方法(关于覆盖与重写在后续的博客中进行分析),而在new Chinese()时会自动调用Chinese的无参构造方法所以父类的name的值就变为 name="月芽之上",age=23,然后通过this调用当前实例对象的sayHello方法,而这时又会调用父类已经定义了的sayHello方法。值得注意的是,如果子类重写了父类的方法的话,就不会再去调用父类的方法,这是一个常识但是也经常会出错,希望日后自己不会犯这样的错误。

接下来分析第二个例子。

题目描述:

、建立一个Cat父类,包含name、age属性,无参构造函数、有一个参数的构造函数,以及get,set方法

、建立子类HelloKitty,继承Cat,子类包含静态代码块、无参构造方法、一个参数的构造方法。具体程序描述如下:

public class Cat {

private String name;

private String age;

static {

System.out.println("这个基本上是最难得继承题");

}

public Cat() {

System.out.println("父类无参构造");

}

public Cat(String name) {

this.name = name;

System.out.println("父类cat构造方法");

}

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 class HelloKitty extends Cat {

static {

System.out.println("你猜我在哪里执行");

}

public HelloKitty(String name) {

super(name);

System.out.println("子类构造器有参方法");

}

public HelloKitty() {

System.out.println("我执行子类无参构造函数");

}

}

测试方法1:

Cat cat = new Cat();

System.out.println(cat.getAge());

执行过程分析:

建立父类对象并指向父类的引用,在new Cat()时会自动调用Cat的无参构造函数,而静态代码块优于构造方法而执行,因此结果如下:

这个基本上是最难得继承题                     父类静态代码块

父类cat构造方法                            父类无参构造函数

Null                                     字符串初始值为null

测试方法2:

Cat cat = new HelloKitty();

System.out.println(cat.getAge());

执行过程分析:

建立父类对象指向子类的引用,在new HelloKitty()会调用子类的无参构造函数,而在执行子类无参构造函数之前会调用父类的无参构造函数,而静态代码块是由于构造函数的,因此第一步先执行父类的静态代码块,第二步执行子类的静态代码块,第三步执行父类的无参构造函数,第四步执行子类无参构造函数,第五步调用getAge()方法。

这个基本上是最难得继承题            父类静态代码块

你猜我在哪里执行                     子类静态代码块

父类无参构造                        父类无参构造函数

我执行子类无参构造函数                子类无参构造函数

Null                                字符串初始值为null

测试方法3:

Cat cat = new HelloKitty("helloKitty");

System.out.println(cat.getAge());

执行过程分析:

建立父类对象指向子类的引用,在new HelloKitty("helloKitty")会调用子类的有参构造函数,而子类带参数的构造函数中调用了父类的带参数的构造函数,因此先执行父类的静态代码块,然后执行子类静态代码库,然后执行父类带参数的构造函数,然后执行子类的带参数的构造方法,最后调用getAge()方法。

这个基本上是最难得继承题            父类静态代码块

你猜我在哪里执行                     子类静态代码块

父类cat构造方法                    父类带参数构造函数

子类构造器有参方法                    子类带参数构造函数

Null                                字符串初始值为null

到此,关于继承、构造函数、静态代码块的执行顺序相关知识点介绍完毕,谢谢您的阅读。

三、Java基础---------关于继承、构造函数、静态代码块执行顺序示例讲解的更多相关文章

  1. 【Java基础】继承中的代码块和构造方法的执行顺序探索

    本文讲述有关一个类的静态代码块,构造代码块,构造方法的执行流程问题.首先来看一个例子 /** * Created by lili on 15/10/19. */ class Person{ stati ...

  2. Java中普通代码块,构造代码块,静态代码块执行顺序

    //执行顺序:(优先级从高到低.)静态代码块>mian方法>构造代码块>构造方法. 其中静态代码块只执行一次.构造代码块在每次创建对象是都会执行. 1 普通代码块 1 //普通代码块 ...

  3. Java--普通代码块静态代码块执行顺序

    class B { public B() { super(); System.out.println("构造器B"); } { System.out.println("普 ...

  4. Java 基础 面向对象之关键字内部类代码块修饰符

    final final概念 继承的出现提高了代码的复用性,并方便开发.但随之也有问题,有些类在描述完之后,不想被继承,或者有些类中的部分方法功能是固定的,不想让子类重写.可是当子类继承了这些特殊类之后 ...

  5. java中静态代码块初始化顺序

    (一)java 静态代码块 静态方法区别    一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下, ...

  6. Java静态代码块、构造代码块执行顺序问题

    package com.zxl.staticdemo; public class BlockTest { static { System.out.println("BlockTest静态代码 ...

  7. java代码块执行顺序

    父类 public class Father { public Father() { System.out.println("父类构造PUBLIC father"); } stat ...

  8. java 子类、父类中静态代码块、字段,非静态代码块、字段以及构造函数的初始化顺序和次数

    一个类中的数据初始化顺序是面试官非常喜欢出的面试题之一,本文用一个实例来介绍java中子类.父类中静态代码块.字段,非静态代码块.字段以及构造函数的执行顺序和次数. 一.包结构

  9. java面试基础题------》Java 中的父子类静态代码块,代码块,构造方法执行顺序

    4.指出下面程序的运行结果. class A { static { System.out.print("1"); } public A() { System.out.print(& ...

随机推荐

  1. php-001-win7 环境下 wamp 的至简部署

    此文主要记录学习 PHP 开发环境 wamp 的至简部署.敬请各位小主参阅,若有不足之处,敬请大神指正,不胜感激! 首先依据自身的操作系统选择,进入 wamp 的网站 :http://www.wamp ...

  2. Opencv + vs2012环境配置

    首先获得最新的Opencv 2.4.10源码:opencv源码下载 一.Opencv环境变量配置 1.将源码安装到制定目录: 2.为Opencv 添加环境变量:计算机-->属性 点击高级系统设置 ...

  3. ByteBuffer

    1.堆内:HeapByteBuffer,在java的堆内创建. 缺点:可能引起堆的不断gc 写文件的时候需要先将堆的buffer写进直接buffer里,然后再写入文件 2.堆外:DirectByteB ...

  4. cssHack

    cssHack 不同的浏览器,比如Internet Explorer 6,Internet Explorer 7,Mozilla Firefox等,对CSS的解析认识不一样,因此会导致生成的页面效果不 ...

  5. [代码片段]读取BMP文件

    文件名mybmp.c //实现了读取24位BMP文件,还有一些测试信息 //定义mybmp.c里面用到的函数和相关头文件.常量 //参考了网友sailinghz在CSDN论坛的帖子:http://bb ...

  6. flex box 布局

    .box{ display:flex; } .box { display: inline-flex; } .box { display:-webkit-flex; display: flex; } f ...

  7. Android 在Windows上安装FFmpeg程序

    FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.它提供了录制.转换以及流化音视频的完整解决方案.它包含了非常先进的音频/视频编解码库libavcodec. 该程序 ...

  8. java中清空session

    session.removeAttribute("sessionname")是清除SESSION里的某个属性.     session.invalidate()是让SESSION失 ...

  9. EF Code First教程-02 约定配置

    示例: public class Phone { [Key] //主键 public int Id { get; set; } [Required] //不能为空 [MinLength(),MaxLe ...

  10. linux type命令用法_转

    转自:http://codingstandards.iteye.com/blog/831504 在脚本中type可用于检查命令或函数是否存在,存在返回0,表示成功:不存在返回正值,表示不成功. $ t ...