三、Java基础---------关于继承、构造函数、静态代码块执行顺序示例讲解
在上节博客中曾提到过类的继承,这篇文章主要是介绍类的继承、构造函数以及静态代码块的执行顺序。
首先接着分析在黑马基础测试中的一个关于继承的题目,题目描述如下:
声明类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基础---------关于继承、构造函数、静态代码块执行顺序示例讲解的更多相关文章
- 【Java基础】继承中的代码块和构造方法的执行顺序探索
本文讲述有关一个类的静态代码块,构造代码块,构造方法的执行流程问题.首先来看一个例子 /** * Created by lili on 15/10/19. */ class Person{ stati ...
- Java中普通代码块,构造代码块,静态代码块执行顺序
//执行顺序:(优先级从高到低.)静态代码块>mian方法>构造代码块>构造方法. 其中静态代码块只执行一次.构造代码块在每次创建对象是都会执行. 1 普通代码块 1 //普通代码块 ...
- Java--普通代码块静态代码块执行顺序
class B { public B() { super(); System.out.println("构造器B"); } { System.out.println("普 ...
- Java 基础 面向对象之关键字内部类代码块修饰符
final final概念 继承的出现提高了代码的复用性,并方便开发.但随之也有问题,有些类在描述完之后,不想被继承,或者有些类中的部分方法功能是固定的,不想让子类重写.可是当子类继承了这些特殊类之后 ...
- java中静态代码块初始化顺序
(一)java 静态代码块 静态方法区别 一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下, ...
- Java静态代码块、构造代码块执行顺序问题
package com.zxl.staticdemo; public class BlockTest { static { System.out.println("BlockTest静态代码 ...
- java代码块执行顺序
父类 public class Father { public Father() { System.out.println("父类构造PUBLIC father"); } stat ...
- java 子类、父类中静态代码块、字段,非静态代码块、字段以及构造函数的初始化顺序和次数
一个类中的数据初始化顺序是面试官非常喜欢出的面试题之一,本文用一个实例来介绍java中子类.父类中静态代码块.字段,非静态代码块.字段以及构造函数的执行顺序和次数. 一.包结构
- java面试基础题------》Java 中的父子类静态代码块,代码块,构造方法执行顺序
4.指出下面程序的运行结果. class A { static { System.out.print("1"); } public A() { System.out.print(& ...
随机推荐
- 判断是否是 首次 进入app,,以及Xcode7之后前导页的设置
我的解决方案:... 1.在appdelegate.m中找到 “application:didFinishLaunchingWithOptions:”方法, 添加以下代码: /** * 前导 ...
- 实战案例:DIV嵌套
缘于页面结构语义化的考虑,我们应该慎用div和span这两个通用元素,只有当划分页面结构模块时才使用div元素,因为模块本身是没有任何语义的,他仅代表一块独立的结构.如果想对段落内部分内联元素或文本应 ...
- Javascript数据类型的一些注意点
1.字符串类型 substring()返回指定索引区间的子串: var s = 'hello, world' s.substring(0, 5); // 从索引0开始到5(不包括5),返回'hello ...
- 给Windows机器创建软连接
给Windows机器创建软连接 http://blog.csdn.net/w6611415/article/details/32084677
- C语言课本实例
1. 将一维数组的内容倒顺 #include <stdio.h>void func(int *s,int n){ int i,temp; for(i=0;i<n/2;i++) { t ...
- C语言:通过指针对数组元素进行排序
// // main.c // Pointer_array // // Created by ma c on 15/8/2. // Copyright (c) 2015年 bjsxt. All ...
- PHP5下SOAP调用实现过程
本文以某公司iPhone 6手机预约接口开发为例,介绍PHP5下SOAP调用的实现过程. 一.基础概念 SOAP(Simple Object Access Protocol )简单对象访问协议是在分散 ...
- 你应该知道的2016年有关App开发的技术创新
上一篇简述了2016年有关App产品的年中总结,这篇开始历数有关App开发的技术创新!无论你是创业者,还是程序员,无论你是否懂编程.写代码,利用APICloud平台数据撰写的年中总结,集合了移动应用创 ...
- asp.net 项目在 IE 11 下出现 “__doPostBack”未定义 的解决办法
最近项目在 IE 11 下<asp:LinkButton> 点击出现 “__doPostBack”未定义”,经过一番google,终于知道了原因:ASP.NET 可能无法辨识出一些浏览器的 ...
- shell eval用法
转自:http://blog.csdn.net/w_ww_w/article/details/7075867 eval可读取一连串的参数,然后再依参数本身的特性来执行.eval是shell内建命令,可 ...