class A {
public void func1() {
System.out.println("A func1 is calling.");
}
public void func2() {
func1();
}
}
class B extend A {
public void func1() {
System.out.println("B func1 is calling.");
}
public void func3() {
System.out.println("B func3 is calling.");
}
}
class C {
public static void main(String[] args) {
B b = new B();
A a = b;
callA(a);
callA(new B());
}
public void callA(A a) {
a.func1();
a.func2();
}
}
编译器能够自动将类B的实例对象b直接赋值给A类的引用变量,也就是子类能够自动转换成父类类型。另外,程序可以直接创建一个类B的实例对象,传递给需要 类A的实例对象作参数的callA()方法,在参数传递的过程中发生了隐式自动类型转换。子类能够自动转换成父类的道理非常容易理解。
2、父类转换成子类
如果知道callA方法中传递的参数a实际上就是子类B的一个引用对象,想在callA方法中调用子类的特有方法,如何做:
public void callA(A a) {
a.func1();
a.func2();
a.func3();
}
编译有问题,因为对编译器来说,它只分析程序语法,它只知道变量a的引用类型是类A,而类A又没有func3这个方法,所以编译不通过。代码改为:
public void callA(A a) {
B b = a;
a.func1();
a.func2();
a.func3();
}
编译还是有问题,因为编译器是不能将父类对象自动转换成子类的。
public void callA(A a) {
B b = (B)a; //强制类型转换
a.func1();
a.func2();
a.func3();
}
-instanceof 操作符-
可以用instanceof判断是否一个类实现了某个接口,也可以用它来判断一个实例对象是否属于一个类
public void callA(A a) {
if(a instanceof B){
B b = (B)a;
a.func1();
a.func2();
a.func3();
} else {
a.func1();
a.func2();
}
}
只要记住:一个男人肯定也是人,一个人却不一定是男人的道理,就非常容易理解父类和子类之间的转换关系了。
分享到:
相关推荐
java多态性详解——父类引用子类对象
父类引用子类对象,父类对象和子类对象之间的引用关系和区别
java多态性详解——父类引用子类对象.pdf
NULL 博文链接:https://fuckdkjlfsaene.iteye.com/blog/767245
java训练题目 编写程序实现子类对父类构造方法的引用?
父类引用指向子类对象[归纳].pdf
本文实例讲述了C#中实现子类调用父类的方法,分享给大家供大家参考之用。具体方法如下: 一、通过子类无参构造函数创建子类实例 创建父类Person和子类Student。 public class Person { public Person() { ...
c++里,指针和引用是很重要的概念,这个程序不仅对指针和引用做了说明、使用,而且对子类不能继承父类虚函数也做了说明。
因为子类中有一个隐藏的引用super会指向父类实例,所以在实例化子类之前会先实例化一个父类,也就是说会先执行父类的构造方法,由于s中包含了父类的实例,所以s可以调用父类的方法。 下面我们来看一下代码:
父类引用指向子类对象时,没法调用子类特有的方法; 父类引用指向子类对象: java中子类强转父类,实际上依然是子类; 该引用只能调用父类中定义的方法和变量; 如果子类中重写了父类中的一个方法,那么在...
大家好,今天在写代码的时候,遇到了这样一种情况...感觉目前我使用的方法笨一点,就是直接引用父类的名字,感觉这样的方法不灵活,我想找一种方法,可以让子类访问到父类。 我在网上搜索了一下,找了这么两种方法,但
欢迎大家收看 把简单的问题变复杂系列 : ) 一、类型转换使用的情景: 在需要将一个继承链下把一个类的对象转换为另一个类的对象(注意:这里强调转换的是对象而不是类),更确切地说其实应该是引用类型和对象...
此例子介绍了c#中,父类可以代替子类做很多事情。 此例适合初学者。
今天小编就为大家分享一篇关于C++/JAVA/C#子类调用父类函数情况总结,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
3. 父类的析构函数是非虚的,但是子类的析构函数是虚的,delete子类指针(指向该子类对象)[特殊情况,参见题5],会调用父类的析构函数(正确)//任何情况下删除子类都会调用到父类的析构函数 4.对于下面的类CA,...
子类不能继承父类中访问权限为private的成员变量和方法,子类可以重写父类的方法,及命名与父类同名的成员变量。 子类通过隐藏父类的成员变量和重写父类的方法,把父类的状态和行为改变为自身的状态和行为。注意:...
面向对象程序,接口,实现类,父类引用子类
从子到父:父类引用指向子类的对象 父类 父类对象名 = new 子类(); 向下转型(强制类型转换) 从父到子:父类引用转为子类的对象 子类 子类对象名 = (子类)父类对象; 好处: 向上转型:父类引用指向子类对象,提高...
我们把父类与子类的这种关系称为继承。 封装: 实体的有些东西是自身特有的,不需要共享。 例如:小明的爸爸有自己不想公开的东西,那么对于小明的爸爸而言, 这些东西应该设置为私有的 。这就体现出java 的...