Java实用教程系列之对象的转型

简介:

Java今日分享实用的Java教程之对象的转型

体现:

父类的引用可以指向子类的对象
接口的引用可以指向实现类的对象
转型:

向上转型
由子类类型转型为父类类型,或者由实现类类型转型为接口类型
向上转型一定会成功,是一个隐式转换
向上转型后的对象,将只能访问父类或者接口中的成员
向下转型
由父类类型转型为子类类型,或者由接口类型转型为实现类类型
向下转型可能会失败,是一个显式转换
向下转型后的对象,将可以访问子类或者实现类中特有的成员
instanceof关键字
针对于向下转型的。

如果向下转型不成功,会怎样?

会有一个异常 ClassCastException
如何避免这种情况?

在向下转型之前,我们先判断一下这个对象是不是要转型的类型

怎么判断?

关键字 instanceof

Animal animal = new Dog();
if (animal instanceof Dog) {

// 说明animal的确是一个Dog

}
如果一个类中重写了父类的某一个方法。此时:

如果用这个类的对象来调用这个方法,最终执行的是子类的实现。
如果用向上转型后的对象来调用这个方法,执行的依然是子类的实现。
因为向上转型后的对象,归根到底还是子类对象。
抽象类与抽象方法
抽象:abstract

抽象类:

​ 用关键字abstract修饰的类,就是抽象类

抽象方法:

​ 用关键字abstract修饰的方法,就是抽象方法

特点:

抽象方法:

抽象方法使用abstract来修饰,只有声明,没有实现。

public abstract void bark();
抽象方法,只能够写在抽象类中。

抽象类:

抽象类使用abstract来修饰,抽象类不能实例化对象。
抽象类中是可以写非静态的成员的,这时候这些非静态成员是可以继承给子类的。
抽象类中是可以包含构造方法的。
结合抽象类和抽象方法:

非抽象子类在继承一个抽象父类的同时,要实现父类中所有的抽象方法。
注意事项:

final关键字

抽象类可以用final来修饰吗?
不能!因为final表示这个类无法被继承。但是对于抽象类来说,如果无法被继承,则这个抽象类没有任何意义。
抽象方法可以用final修饰吗?
不能!因为final修饰的方法无法被重写。但是抽象方法又只能写在抽象类中。如果一个抽象方法用final来修饰了,此时这个方法将无法被非抽象子类重写,那这个子类就会有问题。
抽象类和抽象方法的实用场景:

可以用抽象类和抽象方法来实现一些简单规则的制定。

​ 例如:所有的快递公司都必须要会xxxxx。KFC、麦当劳、

如果仅仅用抽象类和抽象方法来进行规则指定、行为约束:

​ 弊端:因为Java是单继承的语言,如果一个类为了遵循某一种规范,而去继承一个抽象类,此时这个类将无法再继承其他类。

​ 为了解决这样的问题,我么可以使用接口进行行为约束,规范代码。

接口
关键字:interface

语法:

​ 和类是比较像的,但是他不是类

[访问权限修饰符] interface 接口名字 {

// 接口中的成员

}
访问权限修饰符:和类一样,只能有 public 和默认的default权限。
接口不是类,不能实例化对象。
接口,暂时和类写成平级的关系。
接口名字是一个标识符,遵循大驼峰命名法
接口中成员的定义:

属性:接口中的属性,默认的修饰符是 public static final
构造方法:接口中不能写构造方法
方法:
接口中的方法都是抽象方法
接口中的方法访问权限修饰符都是public
接口是需要被类来实现的。

实现接口关键字: implements

让类实现接口:

public class Shunfeng extends Company implements Express {

}
一个非抽象类在实现接口后,需要实现接口中所有的抽象方法。

一个类在继承自一个父类后,还可以再去实现接口。

如果同时有父类和接口,那么继承父类在前,实现接口在后
一个类可以实现多个接口

如果一个类实现的多个接口中有相同的方法,这个方法在实现类中只需要实现一次即可。
接口之间是有继承关系的,而且接口之间的继承是多继承。

public interface GrilFriend extends HouseKeeping, Takecare {

}

相关文章
|
2天前
|
NoSQL Java 关系型数据库
Liunx部署java项目Tomcat、Redis、Mysql教程
本文详细介绍了如何在 Linux 服务器上安装和配置 Tomcat、MySQL 和 Redis,并部署 Java 项目。通过这些步骤,您可以搭建一个高效稳定的 Java 应用运行环境。希望本文能为您在实际操作中提供有价值的参考。
51 26
|
9天前
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
|
9天前
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
|
1月前
|
安全 Java 编译器
Java对象一定分配在堆上吗?
本文探讨了Java对象的内存分配问题,重点介绍了JVM的逃逸分析技术及其优化策略。逃逸分析能判断对象是否会在作用域外被访问,从而决定对象是否需要分配到堆上。文章详细讲解了栈上分配、标量替换和同步消除三种优化策略,并通过示例代码说明了这些技术的应用场景。
Java对象一定分配在堆上吗?
|
16天前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
Kotlin教程笔记(28) -Kotlin 与 Java 混编
25 2
|
2月前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
50 17
|
8天前
|
Java 数据库连接 编译器
Kotlin教程笔记(29) -Kotlin 兼容 Java 遇到的最大的“坑”
Kotlin教程笔记(29) -Kotlin 兼容 Java 遇到的最大的“坑”
26 0
|
1月前
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
|
1月前
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
|
1月前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
Kotlin教程笔记(28) -Kotlin 与 Java 混编