java向上转型与向下转型详解

本文实例为大家分享了java向上转型与向下转型的具体代码,供大家参考,具体内容如下

基础知识:Java中的继承机制使得一个类可以继承另一个类,继承的类称为子类,被继承的类称为父类。在一个子类被创建的时候,首先会在内存中创建一个父类对象,然后在父类对象外部放上子类独有的属性,两者合起来形成一个子类的对象,所以子类可以继承父类中所有的属性和方法,包括private修饰的属性和方法,但是子类只是拥有父类private修饰的属性和方法,却不能直接使用它,也就是无法直接访问到它(子类可以通过调用父类的public声明的get方法来获取父类的private属性和private方法)。同时子类可以对继承的方法进行重写(@Override),并且新建自己独有的方法。

1.向上转型:

父类 : class Fruit {}
子类 : class Apple extends Fruit{}

创建向上转型对象 fruit ;
Fruit fruit = new Apple();
Apple 向上转型为父类
如果 Apple 中有重写父类方法,fruit 对象默认调用子类中重写方法

注意 :

fruit 可以直接访问子类重写方法。
fruit 不能直接访问子类私有方法、子类所有属性。
fruit 可以通过重写方法调用子类私有方法和属性
fruit 重写方法中调用方法和属性顺序 : 子类 -> 父类

其他 : 关于重写的返回值类:如果方法的返回类型是 void
和基本数据类型,则返回值重写时不可修改。但是如果方法的返回值是引用类型,重写时是可以返回该引用类型的子类的。

2.向下转型

注意 : 只有向上转型过的对象才能向下转型

向下转型为恢复子类所有功能。

Apple apple = (Apple) fruit;

3.(多态)作用

减少编程代码

例 : 一个方法调用三种子类

public class Demo {
    public static void run(Fruit fruit){
        fruit.show();
    }
    public static void main(String[] args) {
        run(new Apple());
        run(new Orange());
        run(new Banana());
    }
}

abstract class Fruit{
    abstract void show();
}

class Apple extends Fruit{
    @Override
    public void show(){
        System.out.println("apple");
    }
}

class Orange extends Fruit{
    @Override
    public void show(){
        System.out.println("orange");
    }
}

class Banana extends Fruit{
    @Override
    public void show(){
        System.out.println("banana");
    }
}

再进行向上转型

public class Demo {
    public static void run(Fruit fruit){
        fruit.show();

        if(fruit instanceof Apple){
            Apple apple = (Apple) fruit;
            apple.eatApple();
        }else if(fruit instanceof Orange){
            Orange orange = (Orange) fruit;
            orange.eatOrange();
        }else{
            Banana banana = new Banana();
            banana.eatBanana();
        }
    }
    public static void main(String[] args) {
        run(new Apple());
        run(new Orange());
        run(new Banana());
    }
}

abstract class Fruit{
    abstract void show();
}

class Apple extends Fruit{
    @Override
    public void show(){
        System.out.println("apple");
    }

    public void eatApple(){
        System.out.println("吃了一个apple");
    }
}

class Orange extends Fruit{
    @Override
    public void show(){
        System.out.println("orange");
    }

    public void eatOrange(){
        System.out.println("吃了一个orange");
    }
}

class Banana extends Fruit{
    @Override
    public void show(){
        System.out.println("banana");
    }

    public void eatBanana(){
        System.out.println("吃了一个banana");
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java向上转型和向下转型的区别说明

    目录 向上转型和向下转型的区别 1.代码实现 2.实现向下转型 3.此时执行程序 简单认识向上转型和向下转型 向上转型:父类引用指向子类对象 向下转型:子类引用指向父类对象 向上转型和向下转型的区别 前言: 向上转型:父类引用类型指向了子类的实例对象,此时无法使用子类里的成员变量以及方法. 向下转型:通过引用类型强转,恢复了子类的成员变量以及方法. 1.代码实现 可以发现,父类虽然指向了子类的实例对象,但是并不能调用子类对象的方法,编译器报错.此时我们可以看作被隐藏了,那么怎样才可以把被隐藏的方

  • Java向上转型和向下转型实例解析

    这篇文章主要介绍了Java向上转型和向下转型实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 学习向上转型和向下转型怎么用没多难,但是为什么那样用,我搞了很多次没弄明白.没弄明白的原因是平时学习时之看例子,而例子一般都比较简单,没有对象之间的调用,一般就是一个对象调用自己的方法. 首先看下怎么用转型. 要转型,首先要有继承.继承是面向对象语言中一个代码复用的机制,简单说就是子类继承了父类中的非私有属性和可以继承的方法,然后子类可以继续扩展

  • Java 转型(向上或向下转型)详解及简单实例

    在Java编程中经常碰到类型转换,对象类型转换主要包括向上转型和向下转型. 向上转型 我们在现实中常常这样说:这个人会唱歌.在这里,我们并不关心这个人是黑人还是白人,是成人还是小孩,也就是说我们更倾向于使用抽象概念"人".再例如,麻雀是鸟类的一种(鸟类的子类),而鸟类则是动物中的一种(动物的子类).我们现实中也经常这样说:麻雀是鸟.这两种说法实际上就是所谓的向上转型,通俗地说就是子类转型成父类.这也符合Java提倡的面向抽象编程思想.来看下面的代码: package a.b; publ

  • Java 向上转型和向下转型的详解

     Java 向上转型和向下转型的详解 转型是在继承的基础上而言的,继承是面向对象语言中,代码复用的一种机制,通过继承,子类可以复用父类的功能,如果父类不能满足当前子类的需求,则子类可以重写父类中的方法来加以扩展. 向上转型:子类引用的对象转换为父类类型称为向上转型.通俗地说就是是将子类对象转为父类对象.此处父类对象可以是接口 向下转型:父类引用的对象转换为子类类型称为向下转型. 前者是一个向上转型,Animal dog 引用指向new Dog();子类对象当成父类对象,只能调用父类的成员,如果子

  • Java 向上转型和向下转型的详解

     Java 向上转型和向下转型的详解 转型是在继承的基础上而言的,继承是面向对象语言中,代码复用的一种机制,通过继承,子类可以复用父类的功能,如果父类不能满足当前子类的需求,则子类可以重写父类中的方法来加以扩展. 向上转型:子类引用的对象转换为父类类型称为向上转型.通俗地说就是是将子类对象转为父类对象.此处父类对象可以是接口 向下转型:父类引用的对象转换为子类类型称为向下转型. 前者是一个向上转型,Animal dog 引用指向new Dog();子类对象当成父类对象,只能调用父类的成员,如果子

  • java向上转型与向下转型详解

    本文实例为大家分享了java向上转型与向下转型的具体代码,供大家参考,具体内容如下 基础知识:Java中的继承机制使得一个类可以继承另一个类,继承的类称为子类,被继承的类称为父类.在一个子类被创建的时候,首先会在内存中创建一个父类对象,然后在父类对象外部放上子类独有的属性,两者合起来形成一个子类的对象,所以子类可以继承父类中所有的属性和方法,包括private修饰的属性和方法,但是子类只是拥有父类private修饰的属性和方法,却不能直接使用它,也就是无法直接访问到它(子类可以通过调用父类的pu

  • java向上转型发生的时机知识点详解

    1.直接赋值 public static void main(String[] args) { //父类引用 引用了 子类引用所引用的对象 Animal animal = new Cat();;//向上转型 } 2.方法传参 把一个Cat的子类传给一个Animal类型的父类,这里也是能发生向上转型的. public class Test extends TestDemo { public static void func(Animal animal) { } public static void

  • java安全编码指南之:Number操作详解

    简介 java中可以被称为Number的有byte,short,int,long,float,double和char,我们在使用这些Nubmer的过程中,需要注意些什么内容呢?一起来看看吧. Number的范围 每种Number类型都有它的范围,我们看下java中Number类型的范围: 考虑到我们最常用的int操作,虽然int的范围够大,但是如果我们在做一些int操作的时候还是可能超出int的范围. 超出了int范围会发送什么事情呢?看下面的例子: public void testIntege

  • Java并发编程之阻塞队列深入详解

    目录 1. 什么是阻塞队列 2. 阻塞队列的代码使用 3. 生产者消费者模型 (1)应用一:解耦合 (2)应用二:削峰填谷 (3)相关代码 4.阻塞队列和生产者消费者模型功能的实现 1. 什么是阻塞队列 阻塞队列是一种特殊的队列,和数据结构中普通的队列一样,也遵守先进先出的原则同时,阻塞队列是一种能保证线程安全的数据结构,并且具有以下两种特性:当队列满的时候,继续向队列中插入元素就会让队列阻塞,直到有其他线程从队列中取走元素:当队列为空的时候,继续出队列也会让队列阻塞,直到有其他线程往队列中插入

  • Java泛型映射不同的值类型详解及实例代码

    Java泛型映射不同的值类型详解 前言: 一般来说,开发人员偶尔会遇到这样的情形: 在一个特定容器中映射任意类型的值.然而Java 集合API只提供了参数化的容器.这限制了类型安全地使用HashMap,如单一的值类型.但如果想混合苹果和梨,该怎样做呢? 幸运的是,有一个简单的设计模式允许使用Java泛型映射不同的值类型,Joshua Bloch在其<Effective Java>(第二版,第29项)中将其描述为类型安全的异构容器(typesafe hetereogeneous Containe

  • Java中Arrays类与Math类详解

    Arrays(数组工具类) Java中已经封装好的类,提供大量静态方法供用户对数组的使用. 导包:import java.util.Arrays 1.Arrays.toString(数组) //返回值是一个[]括起来的字符串,将数组中的元素放入[]中 int[] arr=new int[]{1,2,3,4}; String str=Arrays.toString(arr); System.out.println(str); -------------------------------- [1,

随机推荐