1 public class TestInstanceof
 2 {
 3     public static void main(String[] args) 
 4     {
 5         //声明hello时使用Object类,则hello的编译类型是Object,Object是所有类的父类
 6         //但hello变量的实际类型是String
 7         Object hello = "Hello";
 8         //String是Object类的子类,所以返回true。
 9         System.out.println("字符串是否是Object类的实例:" + (hello instanceof Object));
10         //返回true。
11         System.out.println("字符串是否是String类的实例:" + (hello instanceof String));
12         //返回false。
13         System.out.println("字符串是否是Math类的实例:" + (hello instanceof Math));
14         //String实现了Comparable接口,所以返回true。
15         System.out.println("字符串是否是Comparable接口的实例:" + (hello instanceof Comparable));
16         String a = "Hello";
17         //String类既不是Math类,也不是Math类的父类,所以下面代码编译无法通过
18         //System.out.println("字符串是否是Math类的实例:" + (a instanceof Math));
19     }
20 }

运行结果:

字符串是否是Object类的实例:true
字符串是否是String类的实例:true
字符串是否是Math类的实例:false
字符串是否是Comparable接口的实例:true

与字符串实例有有关的类是Object类,它是String类的父类;String类,字符串的类型;Comparable类,String类实现了Comparable类,所有字符串是Comparable的示例。

 

 1 class Mammal{} //父类
 2 class Dog extends Mammal {} //子类
 3 class Cat extends Mammal{} //子类  java继承为单继承
 4 
 5 public class TestCast
 6 {
 7     public static void main(String args[])
 8     {
 9         Mammal m;
10         Dog d=new Dog();
11         Cat c=new Cat();
12         m=d;
13         //d=m;   //报错无法运行
14         d=(Dog)m;
15         //d=c; //报错无法运行
16         c=(Cat)m;
17 
18     }
19 }

以上代码说明:

类的示例可以将父类的实例化赋值给子类,反之则不能,说明只能由大到小,不能由小到大的赋值。

 

 1 class Parent{
 2     public int myValue=100;
 3     public void printValue() {
 4         System.out.println("Parent.printValue(),myValue="+myValue);
 5     }
 6 }
 7 class Child extends Parent{
 8     public int myValue=200;
 9     public void printValue() {
10         System.out.println("Child.printValue(),myValue="+myValue);
11     }
12 }
13 
14 public class ParentChildTest {
15     public static void main(String[] args) {
16         Parent parent=new Parent();
17         parent.printValue();
18         Child child=new Child();
19         child.printValue();
20         
21         parent=child;
22         parent.printValue();
23         
24         parent.myValue++;
25         parent.printValue();
26         
27         ((Child)parent).myValue++;
28         parent.printValue();
29         
30     }
31 }

运行结果:

Parent.printValue(),myValue=100
Child.printValue(),myValue=200
Child.printValue(),myValue=200
Child.printValue(),myValue=200
Child.printValue(),myValue=201

说明:

当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定,这就是说:对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。

这个特性实际上就是面向对象“多态”特性的具体表现