Java 继承

继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

Java 子类强转父类

父类引用指向子类对象:

java中子类强转父类,实际上依然是子类;

该引用只能调用父类中定义的方法和变量;

如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;

// A是父类,B是子类
A a = new A();
a.setName("a1");
a.sayA(); // sayA B b = new B();
b.setName("b1");
b.setSex(true);
b.sayA(); // sayA from B
b.sayB(); // sayB // Java中的对象进行类型提升,依然保持其原有的类型。
A a2 = (A) b; // 子类强转父类,其实仍然是子类
System.out.println(a2.toString()); // B [name=b1, age=0, sex=true]
// 该引用只能调用父类中定义的方法和变量;
// a2.sayB(); // The method sayB() is undefined for the type A 报错
// 如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;
a2.sayA(); // sayA from B a2其实是B,调用的是B方法

Java 父类强转子类

只有父类对象本身就是用子类new出来的时候, 才可以在将来被强制转换为子类对象.

// B b2 = (B) a; // atest.A cannot be cast to atest.B a是A,转不成B
// 只有父类对象本身就是用子类new出来的时候, 才可以在将来被强制转换为子类对象.
B b2 = (B) a2; // a2其实是B,可以转成B
System.out.println(b2.toString()); // B [name=b1, sex=true]
b2.sayA(); // sayA from B
b2.sayB(); // sayB

扩展:

对于list也是这样

List<A> aList = new ArrayList<A>();
aList.add(a);
aList.add(b);
for (A item : aList) {
System.out.println(item.getClass() + ":" + item.toString());
// class atest.A:A [name=a1]
// class atest.B:B [name=b1, sex=true]
}

附录:

  public class A {

        private String name;

        public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public void sayA() {
System.out.println("sayA");
} @Override
public String toString() {
return "A [name=" + name + "]";
}
} public class B extends A { private boolean sex; public boolean isSex() {
return sex;
} public void setSex(boolean sex) {
this.sex = sex;
} @Override
public void sayA() {
System.out.println("sayA from B");
// super.sayA();
} public void sayB() {
System.out.println("sayB");
} @Override
public String toString() {
return "B [name=" + this.getName() + ", sex=" + sex + "]";
}
} public static void main(String[] args) { // A是父类,B是子类
A a = new A();
a.setName("a1");
a.sayA(); // sayA B b = new B();
b.setName("b1");
b.setSex(true);
b.sayA(); // sayA from B
b.sayB(); // sayB // Java中的对象进行类型提升,依然保持其原有的类型。
A a2 = (A) b; // 子类强转父类,其实仍然是子类
System.out.println(a2.toString()); // B [name=b1, sex=true]
// 该引用只能调用父类中定义的方法和变量;
// a2.sayB(); // The method sayB() is undefined for the type A 报错
// 如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;
a2.sayA(); // sayA from B a2其实是B,调用的是B方法
// B b2 = (B) a; // atest.A cannot be cast to atest.B a是A,转不成B
// 只有父类对象本身就是用子类new出来的时候, 才可以在将来被强制转换为子类对象.
B b2 = (B) a2; // a2其实是B,可以转成B
System.out.println(b2.toString()); // B [name=b1, sex=true]
b2.sayA(); // sayA from B
b2.sayB(); // sayB List<A> aList = new ArrayList<A>();
aList.add(a);
aList.add(b);
for (A item : aList) {
System.out.println(item.getClass() + ":" + item.toString());
// class atest.A:A [name=a1]
// class atest.B:B [name=b1, sex=true]
} }

java 子类强转父类 父类强转子类的更多相关文章

  1. 转:Java中子类是否可以继承父类的static变量和方法而呈现多态特性

    原文地址:Java中子类是否可以继承父类的static变量和方法而呈现多态特性 静态方法 通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法,关于static方法,声明 ...

  2. Java中子类是否可以继承父类的static变量和方法而呈现多态特性

    静态方法 通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法,关于static方法,声明为static的方法有以下几条限制: 它们仅能调用其他的static 方法. 它 ...

  3. 继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类。 (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法。 (3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承。 (4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承。 分析以上程

    继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类. (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法.(3)子类中定义的成员变量和父类中定义的 ...

  4. Java中的继承:父类和子类的关系

    一.父类引用指向子类对象时 1.若子类覆盖了某方法,则父类引用调用子类重新定义的新方法 2.若子类未覆盖某方法,则父类引用调用父类本身的旧方法 3.若子类覆盖了某属性,但父类引用仍调用父类本身的旧属性 ...

  5. Python,JAVA中子类的构造函数与父类构造函数的关系

    Python: 子类不重载.覆盖父类的构造函数(子类不自己定义构造函数),则构造子类时会调用父类构造函数 若子类覆盖了父类的构造函数,则构造子类时不执行父类的构造函数,但仍继承了父类,如需调用父类构造 ...

  6. java类继承总结一 父类类型与子类类型之间的转化问题(转)

    java类继承总结一 父类类型与子类类型之间的转化问题 本文将通过一个实例描述父类类型与子类类型之间的转化问题,这个很特殊的问题常常会导致一些潜在的危险,让你整整一个晚上都在调试程序以解决一个让人抓狂 ...

  7. java反射与多态(父类调用子类)的代码演示

    package Test0817; import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method ...

  8. java在子类中,调用父类中被覆盖的方法

    在java中,子类中调用与父类同名的方法(即父类中被覆盖的方法)用super来调用即可,下面是示例: 子类父类的定义 public class b { void show() { System.out ...

  9. 编写Java程序,创建一个父类交通工具类(Vehicles),以及两个子类,分别是轿车类(Car)和卡车类(Truck)。

    返回本章节 返回作业目录 需求说明: 创建一个父类交通工具类(Vehicles),以及两个子类,分别是轿车类(Car)和卡车类(Truck). 父类有属性品牌(brand)和颜色(color). 在父 ...

随机推荐

  1. Oracle列转行函数LISTAGG()

    --Oracle列转行函数LISTAGG() with tb_temp as( select 'China' 国家,'Wuhan' 城市 from dual union all select 'Chi ...

  2. Spring Boot+Jsp启动异常

    No Java compiler available for configuration options compilerClassName 加入maven配置 <dependency> ...

  3. C#,单元测试

    C#,单元测试入门(以下内容可能来自网络) 一.什么叫单元测试(unit testing)? 是指对软件中的最小可测试单元进行检查和验证.对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体 ...

  4. time模块 转换关系图

    import time t = time.time() #获取目前时间 t_struck = time.localtime(t) #time.gmtime() utc时区 t_str = time.s ...

  5. MySQL数据库安装配置

    1,下载MySQL 打开MySQL的官网www.mysql.com,发现有一个DOWNLOADS 点击它,进入到MySQL的下载页面,在页面的底部有一个MySQL Community Edition, ...

  6. hdu-3294(最长回文子串)

    题意:给你一个字符和一个字符串让你求出最长回文子串并且输出来,答案需要根据给出的字符转换一下,就是将给出的字符认定为a,然后依次向后推: 解题思路:manacher模板+一些处理 代码: #inclu ...

  7. kvm 一些web管理3方工具

    OpenNebula  Proxmox VE 

  8. BZOJ3513[MUTC2013]idiots——FFT+生成函数

    题目描述 给定n个长度分别为a_i的木棒,问随机选择3个木棒能够拼成三角形的概率. 输入 第一行T(T<=100),表示数据组数. 接下来若干行描述T组数据,每组数据第一行是n,接下来一行有n个 ...

  9. linux目录文件及系统启动知识

    一.Linux系统目录结构介绍 1.Linux 与 Windows目录结构对比 Linux与Windows的目录结构对比见下图. Linux 目录特点: /etc/hosts      /root/d ...

  10. SQL 对等发布

    发布类型: 快照发布:发布服务器按预定的时间间隔向订阅服务器发送已发布数据的快照.事务发布:在订阅服务器收到已发布数据的初始快照后,发布服务器将事务流式传输到订阅服务器.对等发布:对等发布支持多主复制 ...