首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

子类不能应用于超类Java

在面向对象编程中,子类不能应用于超类是指在Java中,子类对象不能直接赋值给超类类型的变量。这是因为子类继承了超类的属性和方法,但超类不具备子类特有的属性和方法。

子类和超类之间存在继承关系,子类可以继承超类的属性和方法,并且可以通过方法重写和方法重载来扩展或修改超类的行为。但是,由于子类可能包含超类没有的属性和方法,所以将子类对象直接赋值给超类类型的变量可能导致超类无法访问子类特有的成员。

例如,假设有一个超类Animal和一个子类Dog,其中Dog是Animal的子类。Animal类有一个属性name和一个方法eat(),而Dog类除了继承了Animal的属性和方法外,还有一个特有的方法bark()。

代码语言:java
复制
class Animal {
    String name;
    
    void eat() {
        System.out.println("Animal is eating");
    }
}

class Dog extends Animal {
    void bark() {
        System.out.println("Dog is barking");
    }
}

如果我们尝试将Dog对象赋值给Animal类型的变量,编译器会报错:

代码语言:java
复制
Dog dog = new Dog();
Animal animal = dog; // 编译错误

这是因为animal变量是Animal类型的,无法访问Dog类特有的方法bark()。

解决这个问题的一种方法是使用类型转换,将子类对象转换为超类类型。但是需要注意的是,只有在确保转换后的对象是超类的实例时,才能进行类型转换,否则会抛出ClassCastException异常。

代码语言:java
复制
Dog dog = new Dog();
Animal animal = (Animal) dog; // 合法的类型转换

animal.eat(); // 可以访问超类的方法
((Dog) animal).bark(); // 合法的类型转换,可以访问子类特有的方法

总结起来,子类不能应用于超类是Java语言中的一个基本规则,这是为了确保类型安全和编译时的正确性。在实际开发中,我们应该根据需求和设计原则合理使用继承和多态,遵循面向对象的设计原则,以提高代码的可维护性和扩展性。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云服务器(CVM):提供弹性、安全、稳定的云服务器实例,满足各种计算需求。
  • 腾讯云云数据库 MySQL 版:基于云计算和分布式存储架构的关系型数据库服务,提供高可用、高性能、可弹性扩展的数据库解决方案。
  • 腾讯云对象存储(COS):提供安全、稳定、低成本的云端对象存储服务,适用于图片、音视频、文档等海量数据的存储和访问。
  • 腾讯云人工智能:提供丰富的人工智能服务和解决方案,包括图像识别、语音识别、自然语言处理等领域。
  • 腾讯云物联网(IoT):提供全面的物联网解决方案,包括设备接入、数据采集、数据存储和应用开发等功能。
  • 腾讯云区块链:提供安全、高效、易用的区块链服务,支持企业级区块链应用的开发和部署。
  • 腾讯云音视频处理:提供音视频处理和分发的解决方案,包括转码、截图、水印、直播等功能。
  • 腾讯云移动开发:提供移动应用开发和运营的云端服务,包括移动应用托管、推送服务、移动分析等功能。

请注意,以上仅为腾讯云的一些相关产品,其他云计算品牌商也提供类似的产品和服务。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

5.1 子类

5.1 子类   子类拥有的功能更加丰富。   在本例中,Manager类比Employee封装了更多的数据,拥有更多的功能。   ...在通过扩展定义子类的时候,仅需要指出子类的不同之处,因此,会将通用的方法放在中,而将具有特殊用途的方法放在子类中,这种将通用的功能放在的方法,在面向对象程序设计中十分普遍。   ...getSalary方法不能直接地访问的私有域。...public double getSalary() { //通过子类的getSalary方法不能获得的salary域 //所以以下这种方式也是错误的...可以将一个子类变量赋给一个变量,但不能将一个变量赋给一个子类变量。 5.1.3 动态绑定   调用方法的过程可以分解为:   (1)编译器查看对象的声明类型和方法名。

1K90

子类,多态,上转型,下转型

void eat(){ //super.eat(); //静态方法中不能用super System.out.println("我是静态的,子类吃!")...parent=new SuperClass(); ChildClass child=new ChildClass(); ChildClass.think(); //1.子类可直接调用父方法...child.say(); //2.子类方法重写并调用父方法 child.go(); //3.子类对象可以调父的非静态方法...child.think(); //4.子类对象可以调父的静态方法 child.usePareStaticThink(); //5.子类方法可以调用父静态方法(用super...我是父说! 我是子类说! 我是父走! 我是静态的,父想! 我是静态的,父想! 向上转型(多态): 我是父说! 我是子类说! 我是静态的,父想! 我是静态的,父想!

16910

Java中的静态方法不能子类重写

参考链接: 可以在Java中重载或重写静态方法吗 Java中的静态方法不能子类重写 特点:静态方法属于的方法,也属于对象的方法,但是静态方法随的存在。...结论:Java中的静态方法不能子类重写,实际上,子类的静态方法隐藏了父的静态方法,因此父子类的静态方法同时存在,只不过父通过名(或对象名)调用的是父的静态方法,子类通过名(或对象名)调用的是子类的静态方法...{         Father f1 = new Son();         f1.methon();            // static(静态)方法的调用,不支持多态,所以此处调用的父的静态方法...(final,private 方法也如此) (2)静态方法可通过名直接调用,也可通过的实例化对象调用,因此Father 的实例化对象f1调用的是父(不是子类)的静态方法。...        f2.methon();       // 调用父的静态方法,此处竟然不出错,表明了静态方法的特殊性     } } class Father {     public static

2.1K20

Java强制转换子类原则

最近,微信群友在讨论子类的转换问题,其实不难,给大家用实例来说明一下就很明了了。 我们知道Java子类转换成父是没有任何问题的,那父可以转换成子类吗?...Fruit fruit1 = new Fruit(); Apple apple1 = new Apple(); apple1 = (Apple) fruit1; // java.lang.ClassCastException...} static class Fruit { } static class Apple extends Fruit { } } 结果是: test1:报转异常...所以,想让父强制转换成子类,不是没有可能,除非父子类构造出来的实例,不然是不能强转的。 为什么呢?...如上代码,如果父实例出来的对象是Orange,Orange当然不能强制转成Apple,所以说父只有该子类对应的实例才能强转。

2.2K80

java引用指向子类对象好处_java子类调用父类属性

,为了规避风险,Java只允许单继承,势必在功能上有很大的限制,所以,Java引入多态性的概念以弥补这点不足,此外,抽象和接口也是解决单继承规定限制的重要手段.同时,多态也是面向对象编程的精髓所在....子类覆盖父实现多态: 如果子类继承的是一个抽象,虽然抽象不能通过new操作符实例化,但是可以创建抽象的对象引用指向子类对象,以实现运行时多态性,不过,抽象子类必须覆盖实现中的所有的抽象方法...,否则子类必须被abstract修饰符修饰,当然也就不能被实例化了 重写父方法: //父 public class Father{ //父有一个打孩子方法 public void hitChild...,将会调用子类中 的这个方法;(动态连接、动态调用) 四、变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父 中的变量,那么在编译时会报错。...所以可以实现强转… 4.static 顾名思义,就是静态的,他是方法的,他属于这个,由于是的方法,他可以直接引用名来引用方法,也可以通过的对象来引用这个方法,他既不能子类覆盖,也不能子类继承

1.1K20

为什么子类引用不能指向父对象

java、C++等面向对象的语言中,实现多态的方式就是使用父引用指向子类对象,所以父引用指向子类对象是没有任何为题的,但是,大家有没有想过,子类引用可以指向父对象吗?答案是不可以!...下图是在java中,使用子类引用指向父对象的情况 ? 编译可以通过,因为对生成的Person对象做了一个强制转换,骗过了编译器,其本质上还是属于子类引用指向父对象。...很明显,java虚拟机在运行该行代码的时候进行了运行时检测,禁止子类引用指向父对象。 所以,这种操作在java里面是不允许的,接下来,我们把代码拷贝一下,在C++的环境再跑一下。 ?...接下来,我们来看一下,下面两行的反汇编代码,因为Student继承于Person,因此Student里面有age和stuId两个变量,又因为是公有的,所以stu可以访问这两个变量的地址,我们对这两个值进行赋值操作...因此,无论在C++还是java中,都是应该禁止掉这种行为的,只是java做了运行时检测,而C++并没有而已。 完

2.4K31

Java子类和父的构造函数?

参考链接: Java中的继承和构造函数 这篇文章总结了关于Java构造的常见​​问题。  1)为什么创建一个子类对象要也需要调用父的构造函数? ...如果没有,编译器会插入调用父构造的语句。这就是为什么在创建子类对象时父中的构造函数会被调用。  这里没有创建两个对象,只有一个子对象。...在Java中,如果一个没有定义构造函数,编译器会为默认创建一个无参构造函数。如果在父中定义了构造函数super(String s),在这种情况下,编译器将不会为创建一个无参构造函数。...这是上边的Super发生的情况。  子类的构造函数,无论有参构造还是无参构造,将会调用父中的默认的无参构造函数。...3)子类中的显式调用父构造函数  下面的代码是正常的:    子类(Sub)构造函数显式地调用父(Super)中的带参构造参数。如果父中定义了相对应的构造函数,那将会被正常良好的调用。

2K20

再谈包访问权限 子类为何不能使用父protected方法

:子类中访问父的protected方法 并且觉得很奇怪,并且认为  子类不同包中并不能访问父的protected方法 其实这是概念错了 虽然是在子类中,但是却是使用父的对象,调用父的protected...方法 这是在不同包中,访问protected方法 当然是错误的   protected的含义是指子类可以访问,说的是子类直接访问父的protected方法 而不是说子类中,可以调用父的对象访问父的...子类继承父所有的成员 包括 属性方法以及嵌套,不包括构造方法 子类继承所有的public和protected 的成员 子类不继承私有的成员,不过如果父中有public或者protected 方法访问私有成员...,子类可以使用 子类继承了父的protected方法,所以子类有这个方法,所以子类可以使用,但是子类不能读取某个父对象的保护方法的(在包外) 继承是继承的结构,跟任何具体的对象的数据没关系,所以子类不能创建父的对象然后调用父的...protected方法,不能在包外访问protected方法 但是如果父的方法是protected static的,可以在子类中创建父对象然后调用方法 因为子类是继承的父的,着重点在于,继承了的成员

1.7K30

面向对象程序设计中“”和“子类”概念的来历

众所周知,在面向对象程序设计中,子类中继承数据成员和成员方法,然后在此基础上再根据实际需要进行扩展并增加属于子类的数据成员和成员方法。...也就是说,子类的对象比的对象具有更加丰富的属性,或者具有更多的行为。或者说,子类的功能比的功能更加强大。那么为什么不把子类叫做呢? ?...实际上,子类的概念来自于集合论,借鉴了集和子集的概念。子集中的所有元素都属于其集,而集中并不是所有元素都属于子集。...同理,在面向对象程序设计中,所有子类对象都属于其的实例,而反过来则是不成立的。 ?

1.4K40

Java的加载机制---父子类的多态调用

3) 构造的时候,Java机制是到底先给属性分配空间并赋值,还是先处理 构造函数,换句话说,当我们使用new操作符生成一个对象的实例的时候,的加载机制是怎么样的, 如果这三个问题都搞定了,都理解了,...上面的程序就很容易理解为什么输出是null了 Java机制里面有这样的一个原则就是:如果父存在,子类可以不存在;如果子类存在,父必须存在; 怎么理解上面的这句话呢,可以用实际的例子来说明,一个人结婚了但是没有小孩...,对应着前半句的意思;如果他生了小孩,那么这个小孩子是一定有父亲的 到Java代码中这样看,如果我们实例化一个子类,必须先构造这个子类的父,否则是错误的。...Java子类加载的机制是第三个需要理解的地方: 1)相关的的加载机制还是跟  上面第二点相似,只是在子类初始化的时候必须先去初始化父 2)只有 等Java机制给子类和所有的父都分配了内存空间之后...baseName分配地址,地址变量指向null; 4)由于父不需要再也没有了,那么这个时候父子类的内存分配都做完了,接下来就是需要为  属性进行初始化的工作 5)首先是给父的baseName

2.7K40

Java子类和父间的调用关系

3、每个直接或间接是Object的子类,Object只有一个无参构造方法。...3、每个直接或间接是Object的子类,Object只有一个无参构造方法。   4、编译器会在每个构造方法的第一行隐式添加父的默认无参构造器,即添加super()。   ...Must explicitly invoke another constructo   因为父定义了一个带参数的构造器,因此编译器不会添加默认无参构造方法,但是因为在子类的构造器中没有显式调用父的某个构造方法...int id) {   }   }   class Teacher extends Employee {   public Teacher() {   super(10);   }   }   这样,在子类的构造器中显式调用了父的某个构造器...构造器的访问修饰符:   一般可以用public,protected,default和private修饰,但是对于private,子类是无法调用该类构造器的。

95030

JAVA面向对象编程】--- 探索子类如何继承父

; } } //1.this 会优先访问子类自己的,若子类无 ,才会访问父的. //2.super 只是一个关键字,在代码层面上,能够达到易读效果,可以用来访问父的内容及地址但是不能说成`是`引用...面试题: 1.this 会优先访问子类自己的,若子类无 ,才会访问父的. 2.super 只是一个关键字,在代码层面上,能够达到易读效果,可以用来访问父的内容及地址但是不能说成是引用...4.如果子类想要调用父的静态构造方法,可以在子类中通过方法名()进行访问 静态里面,不能用this 也不能用super 注意:子类构造方法中会默认调用无参构造方法: super(),...总结: 在子类构造方法中,并没有写任何关于基构造的代码,但是在构造子类对象(穿件对象)时,先执行基(父)的构造方法,然后执行子类的构造方法, 因为: **子类对象中成员是有两部分组成的...3.在子类构造方法中,super(...)调用父构造时,必须是子类构造函数中第一条语句。4.super(...)只能在子类构造方法中出现一次,并且不能和this同时出现

7010

Java子类与父之间的对象转换(说明继承)

参考链接: 父子类Java中具有相同的数据成员 在使用Java的多态机制时,常常使用的一个特性便是子类和父之间的对象转换。...因此,从子类向父的转换不需要什么限制,只需直接将子类实例赋值给父变量即可,这也是Java中的多态的实现机制。...所以,如果没有使用instanceof防止不同子类型之间的对象转换,而又不能指望编译器检查出这种转换逻辑错误的话,就很容易犯错了。...4、若子类未覆盖某属性,则父引用调用父本身的旧属性 5、父引用不能访问子类新定义的属性和方法 二、子类引用指向自身对象时 1、若子类覆盖了某方法,则子类引用调用子类重新定义的新方法 2、若子类未覆盖某方法...,父引用不能访问子类新定义方法          System.out.println(b.a);// 子类覆盖了该属性,但父引用仍旧访问旧属性          System.out.println

3.5K20

2017 年你不能错过的 Java

8 Lambda的友好支持 GitHu链接,官方网站链接 RxJava RxJava – JVM的响应式编程扩展 – 是一个为Java虚拟机编写的使用可观察序列的构建异步的基于事件的程序的库。...GitHub, Website Java简单日志门面(SLF4J) Java简单日志门面 (SLF4J) 为不同的日志框架(比如java.util.logging, logback, log4j)提供了简单的门面或者抽象的实现...简言之,库和其他嵌入式的组件都应该考虑采用SLF4J作为他们的日志需求,因为库无法将它们对日志框架的选择强加给最终用户。另一方面,对于独立的应用来说,就不一定需要使用SLF4J。...参数可以通过一个CSV字符串或者一个参数提供传入。 参数提供可以拥有尽可能多的参数提供方法,这样你可以给不同的用例进行分类。...快速入门 Mockito Java里单元测试的非常棒(tasty)的模拟框架: //你可以模拟具体的,而不只是接口 LinkedList mockedList = mock(LinkedList.class

99780
领券