继承可以简化代码,提高代码的利用率,但是通常用于同一类事物,且有多个共同的属性或功能时才考虑继承。本文主要说明Java中父类在被子类调用后内部模块与子类出现的先后顺序来判定继承中父类与子类的优先级问题。
首先在子类中分别定义静态代码块、非静态代码块、无参构造器、静态方法与非静态方法。
class A extends B{
/**
* 子类静态代码块
*/
static {
System.out.println("----staticA--1--------");
}
/**
* 子类代码块
*/
{
System.out.println("---------2------");
}
/**
* 子类无参构造器
* 赋初值
*/
public A() {
super();//默认不写
System.out.println("-----A--3---------");
}
/**
* 非静态方法buy
*/
public void buy() {
System.out.println("-------buy--4---------");
}
/**
* 静态方法method
*/
public static void method() {
System.out.println("------method----5---------");
}
}
父类中同样定义静态代码块、非静态代码块、无参构造器、静态方法与非静态方法。
class B{
/**
* 父类静态代码块
*/
static {
System.out.println("----staticB--6--------");
}
/**
* 父类代码块
*/
{
System.out.println("--------7------");
}
/**
* 父类无参构造器
* 赋初值
*/
public B() {
System.out.println("----B---8---------");
}
/**
* 非静态方法run
*/
public void run() {
System.out.println("-----run----9---------");
}
/**
* 静态方法good
*/
public static void good() {
System.out.println("----good------10---------");
}
}
给A创建一个对象a
public static void main(String[] args) {
A a = new A();
}
运行结果:
----staticB--6--------
----staticA--1--------
--------7------
----B---8---------
---------2------
-----A--3---------
结果分析:由此可以看出运行父类中的静态代码块有优先于子类,而上述运行–7--和–B--8–在--2–和--A–3--的前面是因为在运行无参构造器A的时候父类隐藏属性super()优先执行把运行对象转接到父类B上,而因为代码块的优先级又高于无参构造器,故—7---在–B--8–前面,等B运行结束后,才返回A继续执行,同理,先打印处–2--,接着打印出—A---3—。
接着添加A.good();a.run();a.buy();A.method();四组调用(非静态:只能通过对象调用,因为非静态的属性或方法只有在创建对象的时候才会被加载进内存。静态:既可以通过对象调用,也可以通过类名调用,建议使用类名调用)
public static void main(String[] args) {
A a = new A();
A.good();
a.run();
a.buy();
A.method();
}
运行结果:
----staticB--6--------
----staticA--1--------
--------7------
----B---8---------
---------2------
-----A--3---------
----good------10---------
-----run----9---------
-------buy--4---------
------method----5---------
结果分析:由于对象a与类A在调用和继承并无先后顺序故调用方法先后顺序与其运行先后顺序一致。
完整代码块:
package cn.yunhe.extend;
public class PracticeDemo {
public static void main(String[] args) {
A a = new A();
A.good();
a.run();
a.buy();
A.method();
}
}
/**
* A继承B
*/
class A extends B{
/**
* 子类静态代码块
*/
static {
System.out.println("----staticA--1--------");
}
/**
* 子类代码块
*/
{
System.out.println("---------2------");
}
/**
* 子类无参构造器
* 赋初值
*/
public A() {
super();//默认不写
System.out.println("-----A--3---------");
}
/**
* 非静态方法buy
*/
public void buy() {
System.out.println("-------buy--4---------");
}
/**
* 静态方法method
*/
public static void method() {
System.out.println("------method----5---------");
}
}
class B{
/**
* 父类静态代码块
*/
static {
System.out.println("----staticB--6--------");
}
/**
* 父类代码块
*/
{
System.out.println("--------7------");
}
/**
* 父类无参构造器
* 赋初值
*/
public B() {
System.out.println("----B---8---------");
}
/**
* 非静态方法run
*/
public void run() {
System.out.println("-----run----9---------");
}
/**
* 静态方法good
*/
public static void good() {
System.out.println("----good------10---------");
}
}
无评有赞,感谢观看!