java 继承父类 是会先执行父类吗
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 继承父类 是会先执行父类吗相关的知识,希望对你有一定的参考价值。
java中子类继承父类程序执行顺序问题Java中,new一个类的对象,类里面的静态代码块、非静态代码、无参构造方法、有参构造方法、类的一般方法等部分,它们的执行顺序相对来说比较简单,用程序也很容易验证。比如新建一个测试父类。
public class FatherTest
private String name;
FatherTest()
System.out.println("--父类的无参构造函数--");
FatherTest(String name)
this.name=name;
System.out.println("--父类的有参构造函数--"+this.name);
static
System.out.println("--父类的静态代码块--");
System.out.println("--父类的非静态代码块--");
public void speak()
System.out.println("--父类的方法--");
加入一个main程序后
public static void main(String[] args)
System.out.println("--父类主程序--");
FatherTest father=new FatherTest("父亲的名字");
father.speak();
执行结果为:
--父类的静态代码块--
--父类主程序--
--父类的非静态代码块--
--父类的有参构造函数--父亲的名字
--父类的方法—
可以很明显的看出来执行顺序:静态代码块—主程序—非静态代码块—构造函数—一般方法。
如果加入子类的继承以后,情况就会变得复杂些。比如我们再新建一个测试子类。
public class SonTest extends FatherTest
private String name;
static
System.out.println("--子类的静态代码块--");
System.out.println("--子类的非静态代码块--");
SonTest()
System.out.println("--子类的无参构造函数--");
SonTest(String name)
this.name=name;
System.out.println("--子类的有参构造函数--"+this.name);
@Override
public void speak()
System.out.println("--子类Override了父类的方法--");
然后再加入一个main函数
public static void main(String[] args)
System.out.println("--子类主程序--");
FatherTest father=new FatherTest("父亲的名字");
father.speak();
SonTest son=new SonTest("儿子的名字");
son.speak();
执行结果为:
--父类的静态代码块--
--子类的静态代码块--
--子类主程序--
--父类的非静态代码块--
--父类的有参构造函数--父亲的名字
--父类的方法--
--父类的非静态代码块--
--父类的无参构造函数--
--子类的非静态代码块--
--子类的有参构造函数--儿子的名字
--子类Override了父类的方法--
加入了子类以后,执行顺序有了新的变化,我们可以总结一下。首先第一部分执行的是父类的静态代码块—子类的静态代码块—主程序。这一部分都是执行一次,与建立多少对象没有关系。第二部分new了一个父类对象,并调用了方法。执行了它的非静态代码块—构造函数—一般方法。第三部分new了一个子类的对象,并调用了方法。执行顺序为父类的非静态代码块—父类的无参构造函数,然后是子类的非静态代码块—子类构造函数—子类的方法。 参考技术A 你要写一个调用才会执行父类(具体看你哪个写前面了),而且如果一样的函数更改了子类会覆盖父类执行 参考技术B 构造函数是一定先调用父类的。
其他函数,你调用哪个就是哪个。
java中子类继承了父类就可以使用父类的方法了,那为啥还要用super?
super,超类,即父类。当你实例化一个子类的时候,编译器会自动查找子类的父类,并先将父类初始化。当你的子类使用带参数的构造函数时,你必须保证该子类的父类也有相同的带参数的构造器。
1.super(),它用来告诉编译器,爷我用的是哪个型号的构造器,方便你找俺老子。
2.super.属性,用于访问父类属性或方法。
比如,
public
class
Father()
public
Father()
public
Father(String
name,String
sex)
this.name=name;
this.sex=sex;
public
String
name="免贵姓唐";
public
String
sex;
public
class
Son_1()
public
Son_1()super();//此处表示为无参构造函数,一般可省略
public
Son_1(String
name,String
sex)
super(name,sex);
public
String
name="真的免贵";
public
static
void
main(String[]
arg)
print(super.name+"
"+name);
参考技术A 你可以不用super,
用这个的原因是你的子类方法想覆盖父类方法,但是又想需要父类方法的功能,所以先super
调用父类方法后加上自己的一些实现
以上是关于java 继承父类 是会先执行父类吗的主要内容,如果未能解决你的问题,请参考以下文章