精华内容
下载资源
问答
  • java子类继承父类
    千次阅读
    2021-02-12 11:46:34

    别和我说你真的懂了继承,先来看下面的代码,回答出我的问题再说

    代码很简单,如下:

    父类:

    public class T {

    public void run()

    {

    System.out.println("T can run");

    }

    public static void main(String args[])

    {

    T t = new SubT();

    t.run();

    t.fly();

    SubT subT = (SubT)t;

    subT.run();

    subT.fly();

    }

    }

    子类:

    public class SubT extends T{

    public void run()

    {

    System.out.println("SubT can run too");

    }

    public void fly()

    {

    System.out.println("SubT can fly");

    }

    }

    首先,上述代码可以正常编译乃至运行吗?

    其次,能够执行其结果是?不能编译或执行的原因在哪个地方?

    上面这个例子是很典型的子类继承父类并重写run方法,添加了新的fly方法,而调用的时候去声明一个父类引用去指向一个子类对象

    首先,上述代码是无法编译通过的,因为一个父类的引用无法去调用子类独有的方法或者被子类复写后的方法,故t.fly()这个调用时违法的

    好的,那么我们把这句注释掉,输出结果是什么呢?

    SubT can run too

    SubT can run too

    SubT can fly

    从上述结果可以看出,当一个父类引用指向了一个子类的对象时,调用的方法为子类复写后的方法,而非父类方法,正式这一特性大大地拓展了java的多态性

    附一个讲的比较详细的链接:父类引用指向子类对象

    更多相关内容
  • 主要介绍了java子类继承父类实例-披萨的选择实现代码,具有一定借鉴价值,需要的朋友可以参考下。
  • JAVA子类继承父类

    千次阅读 2021-03-01 06:34:01
    1、类的继承知识点 (1)java不支持多重继承,也就是说子类至多只能有一个父类 (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法 (3)子类中定义的成员变量和父类中定义的成员变量...

    publicabstractclassA {

    inti=1;

    publicvoidprintI() {

    System.out.println("i="+i);

    }

    }

    publicclassB  extneds A{

    inti=2;

    publicstaticvoidmain(String[] args) {

    B b=newB();

    b.printI();

    }

    }

    那么,控制台打出来的i的值是多少?

    呵呵,如果一下功夫就能说出正确结果1,那么,下面部分就不需要往下看了。

    1、类的继承知识点

    (1)java不支持多重继承,也就是说子类至多只能有一个父类

    (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法

    (3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承

    (4)子类中定义的成员方法,并且这个成员方法的名字,返回类型,及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承。

    2、答案是2者如是说

    子类B中的变量i和父类A中的变量i重名, 那么子类B中的变量i将会覆盖掉父类中的同名变量i. 则访问父类中的变量时jvm会把子类cast到父类.所以,打印出的结果应该是“i=2”;

    3、歧义的产生

    歧义的产生最关键的地方是子类B中的变量i将会覆盖掉父类中的同名变量i的覆盖两个字。这里,我觉得这两个字容易误导。应该改为屏蔽或隐藏。因为在这里父类的成员变量是没有被改变。

    4、jvm的执行过程

    (1)子类B 的构造方法被调用,实例化一个B对象,B对象的成员被初始化

    (2)jvm隐含的调用父类的构造方法,实例化一个A对象,A对象的成员被初始化。

    (3)由于A对象的printI()未被屏蔽,所以调用的A对象的printI()函数。

    那么,在这里A的成员函数当然是访问自己的成员变量了。

    5、super关键字

    super关键字在java中的作用是使被屏蔽的成员变量或者成员方法或变为可见,或者说用来引用被屏蔽的成员变量和成员成员方法。super是用在子类中,目的是访问直接父类中被屏蔽的成员。上面的代码也可以这样写:

    Java代码

    publicabstractclassA {

    inti=1;

    publicvoidprintI() {

    System.out.println("i="+i);

    }

    }

    publicclassBextendsA{

    publicinti=2;

    publicvoidprintI(){

    super.printI();

    }

    publicstaticvoidmain(String[] args){

    B b=newB();

    b.printI();

    }

    }

    注:

    JVM实例化程序的过程中,若对子类进行实例化,必然要对父类的构造器进行实例化继承。

    C exteds D{}

    C c = new C();

    构造器,采取先父后子的关系。

    而方法,若调用的方法为子类所覆盖,则主动调用儿子的方法,因为此时,已经继承了父类所拥有的

    相关变量,而方法行为,子类具有相对来说的独立性,可以独立调用。

    D c = new C();

    JV处理过程,也是如此。

    先继承D的构造器(基因),再加载C独自的构造器,同时,对相关方法进行相应的调用。

    展开全文
  • 继承关系

    结论:

        java中子类继承父类各方法的执行顺序:(这里只写jvm自动调用的方法的顺序,包括静态代码块、代码块、构造方法)

           1、第一次创建子类对象

            父类静态代码块

            子类静态代码块

            父类代码块

            父类构造方法

            子类代码块

            子类构造方法

            2、之后创建子类对象,子类和父类的静态代码块不会执行,其余不变。

    解释:

        1、java的机制是先编译成字节码文件.class  然后在JVM上解释器逐行翻译成机器码文件,那从.class 到JVM加载的时候,就执行static代码块和static变量,所以先执行静态代码块,并且执行顺序是先执行父类的在执行子类的。

        2、创建对象的时候,调用了它的构造方法,所有子类的构造方法第一行的时候都隐含 super(),所以会先调用父类的构造方法,而每次在执行构造方法之前都会执行代码块,父类的代码块,父类的构造方法执行完毕之后,开始执行子类的代码块,构造方法。

        3、补充:

            (1)如果有多个构造方法(比如:有参的、无参的、参数个数不同的),根据创建对象时传的参数找对应的构造方法(比如:无参的找无参的,有参的找有参的)。

            (2)多态的顺序也是这样的。

            (3)加上main方法

                    子类和main方法在同一个类中,如果在new子类对象之前main方法中有语句,那么顺序就是:静态、main()的语句、父类代码块、父类构造方法...... 

                    如果新建一个测试类、在new子类对象之前main方法中有语句,顺序为:main()的语句、静态、父类代码块。

               解释:如果子类和main在同一个类中,加载子类,静态、执行main。如果不在同一个类,先加载main的类,执行到new子类时,才加载子类。

    展开全文
  • 这是看到的一道笔试题目,当时在思考为什么会出现这个,于是找到了一个子类继承父类后new子类对象的代码 父类 public class JVMBase { public static String staticName="父类静态变量"; public String name="父类...

    在这里插入图片描述
    这是看到的一道笔试题目,当时在思考为什么会出现这个,于是找到了一个子类继承父类后new子类对象的代码

    父类

    public class JVMBase {
        public static String staticName="父类静态变量";
        public String name="父类非静态变量";
        static{
            System.out.println(staticName);
            System.out.println("父类静态代码块");
        }
        public static void baseStaticMethod(){
            //方法只有被调用才会被执行
            System.out.println("父类静态方法");
        }
        {
            System.out.println(name);
            System.out.println("父类匿名代码块");
        }
        public JVMBase(){
            System.out.println("父类无参构造函数");
        }
    }
    

    子类

    public class JVMSub extends JVMBase{
        public static String subStaticName="子类静态变量";
        public String subName="子类非静态变量";
        static{
            System.out.println(subStaticName);
            System.out.println("子类静态代码块");
        }
        public static void subStaticMethod(){
            System.out.println("子类静态方法");
        }
        {
            System.out.println(subName);
            System.out.println("子类匿名代码块");
        }
        public JVMSub(){
        	//super(); 默认执行父类的无参构造
            System.out.println("子类无参构造函数");
        }
        public static void main(String[] args) {
            JVMSub sub=new JVMSub();
        }
    }
    

    运行结果:
    父类静态变量
    父类静态代码块
    子类静态变量
    子类静态代码块
    父类非静态变量
    父类匿名代码块
    父类无参构造函数
    子类非静态变量
    子类匿名代码块
    子类无参构造函数

    就是先创建父类 – 再子类,记住肯定是先把父类创建好,再创建子类,这是一个大顺序,

    至于单个类中的执行顺序就需要大家花点脑子记一下,先静态-- 后非静态,ok,有了这个概念就不会搞错执行顺序了。

    总结:

        父类静态 -- 子类静态(静态代码块只执行一次)
    
        父类非静态 -- 父类构造 (子类无参构造写不写super() ,默认都走父类无参构造。子类构造写super(有参) ,走父类的有参构造)
    
        子类非静态 -- 子类构造 (创建子类对象时无参走无参构造,有参走有参构造)
    

    下面这个讲的更详细点https://www.cnblogs.com/mindOpen/p/13020119.html

    展开全文
  • Java继承关系中,子类其实继承父类的全部方法和属性,只是没有权限访问父类的私有成员。 import java.lang.reflect.AccessibleObject; import java.lang.reflect.Method; class Father{ private String name...
  • JAVA子类继承父类时的构造方法

    千次阅读 2021-12-03 16:52:22
    Java 中,无论是 explicit 还是 implicit 方式,都要求在子类的构造方法中调用其父类的构造方法。如果父类无构造方法(其实是一个默认无参的构造方法),那么子类的构造方法中会自动进行调用;如果父类有自己的构造...
  • Dog继承Animalclass Animal{protected String name;protected String description;protected String say() {return "一只动物";}}class Dog extends Animal{private String name;protected String say() {return "我...
  • 父类:public class Subjects {public void b() {...}public void a(){System.out.println("这是继承父类的方法:Subjects");}public void c() {System.out.println("这是父类的数学");}public void d() {System.o...
  • 成员变量的隐藏和方法的重写Goods.javapublic class Goods {public double weight;public void oldSetWeight(double w) {weight=w;System.out.println("double型的weight="+weight);}public double oldGetPrice() {...
  • java 子类继承父类、方法的重写(覆盖)

    万次阅读 多人点赞 2018-10-28 16:10:07
    java子类继承父类、方法的重写(覆盖)   在程序中,如果想声明一个类继承另一个类,需要使用extends关键字。 格式: class 子类 extends 父类 {} public class Text { public static void main (String[]...
  • 从书中看到子类继承父类,子类拥有父类所有的属性和方法,于是使用程序去验证,发现父类的私有属性和私有方法,子类是不能访问的,当然一些父类的私有属性可能可以通过相应的方法访问到,但是私有的方法似乎不能简单...
  • Java子类继承父类构造器

    千次阅读 2018-05-04 11:16:26
    子类如何继承父类的构造器?2.子类与父类构造器执行顺序?二、创建父类创建父类Animal,有两个构造器class Animal{ private Integer high; public Animal() { System.out.println("Animal()"); } ...
  • 父类humanBeing , 子类student, 实例对象 $m (注意:$m是子类student 的实例,和humanBeijing没有直接关系)2.private 的属性.仅在本类里使用;任何子类、实例对象都无法访问,更别说赋值。这个在书本上都一直是这么....
  • 用学生的输出为例子,子类继承父类,然后在子类中新定义一个属性并可以给父类属性赋值,以及重写tostring和重写equals方法。 demo测试 package Student; public class demo { public static void main(String[] ...
  • 在之前的博文JAVA中子类继承父类时构造方法的继承问题中,我们已经了解到了当子类对象实例化的时候,调用子类构造方法之前,会先调用父类的构造方法,在继承的机制中,创建一个子类对象,同样会创建一个父类子对象,...
  • java不可以继承的情况如下 ①constructor 构造函数 ②private修饰的字段,方法
  • 简单说,如果子类继承父类自己写构造方法中没有显示调用父类有参构造方法,则会先隐式调用父类无参构造方法,若是先显示(super(300))调用了父类有参构造方法,则父类的无参构造方法就不会再被调用。 ...
  • java 子类继承父类 类加载顺序

    千次阅读 2018-03-19 23:00:17
    父类如下 package com.example.demo.service; import org.springframework.stereotype.Service; @Service public class TestService { public TestService(){ System.err.println("TestService 层"); ...
  • 官方文档解释到:当子类继承父类的方法中影响到父类的私有成员时,子类继承父类的该私有成员。
  • JAVA子类继承父类或实现接口时限制: 子类重写父类或接口中的方法名、参数列表一致。 不可以降低方法的访问权限。 (子类继承父类的访问修饰符要比父类的更大,也就是更加开放,假如我父类是protected修饰的,其...
  • Java - Java子类继承父类并调用接口

    千次阅读 2016-11-10 19:35:22
    父类代码: 功能:定义一个vehicle类及其中的set函数及get函数 public class vehicle { private double speed; private String name; private String color; public void setspeed(int speed){ this.speed=...
  • 子类继承父类的时候,子类的构造函数怎么写 构造函数用于构造一个类,是不能继承,不能被覆盖的。 (1)父类显式定义有参构造函数,而没有定义无参构造函数的时候,java虚拟机默认不自动创建一个无参构造函数。 (2...
  • JAVA 子类继承父类范例,2个子类继承同一个父类,完整代码,下载粘贴到project中可以直接运行
  • 虽然子类继承父类中的私有成员,但是在父类中声明的这些私有成员仍然是子类类型对象的一部分。 因为在实例化对象的时候,只初始化在当前类中所声明的属性明显是不足够的,还需要初始化其父类...
  • 子类不能重写父类的静态方法,私有方法。即使你看到子类中存在貌似是重写的父类的静态方法或者私有方法,编译是没有问题的,但那其实是你重新又定义的方法,不是重写。具体有关重写父类方法的规则如下:重写规则之一...
  • 继承就是子类继承父类的特征和行为,使得子类具有父类相同的行为。注意事项:1、当一个类没有继承任何一个类时,系统默认继承Object。2、父类又被称为基类、超类、super类,子类又被称为派生类,这是由于翻译问题而...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 339,625
精华内容 135,850
关键字:

java子类继承父类