zoukankan      html  css  js  c++  java
  • JAVA接口与继承

    1 public class Fruit

    2 {

    3

    public String toString()

    4

    {

    5return "Fruit toString.";

    6 }

    7

    8 public static void main(String args[])

    9 {

    10 Fruit f=new Fruit();

    11 System.out.println("f="+f);

    12 System.out.println("f="+f.toString());

    13 }

    14 }

    复制代码

    2)结果截图:

    3)结果分析:

    注意倒数第二句,一个字串和一个对象“相加”,得到以下结果?

     Fruit类覆盖了Object类的toString方法。在“+”运算中,当任何一个对象与一个String对象,连接时,会隐式地调用其toString()方法,默认情况下,此方法返回“类名 @ + hashCode”。

    为了返回有意义的信息,子类可以重写toString()方法。

    二、动手实验:继承条件下的构造方法调用

    1)源代码:

    复制代码
     1 public class TestInherits {
     2 
     3     public static void main(String[] args) {
     4         // TODO Auto-generated method stub
     5 
     6         Child c = new Child();
     7     }
     8 
     9 }
    10 
    11 class GrandParent
    12 {
    13     public GrandParent()
    14     {
    15         System.out.println("GrandParent Created.Sting:");
    16     }
    17     public GrandParent(String string)
    18     {
    19         System.out.println("GrandParent Created.Sting...:" + string);
    20     }
    21 }
    22 
    23 class Parent extends GrandParent
    24 {
    25     public Parent()
    26     {  
    27         super("mk");
    28         System.out.println("Parent Created");
    29         //super("Hello.GrandParent");
    30     }
    31 }
    32 
    33 class Child extends Parent
    34 {
    35     public Child()
    36     {
    37         System.out.println("Child Created");
    38     }
    39 }
    复制代码

    2)结果截图:
          

    3)结果分析:

    通过 super 调用基类构造方法,必须是子类构造方法中的第一个语句。

    4)为什么子类的构造方法在运行之前,必须调用父类的构造方法?能不能反过来?为什么不能反过来?

    不能反过来。子类是通过父类继承过来的,所以子类有父类的属性和方法,如果不调用父类的构造方法,不能初始化父类中定义的属性,即不能给父类的属性分配内存空间 ,如果父类的属性没有分配内存空间,那么子类访问父类的属性,就会报错。 

    二.探索技术的奥秘

    1.代码

    public class ExplorationJDKSource {

    /**

     * @param args

     */

    public static void main(String[] args) {

    System.out.println(new A());

    }

    }

    class A{}

    2.结果

    3.

     
       

    真相:

    ·前面示例中,main方法实际上调用的是:

    public void println(Object x),这一方法内部调用了String类的valueOf方法。

    valueOf方法内部又调用Object.toString方法:

    public String toString() {

    return getClass().getName() +"@" +

    Integer.toHexString(hashCode());

    }

    hashCode方法是本地方法,由JVM设计者实现:

    public  native int hashCode();

    三.动手动脑

    ·在子类中,若要调用父类中被覆盖的方法,可以使用super关键字。

    public class Super

    {

    public static void main(String args[])

    {

    Child c=new Child();

    c.show();

    }

    }

    class Parent

    {

    public void show()

    {

    System.out.println("parent");

    }

    }

    class Child extends Parent

    {

    public void show()

    {

    System.out.println("child");

    super.show();

    }

    }

    四.方法覆盖(override)

    public class Fruit

    {

    public String toString()

    {

    return "Fruit toString.";

    }

    public static void main(String args[])

    {

    Fruit f=new Fruit();

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

    // System.out.println("f="+f.toString());

    }

    }

    ·结果

     
       

    ·结论:在“+”运算中,当任何一个对象与一个String对象,连接时,会隐式地调用其toString()方法,默认情况下,此方法返回“类名 @ + hashCode”。为了返回有意义的信息,子类可以重写toString()方法。

    ·要点:方法覆盖要求子类与父类的方法一模一样,否则就是方法重载(overload)!

     
    复制代码
  • 相关阅读:
    我国自主研发的先进辅助驾驶系统(ADAS)控制器产品实现量产配套
    国务院印发《新一代人工智能发展规划》
    如何删除svn标签
    【转载】DHCP流程
    1-1 如何进行自我规划?
    人要像鹰一样重生、蜕变、成长
    人的一生好像乘坐北京地铁一号线
    【转载】接触Matlab10年后的一个总结,随时使用Matlab要掌握的一些要点
    【转载】BAT 批处理脚本教程
    SNAT 和 DNAT
  • 原文地址:https://www.cnblogs.com/zeminzhang/p/6053831.html
Copyright © 2011-2022 走看看