1、规则

(1)基类(父类)的引用类型变量可以指向其子类对象;(向上转型)

(2)基类的引用不可以访问其子类对象新增加的成员(属性和方法);

(3)可以使用“引用变量 instanceof 类名”来判断该引用变量所指向的对象是否属于该类(或该类的子类);

(4)子类对象可以当做基类对象来使用,即基类引用指向子类对象,是向上转型(upcasting);反之,向下转型(downcasting)。

例1:

public class TestAnimal{
public static void main(String args[]){
Animal a=new Animal("name");
Dog d=new Dog("dogname","black");
Cat c=new Cat("catname","blue");
System.out.println(a instanceof Animal);//true
System.out.println(d instanceof Animal);//true
System.out.println(c instanceof Cat);//true
System.out.println(a instanceof Cat);//false
a=new Dog("bigyellow","yellow");//父类引用指向子类对象(向上转型)
System.out.println(a.name);//bigyellow
//System.out.println(a.furColor);//编译错误:找不到符号!规则(2)
System.out.println(a instanceof Animal);//true
System.out.println(a instanceof Dog);//true!!!
Dog d1=(Dog) a;//强制转换符(向下转型)
System.out.println(d1.furColor);//yellow
//Cat c1=(Cat) a;//运行时抛异常!java.lang.ClassCastException:Dog cannot be cast to Cat
}
} class Animal{
public String name;
Animal(String name){
this.name=name;
}
} class Dog extends Animal{
public String furColor;
Dog(String name,String furColor){
super(name);
this.furColor=furColor;
}
} class Cat extends Animal{
public String eyesColor;
Cat(String name,String eyesColor){
super(name);
this.eyesColor=eyesColor;
}
}

例2:对象转型带来的可扩展性方面的好处

public class TestAnimal{
public static void main(String args[]){
TestAnimal test=new TestAnimal();
Animal a=new Animal("name");
Dog d=new Dog("dogname","black");
Cat c=new Cat("catname","blue");
test.f(a);
test.f(c);
test.f(d);
}
public void f(Animal a){
System.out.println("name:"+a.name);
if(a instanceof Cat){
Cat c1=(Cat) a;
System.out.println(" "+c1.eyesColor+" eyes");
}
else if(a instanceof Dog){
Dog d1=(Dog) a;
System.out.println(" "+d1.furColor+" fur");
}
}
} class Animal{
public String name;
Animal(String name){
this.name=name;
}
} class Dog extends Animal{
public String furColor;
Dog(String name,String furColor){
super(name);
this.furColor=furColor;
}
} class Cat extends Animal{
public String eyesColor;
Cat(String name,String eyesColor){
super(name);
this.eyesColor=eyesColor;
}
}

JAVA笔记8-对象转型casting的更多相关文章

  1. java入门之——对象转型

    对象的类型转换是我们在编程的时候常常会遇到的,java平台也是如此.比方一些基本类型的数据转型和复合数据的转换. 举例 java语言中主要分为向上转型和向下转型,怎样来了解和掌握这两者转型的关系呢?首 ...

  2. JAVA基础-- 对象转型 (casting)

    1. 一个基类的引用类型变量可以指向其子类的对象: a=new Dog("bigyellow","yellow"); 2. 一个基类的引用不可以访问其子类对象新 ...

  3. 对象转型 casting

    一个基类的引用类型变量可以"指向"其子类对象. 一个基类的引用不可以访问其子类对象新增加的成员(属性和方法). 基类强制转型成子类,则能访问子类独有的成员. 可以使用 引用变量in ...

  4. Java笔记:对象,方法,类

    1.数据类型(类) 对象名; 这里要求数据类型必须为复合数据类型,基本数据类型声明的结构只能称为变量,而不能称为对象. 对象的初始化 对象名= new 构造方法(参数); 2.方法: 访问控制符 [修 ...

  5. java基础学习之对象转型

    对象转型(casting): 1)一个基类的引用类型变量可以指向其子类的对象 2)一个基类的引用不可以访问其子类对象新增加的成员(属性和方法) 3)可以使用引用变量instanceof类名,来判断该引 ...

  6. Java自学-接口与继承 对象转型

    Java中的对象转型 示例 1 : 明确引用类型与对象类型的概念 首先,明确引用类型与对象类型的概念 在这个例子里,有一个对象 new ADHero(), 同时也有一个引用ad 对象是有类型的, 是A ...

  7. Java菜鸟学习笔记--面向对象篇(十八):对象转型&多态

    Polymorphism[多态] 简述: 面向对象多态性指的是:发送消息给某个对象,让该对象自行决定响应何种行为. 通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用 多态的三个前提条件: 多 ...

  8. java基础课程笔记 static 主函数 静态工具类 classpath java文档注释 静态代码块 对象初始化过程 设计模式 继承 子父类中的函数 继承中的构造函数 对象转型 多态 封装 抽象类 final 接口 包 jar包

    Static那些事儿 Static关键字 被static修饰的变量成为静态变量(类变量) 作用:是一个修饰符,用于修饰成员(成员变量,成员方法) 1.被static修饰后的成员变量只有一份 2.当成员 ...

  9. Effective Java笔记一 创建和销毁对象

    Effective Java笔记一 创建和销毁对象 第1条 考虑用静态工厂方法代替构造器 第2条 遇到多个构造器参数时要考虑用构建器 第3条 用私有构造器或者枚举类型强化Singleton属性 第4条 ...

随机推荐

  1. 【Python开发】网页爬取心得

    转载:python 爬虫抓取心得分享 title:python 爬虫抓取心得分享 0x1.urllib.quote('要编码的字符串')如果你要在url请求里面放入中文,对相应的中文进行编码的话,可以 ...

  2. 前端数据Mock

    参考链接:https://www.clloz.com/programming/front-end/js/2019/05/10/data-mock/?utm_medium=hao.caibaojian. ...

  3. java8流式编程(一)

    传送门 <JAVA8开发指南>为什么你需要关注 JAVA8 <Java8开发指南>翻译邀请 Java8初体验(一)lambda表达式语法 Java8初体验(二)Stream语法 ...

  4. SpringCloud之Zuul 自定义filter

    实现过滤器很简单,只需要继承ZuulFilter,并实现ZuulFilter中的抽象方法. filterType():定义过滤器的类型,它有4种类型,分别是pre.post.routing和error ...

  5. [转帖]ORA-00600: internal error code, arguments: [4193]问题解决

    ORA-00600: internal error code, arguments: [4193]问题解决 https://www.cnblogs.com/linyfeng/p/7496736.htm ...

  6. Spring(十二)--Spring AspectJ

    Spring AspectJ AspectJ是一个面向切面的框架,它扩展了Java语言.AspectJ定义了AOP语法,所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件. As ...

  7. 协程+IO切换+小爬虫

    from gevent import monkeymonkey.patch_all() import geventimport requests def f1(url): print(f'GET:{u ...

  8. java多线程之并发编程

    1.并发不一定比串行更快 因为并发有线程创建和上下文切换的开销 2.java的并发采用内存共享模型 3.单线程中重排序不会影响到结果 但多线程中重排序可能会影响到结果 4.votaile变量 当线程A ...

  9. oa_mvc_easyui_详细页(5)

    1.表格详细列中添加a标签,给id参数 <a href="javascript:void(0)" class="details" ids="@n ...

  10. 学习笔记--APIO 2018 二分专题 By wuvin

    前言: 在APIO 2018 Day2下午听wuvin讲二分,听了一上午的神仙,现在终于有可以听懂了. 专题: 平均边权最大 题目链接:https://www.questoj.cn/problem/3 ...