• 动手动脑(4)继承和派生


    1.利用instanceof运算符判断一个对象是否可以转换为指定的类型:

    public class TestInstanceof
    {
        public static void main(String[] args) 
        {
            //声明hello时使用Object类,则hello的编译类型是Object,Object是所有类的父类
            //但hello变量的实际类型是String
            Object hello = "Hello";
            //String是Object类的子类,所以返回true。
            System.out.println("字符串是否是Object类的实例:" + (hello instanceof Object));
            //返回true。
            System.out.println("字符串是否是String类的实例:" + (hello instanceof String));
            //返回false。
            System.out.println("字符串是否是Math类的实例:" + (hello instanceof Math));
            //String实现了Comparable接口,所以返回true。
            System.out.println("字符串是否是Comparable接口的实例:" + (hello instanceof Comparable));
            String a = "Hello";
            //String类既不是Math类,也不是Math类的父类,所以下面代码编译无法通过
            //System.out.println("字符串是否是Math类的实例:" + (a instanceof Math));
        }
    }
       


    2.继承

    class Grandparent 
    {
    
    
        public Grandparent()
         {
    
                System.out.println("GrandParent Created.");
        
    }
    
    
        public Grandparent(String string) 
        {
    
                System.out.println("GrandParent Created.String:" + string);
        
     }
    
    }
    
    
    
    class Parent extends Grandparent
    {
    
    
        public Parent()
         {
    
                //super("Hello.Grandparent.");      
    
                System.out.println("Parent Created");
        
           // super("Hello.Grandparent.");
    
          }
    
    }
    
    
    
    class Child extends Parent 
    {
    
    
        public Child()
         {
        
            System.out.println("Child Created");
    
          }
    
    }
    
    
    
    public class TestInherits 
    {
    
    
        public static void main(String args[])
         {
    
                Child c = new Child();
        
      }
    
    }

     

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

    3.不可调用的类

    以final声明的方法不允许覆盖。
    以final声明的变量不允许更改。

    创建“不可变的类”的对象后,此对象的属性不可改,而且也无法从此类派生出新子类。String就是一个典型的例子。


    不可变的“类”有何用?
    可以方便和安全地用于多线程环境中,
    访问它们可以不用加锁,因而能提供较高的性能。

    public final class Address
    {
        private final String detail;
        private final String postCode;
    
        //在构造方法里初始化两个实例属性
        public Address()
        {
            this.detail = "";
            this.postCode = "";
    
        }
        public Address(String detail , String postCode)
        {
            this.detail = detail;
            this.postCode = postCode;
        }
        //仅为两个实例属性提供getter方法
        public String getDetail()
        {
             return this.detail;
        }
    
        public String getPostCode()
        {
             return this.postCode;
        }
        //重写equals方法,判断两个对象是否相等。
        public boolean equals(Object obj)
        {
            if (obj instanceof Address)
            {
                Address ad = (Address)obj;
                if (this.getDetail().equals(ad.getDetail()) && this.getPostCode().equals(ad.getPostCode()))
                {
                    return true;
                }
            }
            return false;
        }
        public int hashCode()
        {
            return detail.hashCode() + postCode.hashCode();
        }
    }

    4.

    package cn.bjc;
    
    public class ExplorationJDKSource {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            System.out.println(new A());
        }
    
    }
    
    class A{}

     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();

     5.Fruit.java

    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()方法。

     6.多态

    多态的最本质特征就是父类(或接口)变量可以引用子类(或实现了接口的类)对象。换句话说:子类对象可以被当成基类对象使用

    7.类型转换

    子类对象可以直接赋给基类变量。
    基类对象要赋给子类对象变量,必须执行类型转换,
    其语法是:
           子类对象变量=(子类名)基类对象名;
    也不能乱转换。如果类型转换失败Java会抛出以下这种异常:    ClassCastException

    package cn.bjc;
    class Mammal{}
    class Dog extends Mammal {}
    class Cat extends Mammal{}
    public class TestCast
    {
        public static void main(String args[])
        {
            Mammal m;
            Dog d=new Dog();
            Cat c=new Cat();
            m=d;  //true
            //d=m;   //false
            d=(Dog)m;   //true
            //d=c;
            //c=(Cat)m;
    
        }
    }

     

    8.

     9.

    package cn.bjc;
    class Parent2
            
    {
    
        public int value=100;
        
    public void Introduce()
        {
    
                System.out.println("I'm father");
    
            }
    
    
    
    
    }
    
    class Son extends Parent2
    {
    
        public int value=101;
    
             public void Introduce()
        {
    
                System.out.println("I'm son");
        
    }
    
    }
    
    
    class Daughter extends Parent2
    {
    
        public int value=102;
        public void Introduce()
        {
    
                System.out.println("I'm daughter");
        
    }
    
    }
    
    public class TestPolymorphism
    {
    
    
        public static void main(String args[])
        {
    
            Parent2 p=new Parent2();
    
            p.Introduce();
    
            System.out.println(p.value);
    
            p=new Son();
    
            p.Introduce();
    
            System.out.println(p.value);
    
            p=new Daughter();
    
            p.Introduce();
    
            System.out.println(p.value);
    
    
        }
    
    
    }



  • 相关阅读:
    Elasticsearch集群+kibana
    kafka集群搭建
    Zookeeper集群搭建
    Hadoop+Hbase+Zookeeper分布式存储构建
    正则文本处理
    Haproxy+keepalived高可用集群实战
    httpsqs消息队安装
    LVS-TUN模式
    一.4.序列化使用之机柜资源及序列化高级用法
    一.3.序列化使用之idc资源与api文档
  • 原文地址:https://www.cnblogs.com/ywqtro/p/11741222.html
Copyright © 2020-2023  润新知