-
2021-03-13 20:45:53
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
class A{
private String s1 = "A1" ;
public String s2 = "A2" ;
public String get(){
return s2 ;
}
public String getS1(){
return s1 ;
}
}
class B extends A{
private String s1 = "B1" ;
public String s2 = "B2" ;
public String get(){
return s2 ;
}
public String getS1(){
return s1 ;
}
}
public class test{
public static void main(String[] args){
A b = new B() ;
System.out.println(b.get()) ;
System.out.println(b.getS1()) ;
System.out.println(b.s2) ;
}
}
结果:
B2
B1
A2
结论:
类在向上转型后,private的属性依然是子类的属性,因为private不能直接访问,需要提供对外方法,而方法在向上转型后依然是子类的方法,所以private的属性不会改变而非private的属性在向上转型后都会改变.方法在向上转型后是不会改变的.
总而言之,向上转型后,直接访问的属性会转型成基类的属性,方法还是子类的方法,通过子类的方法返回的字段值还是子类的值!
更多相关内容 -
Java 向上转型和向下转型的详解
2020-08-30 16:17:56主要介绍了 Java 向上转型和向下转型的详解的相关资料,需要的朋友可以参考下 -
Java向上转型
2021-03-05 15:21:05向上类型转换:1.可以通过父类引用变量调用的方法是子类覆盖或继承父类的方法。2.父类引用变量无法调用子类新增成员变量和新增成员方法。举个例子public classAnimal {public voidsleep() {System.out.println(...向上类型转换:
1.可以通过父类引用变量调用的方法是子类覆盖或继承父类的方法。
2.父类引用变量无法调用子类新增成员变量和新增成员方法。
举个例子
public classAnimal {
public voidsleep() {
System.out.println("Animal sleep");
}
public voidjump(){
System.out.println("Animal jump");
}
}
class Tom extendsAnimal {
@Override
public voidsleep() {
System.out.println("Tom sleep");
}
public voidjump() {
System.out.println("Tom jump");
}
public static voidmain(String[] args) {
Animal animal = new Tom();//向上转型
animal.sleep();
// animal.jump();
// animal.jump(); 找不到这个方法
}
}
class Jerry extendsAnimal{
public voidsleep() {
System.out.println("Jerry sleep");
}
public voidjump() {
System.out.println("Jerry jump");
}
}
可以看到父类引用变量animal指向子类对象,Animal.sleep的结果是:
Tom sleep
而且animal不能调用子类中新增的方法,这是向上转型的不足之处,那么向上转型的作用体现在哪里呢?我们再创建一个类和一个测试类
public classAction{
public voidmotion(Tom tom){
tom.sleep();
}
public voidmotion(Jerry jerry){
jerry.sleep();
}
}
public classTest {
public static voidmain(String[] args) {
Tom tom = newTom();
Jerry jerry = newJerry();
Action action= newAction();
action.motion(tom);
action.mootion(jerry);
}
}
Action类中有多个motion()方法,feed()的参数都是Animal类的子类。如果频繁修改,代码可扩展性、可维护性差。如何优化呢,使用多态,同一个引用类型,使用不同的实例操作不同的对象;
修改Action类:
public class Action {
// public void motion(Tom tom){
// tom.sleep();
// }
//
// public void motion(Jerry jerry){
// jerry.sleep();
// }
public void motion(Animal animal){
animal.sleep();
}
}
修改完Action后结果是一样的,如此一来,无所谓有多少个子类继承Animal都不需要继续添加motion方法了。
-
JAVA向上转型
2022-03-22 08:41:091、向上转型中的方法调用: 示例 public class Animal { public void eat(){ System.out.println("animal eatting..."); } } class Bird extends Animal{ public void eat(){ System.out.println("bird eatting......通俗地讲即是将子类对象转为父类对象。此处父类对象可以是接口。
1、向上转型中的方法调用:
示例
public class Animal { public void eat(){ System.out.println("animal eatting..."); } } class Bird extends Animal{ public void eat(){ System.out.println("bird eatting..."); } public void fly(){ System.out.println("bird flying..."); } } class Main{ public static void main(String[] args) { Animal b=new Bird(); //向上转型 b.eat(); //! error: b.fly(); b虽指向子类对象,但此时丢失fly()方法 dosleep(new Male()); dosleep(new Female()); } public static void dosleep(Human h) { h.sleep(); } }
示例
public class Human { public void sleep() { System.out.println("Human sleep.."); } } class Male extends Human { @Override public void sleep() { System.out.println("Male sleep.."); } } class Female extends Human { @Override public void sleep() { System.out.println("Female sleep.."); } }
注意这里的向上转型:
此处将调用子类的 eat() 方法。原因:b 实际指向的是 Bird 子类,故调用时会调用子类本身的方法。
需要注意的是向上转型时 b 会遗失除与父类对象共有的其他方法。如本例中的 fly 方法不再为 b 所有。
2、向上转型的好处
看上面的代码:
public static void dosleep(Human h) { h.sleep(); }
这里以父类为参数,调用时用子类作为参数,就是利用了向上转型。这样使代码变得简洁。不然的话,如果 dosleep 以子类对象为参数,则有多少个子类就需要写多少个函数。这也体现了 JAVA 的抽象编程思想。
-
java向上转型向下转型
2012-09-04 10:44:18java转型 -
Java向上转型和向下转型实例解析
2020-08-25 01:54:01主要介绍了Java向上转型和向下转型实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 -
Java向上转型跟向下转型(附详细例子)
2021-04-23 18:03:50Java向上转型和向下转型(附详细例子)Java向上转型和向下转型(附详细例子)熬夜整理的关于Java向上和向下转型的例子,非常的通俗易懂哦~~~~一.向上转型package com.sheepmu;class Animal{public void eat(){System.out...Java向上转型和向下转型(附详细例子)
Java向上转型和向下转型(附详细例子)
熬夜整理的关于Java向上和向下转型的例子,非常的通俗易懂哦~~~~
一.向上转型
package com.sheepmu;
class Animal
{
public void eat()
{
System.out.println("父类的 eating...");
}
}
class Bird extends Animal
{
@Override
public void eat()
{
System.out.println("子类重写的父类的 eatting...");
}
public void fly()
{
System.out.println("子类新方法 flying...");
}
}
public class Sys
{
public static void main(String[] args)
{
Animal b=new Bird(); //向上转型
b.eat();
// b.fly(); b虽指向子类对象,但此时子类作为向上的代价丢失和父类不同的fly()方法
sleep(new Male());
sleep(new Female());//传入的参数是子类-----!!
}
public static void sleep(Human h) //方法的参数是父类------!!!
{
h.sleep();
}
}package com.sheepmu;
public class Human
{
public void sleep()
{
System.out.println("父类人类 sleep..");
}
}
class Male extends Human
{
@Override
public void sleep()
{
System.out.println("男人 sleep..");
}
}
class Female extends Human
{
@Override
public void sleep()
{
System.out.println("女人 sleep..");
}
}输出:
子类重写的父类的 eatting...
男人 sleep..
女人 sleep..
详解:
1. 向上转型的实现
Animal b=new Bird(); //向上转型
b.eat(); // 调用的是子类的eat()方法
b.fly(); // 报错!!!!!-------b虽指向子类对象,但此时子类作为向上转型的代价丢失和父类不同的fly()方法------
2.为何不直接Bird b=new Bird();b.eat() 呢?
这样就没有体现出面向对象的抽象的编程思想呀,降低了代码的可扩展性.
3.向上转型的好处?
sleep(new Male());//调用方法时传入的参数是子类
sleep(new Female());
public static void sleep(Human h) //方法的参数是父类
{
h.sleep();
}
如上代码就是用的向上转型,若是不用向上转型,那么有多少个子类就得在这儿写多少种不同的睡觉方法~~~~~~
二.向下转型
package com.sheepmu;
class Fruit
{
public void myName()
{
System.out.println("我是父类 水果...");
}
}
class Apple extends Fruit
{
@Override
public void myName()
{
System.out.println("我是子类 苹果...");
}
public void myMore()
{
System.out.println("我是你的小呀小苹果~~~~~~");
}
}
public class Sys{
public static void main(String[] args) {
Fruit a=new Apple(); //向上转型
a.myName();
Apple aa=(Apple)a; //向下转型,编译和运行皆不会出错(正确的)
aa.myName();//向下转型时调用的是子类的
aa.myMore();;
Fruit f=new Fruit();
Apple aaa=(Apple)f; //-不安全的---向下转型,编译无错但会运行会出错
aaa.myName();
aaa.myMore();
}
}输出:
我是子类 苹果...
我是子类 苹果...
我是你的小呀小苹果~~~~~~
Exception in thread "main" java.lang.ClassCastException: com.sheepmu.Fruit cannot be cast to com.sheepmu.Apple
at com.sheepmu.Sys.main(Sys.java:30)
详解:
1.正确的向下转型
Fruit a=new Apple(); //向上转型
a.myName();
Apple aa=(Apple)a; //向下转型,编译和运行皆不会出错(正确的)
aa.myName();
aa.myMore();
a指向子类的对象,所以子类的实例aa也可以指向a啊~~
向下转型后因为都是指向子类对象,所以调用的当然全是子类的方法~~
2.不安全的向下转型
Fruit f=new Fruit();
Apple aaa=(Apple)f; //-不安全的---向下转型,编译无错但会运行会出错
aaa.myName();
aaa.myMore();
f是父类对象,子类的实例aaa肯定不能指向父类f啊~~~
3.Java为了解决不安全的向下转型问题,引入泛型的概念
4.为了安全的类型转换,最好先用 if(A instanceof B) 判断一下下~~
-
java向上转型实质
2021-03-11 15:51:43展开全部java 转型问题其实并不复杂,只要记62616964757a686964616fe4b893...从2个名词开始说起:向上转型(upcasting) 、向下转型(downcasting).举个例子:有2个类,Father是父类,Son类继承自Father。Father f1 = ... -
java 向上转型与向下转型
2022-05-01 21:56:07基础知识:Java中的继承机制使得一个类可以继承另一个类,继承的类称为子类,被继承的类称为父类。在一个子类被创建的时候,首先会在内存中创建一个父类对象,然后在父类对象外部放上子类独有的属性,两者合起来形成... -
Java 向上转型中属性和方法的调用规则
2022-02-25 10:25:04Java 向上转型中属性和方法的调用规则: 调用属性看父类,调用方法先看子类,子类没有,再看父类。 -
java 向上转型有什么用?
2021-02-25 19:17:13但是向上转型的应用场景是什么呢?我看到网上有的说是为了获取父类的方法,子类也可以访问父类的方法啊,就算是覆盖的方法,也可以通过super.方法()来访问父类的方法啊。2.代码代码来源是《深入剖析Tomcat》第二章的... -
Java 向上转型和向下转型
2021-04-19 21:30:08多态的向上转型: (1)本质:父类的引用指向了子类对象 (2)语法: 父类类型 引用名 = new 子类类型(); (3)特点(规则):编译类型看左边,运行类型看右边。 可以调用父类中的所有成员(遵守访问权限)(实际... -
java向上转型.doc
2022-03-18 21:07:50java向上转型.doc -
java向上转型和向下转型该如何理解
2021-02-12 09:41:19在java里这个叫向上转型。还有一种情况的向上转型,new出来一个类的对象赋值给了此类实现的一个接口,我称之为瘦身,只不过,接口的向上转型和类的向上转型是有区别的。 在这里,我们只讨论类和接口的转型。同样向下... -
Java向上转型及内存分析
2021-03-15 16:46:22学习设计模式的时候,发现很多模式都用到了向上转型(eg. 工厂方法)。而我对向上转型(upcasting)的机制并不十分熟悉。这篇文章将深入分析向上转型的机制、内存分析。概念先从几个基本概念开始:1. Java中的引用类型... -
java向上转型的作用
2019-08-22 17:38:32java向上转型的作用 关于向上转型的作用,我们从一段代码引入: public class Animal { String name = "我是动物"; static int age = 20; public void eat() { System.out.println("动物可以吃饭"); } ... -
java之向上转型
2020-12-21 08:22:36向上转型经典案例向上转型向上转型应注意的问题向上转型的好处静态方法的调用 经典案例 public class Animal { public void eat(){ System.out.println("animal eatting..."); } } public class Cat extends ... -
Java向上转型和向下转型(附具体样例)
2021-02-28 19:09:17Java向上转型和向下转型(附具体样例)熬夜整理的关于Java向上和向下转型的样例,很的通俗易懂哦~~~~一.向上转型package com.sheepmu;class Animal{public void eat(){System.out.println("父类的 eating...");}}class... -
Java向上转型与方法调用
2020-10-24 19:05:08向上转型方法与作用 父类名 引用变量名= new 子类名() 向上转型的作用在于让代码复用,提高代码简洁性,同个继承链的类可以用同个顶层类型表示参数。 如将子类对象作为实参,传进父类为形参的函数,即可不必为每一... -
java向上转型和向下转型
2019-11-13 08:53:52我们知道,java这个狗一样的东西的三大特性:继承,封装,多态。 然后继承和多态带来的一个比较拗口的问题就是,对象转型问题,我们今天就来扯一下。 首先,规定一下转型的概念,我套用一下黄小斜大神在github上的... -
Java向上转型和向下转型
2020-04-01 16:11:35在Java中有继承关系的类及接口中存在两种动作即向上转型和和向下转型,以更好地实现多态 -
java向上转型
2018-12-14 23:54:48我的第一篇博客--java向上转 理解: 1. 测试方法参数是父类,传入子类参数,子类向上转型成父类类型, 2. java后期绑定的理解 2. 多态的初步理解 -
Java 向上转型 向下转型 instanceof
2020-04-24 08:45:12看过的一些比较好的博文 Person per = new Student(); //向上转型 Student stu = ...Java向上转型和向下转型的通俗简单理解以及使用用途 Java向下转型的意义 多态的向上转型,向下转型,及instanceof的用法 ... -
Java向上转型作用的理解
2018-07-15 18:00:15今天看到一道Java的练习题,题目如下 当时对于主函数中 Car car =(Car) new Benz(); 不是很理解,也并不知道有什么意义,因为... 在经过阅读书籍和查看别的博主写的关于向上向下转型的博客后,发现题目中这么... -
Java 向上转型和向下转型的理解
2020-08-19 16:49:07Java 转型可以分三种情况,分别是:向上转型、向下转型、出错 1、向上转型 是指父类引用指向子类对象。代码如下: Father A = new Son(); // 向上转型 2、向下转型 是指子类引用指向由父类引用所指的子类对象 ... -
java 向上转型和向下转型的特点
2020-09-27 13:33:08基础知识java继承:Java中的继承机制使得一个类可以继承另一个类,继承的类称为子类,被继承的类称为父类。在一个子类被创建的时候,首先会在内存中创建一个父类对象,然后在父类对象外部放上子类独有的属性,两者合...