-
向下转型
2020-03-05 15:26:11public class 向下转型 { public static void main(String[] args) { Father5 father5= new Son5(); // Son5 son5= (Son5)father5;// 这个过程就叫做向下转型。 // System.out.println(son5.name); } } class.....package Jicheng; public class 向下转型 { public static void main(String[] args) { Father5 father5= new Son5(); // Son5 son5= (Son5)father5;// 这个过程就叫做向下转型。 // System.out.println(son5.name); } } class Father5{ String name = "FATHER"; } class Son5 extends Father5{ String name = "SON"; }
-
java 向下转型_Java_向下转型
2021-02-12 09:49:50对象一旦向上转型为父类就无法调用子类的特有方法解决方法就是用对象的向下转型向上转型过程已经把Teacher当做父类People使用所以如果在Teacher类里面写一个特有方法我们是无法用 http://Xiaoming.XXX();...对象一旦向上转型为父类就无法调用子类的特有方法
解决方法就是用对象的向下转型
向上转型过程已经把Teacher当做父类People使用所以如果在Teacher类里面写一个特有方法我们是无法用 http://Xiaoming.XXX();进行调用
所以向下转型为原型:
对象向下转型是一个【还原】的动作
格式:子类名称 对象名 =(子类名称)父亲对象;
含义:将父类对象还原成本来的子类对象
例子如下
父类:
子类:
我们无法用Xiaoming.music();调用Teacher的特有方法
向下转型
如果把父类换成Animal 子类换成Cat更好理解
父类中有abstract方法eat;
子类有重写的abstract方法eat();和特有方法catchMouse()
向上转型为
Animal animal = new Cat();
Animal.eat()可以成功调用而Animal.catchMouse()不能调用
这时候就需要向下转型
Cat cat=(Cat)animal,将创建的属于Animal类的对象animal转为Cat类的cat对象
就可以用cat.catchMouse();调用法法catchMouse了
向下转型是有危险的,向下转型为什么说是还原呢?其实就是你是由什么转过来的你就应该转回什么,比如cat→animal,那么你就应该由对象animal→cat,假如还有一个animal的子类叫dog,你如果由animal→dog那么就是错误转型,就像我给了你亿元美金,你给回我的是一RMB那么就不是还原了。
-
Java向下转型的意义
2016-08-17 16:13:01一开始学习 Java 时不重视向下转型。一直搞不清楚向下转型的意义和用途,不清楚其实就是不会,那开发的过程肯定也想不到用向下转型。其实向上转型和向下转型都是很重要的,可能我们平时见向上转型多一点,向上转型也...一开始学习 Java 时不重视向下转型。一直搞不清楚向下转型的意义和用途,不清楚其实就是不会,那开发的过程肯定也想不到用向下转型。
其实向上转型和向下转型都是很重要的,可能我们平时见向上转型多一点,向上转型也比较好理解。
但是向下转型,会不会觉得很傻,我是要用子类实例对象,先是生成子类实例赋值给父类引用,在将父类引用向下强转给子类引用,这不是多此一举吗?我不向上转型也不向下转型,直接用子类实例就行了。
我开始学习Java时也是这么想的,这误区导致我觉得向下转型就是没用的。
随着技术的提升,我在看开源的项目学习,发现很多地方都用了向下转型的技术,这就让我重视了起来,想要重新来复习(学习)这个知识点。也是搜索了许多博客文章,但都没具体说明向下转型,只是给了例子演示怎么使用,反而是向上转型讲了一堆(可能是我没找到)。这篇博客就是讲向下转型的,那我们就来学习下向下转型,了解下这种特性的意义和使用场景
新建一个电子产品接口,如下:
public interface Electronics{ }
很简单,什么方法都没有。
新建一个Thinkpad笔记本类,并实现电子产品接口:
public class Thinkpad implements Electronics{ //Thinkpad引导方法 public void boot(){ System.out.println("welcome,I am Thinkpad"); } //使用Thinkpad编程 public void program(){ System.out.println("using Thinkpad program"); } }
新建一个Mouse鼠标类,并实现电子产品接口:
public class Mouse implements Electronics{ //鼠标移动 public void move(){ System.out.println("move the mouse"); } //鼠标点击 public void onClick(){ System.out.println("a click of the mouse"); } }
新建一个Keyboard键盘类,并实现电子产品接口:
public class Keyboard implements Electronics{ //使用键盘输入 public void input(){ System.out.println("using Keyboard input"); } }
这里子类比较多,是为了更好的理解。每个类的方法的逻辑实现也很简单。打印了一行信息
接下来,我们想象一个情景:我们去商城买电子产品,电子产品很多吧,比如笔记本电脑,鼠标,键盘,步步高点读机哪里不会点哪里,我们用的手机,等等,这些都属于电子产品。电子产品是抽象的。好,那么我们决定买一台Thinkpad,一个鼠标和一个键盘。
这时,我们需要一个购物车来装这些电子产品吧。我们可以添加进购物车,然后通过购物车还能知道存放的电子产品数量,能拿到对应的电子产品。
那么,一个购物车类就出来了,如下:import java.util.ArrayList; import java.util.List; public class ShopCar{ private List<Electronics> mlist = new ArrayList<Electronics>(); public void add(Electronics electronics){ mlist.add(electronics); } public int getSize(){ return mlist.size(); } public Electronics getListItem(int position){ return mlist.get(position); } }
List 集合是用来存放电子产品的,add 方法用来添加电子产品到购物车,getSize 方法用来获取存放的电子产品数量,getListItem 方法用来获取相应的电子产品。
可以看到
List<Electronics>
用了泛型的知识,至于为什么要用泛型?这个不做介绍了,泛型很重要的。
而我觉得比较疑惑的是为什么是放 Electronics 的泛型,而不是放Thinkpad,Mouse,Keyboard,Phone等?
那么如果是List<Thinkpad>
,肯定是放不进鼠标Mouse的吧,难道要生成3个集合?这里是定义了3个电子产品类,但是我如果有100种电子产品呢,要定义100个集合?
这太可怕了。所以之前,我们写了一个Electronics接口,提供了一个Electronics的标准,然后让每一个Electronics子类都去实现这个接口。实际上这里又涉及到了向上转型的知识点,我们虽然在add 方法将子类实例传了进来存放,但子类实例在传进去的过程中也进行了向上转型
所以,此时购物车里存放的子类实例对象,由于向上转型成Electronics,已经丢失了子类独有的方法,以上述例子来分析,Thinkpad实例就是丢失了boot() 和program() 这两个方法,而Mouse实例就是丢失了move()和onClick()这两个方法但是实际使用Thinkpad或Mouse或Keyboard时,这种情况肯定不是我们想要的
接着我们写一个测试类 Test 去测试购物车里的电子产品。
测试类 Test 如下:
public class Test{ public static final int THINKPAD = 0; public static final int MOUSE = 1; public static final int KEYBOARD = 2; public static void main(String[] args){ //添加进购物车 ShopCar shopcar = new ShopCar(); shopcar.add(new Thinkpad()); shopcar.add(new Mouse()); shopcar.add(new Keyboard()); //获取大小 System.out.println("购物车存放的电子产品数量为 ——> "+shopcar.getSize()); //开始测试thinkpad电脑 Thinkpad thinkpad = (Thinkpad)shopcar.getListItem(THINKPAD); thinkpad.boot(); thinkpad.program(); System.out.println("-------------------"); //开始测试Mouse鼠标 Mouse mouse = (Mouse)shopcar.getListItem(MOUSE); mouse.move(); mouse.onClick(); System.out.println("-------------------"); //开始测试Keyboard键盘 Keyboard keyboard = (Keyboard)shopcar.getListItem(KEYBOARD); keyboard.input(); } }
运行截图:
//开始测试thinkpad电脑 Thinkpad thinkpad = (Thinkpad)shopcar.getListItem(THINKPAD); thinkpad.boot(); thinkpad.program();
shopcar.getListItem(THINKPAD)
这句代码是获取到Electronics类型的实例。不是Thinkpad的实例通过向下转型,赋值给子类引用
Thinkpad thinkpad = (Thinkpad)shopcar.getListItem(THINKPAD);
这样子类实例又重新获得了因为向上转型而丢失的方法(boot 和program)
总结一下吧,很多时候,我们需要把很多种类的实例对象,全部扔到一个集合。(这句话很重要)
在这个例子里就是把Thinkpad笔记本,Mouse鼠标,KeyBoard键盘等实例对象,全部扔到一个Shopcar购物车集合。
但是肯定不可能给他们每个种类都用一个独立的集合去存放吧,这个时候我们应该寻找到一个标准,接口就是一个标准。这些都是各种电子产品,抽象成电子产品。然后一个Electronics接口就出来了。
在回到刚才,我们把很多种类的实例对象全部扔到一个集合。或许这样比较好理解:把很多种类的子类实例对象全部扔到存放父类实例的集合。
经过了这个过程,子类实例已经赋值给了父类引用(即完成了向上转型),但很遗憾的丢失了子类扩展的方法。
很好的是Java语言有个向下转型的特性,让我们可以重新获得丢失的方法,即强转回子类
所以我们需要用到子类实例的时候,就从那个父类集合里拿出来向下转型就可以了,一样可以使用子类实例对象……
我在搜索java向下转型的意义时,得到一个比较好的答案是这样的:
最大的用处是java的泛型编程,用处很大,Java的集合类都是这样的。而在Android开发中,我们在Layout文件夹,用xml写的控件。为什么能在Activity等组件中通过 findViewById() 方法找到呢?为什么 findViewById(R.id.textview) 方法传入TextView的id后,还要转型为TextView呢?这就是 Java 向下转型的一个应用
-
java 向下转型 作用_Java中向下转型的意义
2021-02-13 01:09:17一开始学习 Java 时不重视向下转型。一直搞不清楚向下转型的意义和用途,不清楚其实就是不会,那开发的过程肯定也想不到用向下转型。其实向上转型和向下转型都是很重要的,可能我们平时见向上转型多一点,向上转型也...一开始学习 Java 时不重视向下转型。一直搞不清楚向下转型的意义和用途,不清楚其实就是不会,那开发的过程肯定也想不到用向下转型。
其实向上转型和向下转型都是很重要的,可能我们平时见向上转型多一点,向上转型也比较好理解。
但是向下转型,会不会觉得很傻,我是要用子类实例对象,先是生成子类实例赋值给父类引用,在将父类引用向下强转给子类引用,这不是多此一举吗?我不向上转型也不向下转型,直接用子类实例就行了。
我开始学习Java时也是这么想的,这误区导致我觉得向下转型就是没用的。
随着技术的提升,我在看开源的项目学习,发现很多地方都用了向下转型的技术,这就让我重视了起来,想要重新来复习(学习)这个知识点。也是搜索了许多博客文章,但都没具体说明向下转型,只是给了例子演示怎么使用,反而是向上转型讲了一堆(可能是我没找到)。
这篇博客就是讲向下转型的,那我们就来学习下向下转型,了解下这种特性的意义和使用场景
新建一个电子产品接口,如下:
public interface Electronics{
}
很简单,什么方法都没有。
新建一个Thinkpad笔记本类,并实现电子产品接口:
public class Thinkpad implements Electronics{
//Thinkpad引导方法
public void boot(){
System.out.println("welcome,I am Thinkpad");
}
//使用Thinkpad编程
public void program(){
System.out.println("using Thinkpad program");
}
}
新建一个Mouse鼠标类,并实现电子产品接口:
public class Mouse implements Electronics{
//鼠标移动
public void move(){
System.out.println("move the mouse");
}
//鼠标点击
public void onClick(){
System.out.println("a click of the mouse");
}
}
新建一个Keyboard键盘类,并实现电子产品接口:
public class Keyboard implements Electronics{
//使用键盘输入
public void input(){
System.out.println("using Keyboard input");
}
}
这里子类比较多,是为了更好的理解。每个类的方法的逻辑实现也很简单。打印了一行信息
接下来,我们想象一个情景:我们去商城买电子产品,电子产品很多吧,比如笔记本电脑,鼠标,键盘,步步高点读机哪里不会点哪里,我们用的手机,等等,这些都属于电子产品。电子产品是抽象的。好,那么我们决定买一台Thinkpad,一个鼠标和一个键盘。
这时,我们需要一个购物车来装这些电子产品吧。我们可以添加进购物车,然后通过购物车还能知道存放的电子产品数量,能拿到对应的电子产品。
那么,一个购物车类就出来了,如下:
import java.util.ArrayList;
import java.util.List;
public class ShopCar{
private List mlist = new ArrayList();
public void add(Electronics electronics){
mlist.add(electronics);
}
public int getSize(){
return mlist.size();
}
public Electronics getListItem(int position){
return mlist.get(position);
}
}
List 集合是用来存放电子产品的,add 方法用来添加电子产品到购物车,getSize 方法用来获取存放的电子产品数量,getListItem 方法用来获取相应的电子产品。
可以看到 List 用了泛型的知识,至于为什么要用泛型?这个不做介绍了,泛型很重要的。
而我觉得比较疑惑的是为什么是放 Electronics 的泛型,而不是放Thinkpad,Mouse,Keyboard,Phone等?
那么如果是List,肯定是放不进鼠标Mouse的吧,难道要生成3个集合?这里是定义了3个电子产品类,但是我如果有100种电子产品呢,要定义100个集合?
这太可怕了。所以之前,我们写了一个Electronics接口,提供了一个Electronics的标准,然后让每一个Electronics子类都去实现这个接口。
实际上这里又涉及到了向上转型的知识点,我们虽然在add 方法将子类实例传了进来存放,但子类实例在传进去的过程中也进行了向上转型
所以,此时购物车里存放的子类实例对象,由于向上转型成Electronics,已经丢失了子类独有的方法,以上述例子来分析,Thinkpad实例就是丢失了boot() 和program() 这两个方法,而Mouse实例就是丢失了move()和onClick()这两个方法
但是实际使用Thinkpad或Mouse或Keyboard时,这种情况肯定不是我们想要的
接着我们写一个测试类 Test 去测试购物车里的电子产品。
测试类 Test 如下:
public class Test{
public static final int THINKPAD = 0;
public static final int MOUSE = 1;
public static final int KEYBOARD = 2;
public static void main(String[] args){
//添加进购物车
ShopCar shopcar = new ShopCar();
shopcar.add(new Thinkpad());
shopcar.add(new Mouse());
shopcar.add(new Keyboard());
//获取大小
System.out.println("购物车存放的电子产品数量为 ——> "+shopcar.getSize());
//开始测试thinkpad电脑
Thinkpad thinkpad = (Thinkpad)shopcar.getListItem(THINKPAD);
thinkpad.boot();
thinkpad.program();
System.out.println("-------------------");
//开始测试Mouse鼠标
Mouse mouse = (Mouse)shopcar.getListItem(MOUSE);
mouse.move();
mouse.onClick();
System.out.println("-------------------");
//开始测试Keyboard键盘
Keyboard keyboard = (Keyboard)shopcar.getListItem(KEYBOARD);
keyboard.input();
}
}
运行截图:
-
Java 向下转型的意义
2020-12-22 18:16:27一开始学习 Java 时不重视向下转型。一直搞不清楚向下转型的意义和用途,不清楚其实是不会,那开发的过程肯定也想不到用向下转型。 其实向上转型和向下转型都是很重要的,可能我们平时见向上转型多一点,向上转型... -
java的向下转型_java 向上转型和向下转型
2021-03-01 10:16:35学习向上转型和向下转型怎么用没多难,但是为什么那样用,我搞了很多次没弄明白。没弄明白的原因是平时学习时之看例子,而例子一般都比较简单,没有对象之间的调用,一般就是一个对象调用自己的方法。首先看下怎么用... -
java的向下转型_浅谈Java向下转型的意义
2021-02-12 14:15:44一开始学习 Java 时不重视向下转型。一直搞不清楚向下转型的意义和用途,不清楚其实就是不会,那开发的过程肯定也想不到用向下转型。其实向上转型和向下转型都是很重要的,可能我们平时见向上转型多一点,向上转型也... -
Java 向上转型和向下转型的详解
2020-08-30 16:17:56主要介绍了 Java 向上转型和向下转型的详解的相关资料,需要的朋友可以参考下 -
java向下转型有何用途_Java中向下转型的意义
2021-03-08 10:30:12一开始学习 Java 时不重视向下转型。一直搞不清楚向下转型的意义和用途,不清楚其实就是不会,那开发的过程肯定也想不到用向下转型。其实向上转型和向下转型都是很重要的,可能我们平时见向上转型多一点,向上转型也... -
java继承向上向下转型_java向上向下转型
2021-03-09 04:56:21转型是在继承的基础上而言的,继承是面向对象语言中,代码复用的一种机制,通过继承...此处父类对象可以是接口向下转型:父类引用的对象转换为子类类型称为向下转型。前者是一个向上转型,Animal dog 引用指向new Do... -
java多态向下转型_Java多态之向下转型
2021-02-28 11:46:46Java多态之向下转型往期回顾:我们学习了向上转型和动态绑定的概念,可以知道在继承关系中,将一个子类对象赋值给父类的引用变量,调用父类的方法,在实际运行时,就可以根据子类中重写的方法执行不同的操作。... -
Java向下转型以及如何判断能否向下转型
2018-05-11 11:04:37那我们怎么样才能既实现向上转型,又能使子类可以调用其独有的方法呢,这就需要使用向下转型了。 注意 向下转型必须是在向上转型之后才能进行。 我们还是以汽车为例。 首先是Car这个父类。... -
向下转型 java特性_JAVA:向下转型和instanceof运算符的应用
2021-03-15 03:34:01知识梳理一:向下转型1.向下转型:向下转型是与向上转型相对的概念,他是用子类引用指向父类实例.如:Animal animal = new Dog();Dog d = animal;// 报错这时就告诉我们向下转型不能自动转换,我们需要强转,所以向下转型... -
java 向下转型 作用_java向下转型的作用
2021-03-22 13:55:10这些属性在操作时所有的属性名称都使用 String 进行接收, 所有的属性内容使用 Object 进行接收,可以保存任意的对 象,在取得属性时要根据取得的类型进行向下转型操作......equals()——作用,对象的比较 ? 多态(难点) ... -
java向下转型有何用途_浅谈Java向下转型的意义
2021-03-08 10:30:17一开始学习 Java 时不重视向下转型。一直搞不清楚向下转型的意义和用途,不清楚其实就是不会,那开发的过程肯定也想不到用向下转型。其实向上转型和向下转型都是很重要的,可能我们平时见向上转型多一点,向上转型也... -
Java向上转型和向下转型
2017-07-20 15:43:38Java向上转型和向下转型 -
Java向上转型、向下转型
2021-03-19 22:01:02向上转型、向下转型 -
java下转型_Java向下转型的意义
2021-02-27 14:28:08一开始学习 Java 时不重视向下转型。一直搞不清楚向下转型的意义和用途,不清楚其实就是不会,那开发的过程肯定也想不到用向下转型。其实向上转型和向下转型都是很重要的,可能我们平时见向上转型多一点,向上转型也... -
Java向上转型和向下转型实例解析
2020-08-25 01:54:01主要介绍了Java向上转型和向下转型实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 -
向上转型和向下转型
2021-04-14 16:26:23java向上转型和向下转型【包括类和接口的转型】 向上转型:指子类对象转换为父类对象。 1.父类 对象= new 子类,无需强转,丢弃子类的方法。 2.当调用对象的方法时,如果子类有覆盖方法,就听从子类的方法。 3.... -
java 向下转型
2021-01-24 17:00:55文章目录一、向下转型是什么?二、简单实例三、使用场景 一、向下转型是什么? Java多态中向上转型比较常见,因为只要使用到多态就会用到,向上转型,那么向下转型是什么呢,这里就是把父类引用转成子类引用,具有... -
java 泛型向下转型_Java向上转型和向下转型(附具体样例)
2021-02-28 19:09:17Java向上转型和向下转型(附具体样例)熬夜整理的关于Java向上和向下转型的样例,很的通俗易懂哦~~~~一.向上转型package com.sheepmu;class Animal{public void eat(){System.out.println("父类的 eating...");}}class... -
Java 向上转型 向下转型 instanceof
2020-04-24 08:45:12看过的一些比较好的博文 Person per = new Student();... //向下转型 Java向上转型和向下转型的通俗简单理解以及使用用途 Java向下转型的意义 多态的向上转型,向下转型,及instanceof的用法 ...