Java——设计辅助概念(final关键字、对象多态性基本概念)

举报
Winter_world 发表于 2021/09/29 00:11:06 2021/09/29
【摘要】 目录 1、final关键字 2、对象多态性 3、总结 1、final关键字 final别名 终结器,意思是用final定义的类不能有子类,用final定义的方法不能被覆写,用final定义的变量就成为了常量,其无法修改。 【举例】:利用final定义类 实际开发中,无需太多关注此类模式,因为这种定义与实际的类的结构设...

目录

1、final关键字

2、对象多态性

3、总结


1、final关键字

final别名 终结器,意思是用final定义的类不能有子类,用final定义的方法不能被覆写,用final定义的变量就成为了常量,其无法修改。

【举例】:利用final定义类

实际开发中,无需太多关注此类模式,因为这种定义与实际的类的结构设计有关,比如结构系统框架等。

【举例】:利用final定义的方法

以上的定义形式也是很少出现的。

【举例】:利用final定义常量

可以将固定的常量数值利用变量名称 表示出来,该值不能被修改。

如果开发中使用了public static final 定义,就是全局常量,该定义在实际开发中使用的非常频繁,我们开发时只要是常量的定义都使用大写字母描述,养成一个好习惯,以和变量进行区分。

2、对象多态性

多态是在继承性的基础上才可操作的,本次将使用类继承的关系来描述多态的性质,实际开发中不会出现普通类的继承关系,即一个已经完善的类不应该再被继承。开发中都要求继承抽象类和接口,本节主要讲的也只是概念。

多态性要想实现有前提:继承、覆写。

【举例】:覆写调用的前提是,看new的是哪个类的对象,再看方法是否被子类覆写。


  
  1. public class MainActivity extends AppCompatActivity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. B b = new B();
  6. b.print();
  7. }
  8. }
  9. class A{
  10. public void print(){
  11. System.out.println("hello");
  12. }
  13. }
  14. class B extends A{
  15. public void print(){
  16. System.out.println("world");
  17. }
  18. }

Java中多态性主要由两个方面组成:

  • 方法的多态性:

         --方法重载:方法调用时根据有不同的参数个数及类型实现不同的功能;

         --方法覆写:不同的子类对同样的方法可有不同的实现。

  • 对象的多态性:父类与子类对象间的转换操作

         --对象的向上转型: 父类 父类对象 = 子类实例,自动完成的;

         --对象的向下转型:子类 子类对象 = (子类)父类实例,强制转换;

【举例】:观察对象的向上、向下转型转型

依然用以上代码:


  
  1. A a = new B();//向上转型
  2. a.print();
  3. B b = (B) a; //向下转型
  4. b.print();

输出都是

【分析1】向上转型的意义是什么?有什么用呢?

要求定义一个fun()方法,这个方法要求可以接收A以及A类所有子类的实例化对象,根据这个要求,有两种实现方案:

方案一:使用方法重载的概念完成:如果有1W个子类,那么这方重载方法要写到吐。。。。显然不是最佳方案。


  
  1. public class MainActivity extends AppCompatActivity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. fun(new A());
  6. fun(new B());
  7. }
  8. public static void fun(A a){
  9. a.print();
  10. }
  11. public static void fun(B b){
  12. b.print();
  13. }
  14. }

方案二:各个子类调用的方法都是print(),此时就可以利用对象自动向上转型概念,直接只有A类接收即可。


  
  1. public class MainActivity extends AppCompatActivity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. fun(new A());
  6. fun(new B());
  7. }
  8. public static void fun(A a){
  9. a.print();
  10. }
  11. }

所以,对象的向上转型,在开发中最大的优势在于数据操作的统一上。

【分析2】向下转型的意义是什么?有什么用呢?

一旦发生向上转型后,父类对象不能调用子类中新建的方法,即向上转型后牺牲的是子类的个性化特征。但是现在要想调用子类中的特殊方法,只能进行向下转型操作:


  
  1. public class MainActivity extends AppCompatActivity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. A a = new B();
  6. a.print();
  7. B b = (B)a;//只能向下转型,才能调用子类的新方法
  8. b.fun();
  9. }
  10. }
  11. class A{
  12. public void print(){
  13. System.out.println("hello");
  14. }
  15. }
  16. class B extends A{
  17. public void print(){
  18. System.out.println("world");
  19. }
  20. public static void fun(){
  21. System.out.println("B类扩充的方法");
  22. }
  23. }

若使用向下转型,之前建立的参数统一风格就被打破了,所以,向下转型的意义就是,要调用子类中的自己的特殊支持。

但是向下转型有个注意点:


  
  1. public class MainActivity extends AppCompatActivity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. A a = new A();
  6. B b = (B)a;
  7. b.fun();
  8. }
  9. }

以上程序编译出现java.lang.ClassCastException 错误,表示类的异常转换,两个没有关系的类对象发生了强制转换所导致的。

所以要进行向下转换之前,首先保证已经发生了向上转型,这样才有了父子对象的关系,这样的转型本身是有安全隐患的,所以,可以使用instanceof关键字,判断某一个对象是否是指定类的实例。

【举例】:观察instanceof关键字的使用


  
  1. public class MainActivity extends AppCompatActivity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. A a = new A();
  6. System.out.println(a instanceof A);//true
  7. System.out.println(a instanceof B);//false
  8. A x = new B();
  9. System.out.println(x instanceof A);//true
  10. System.out.println(x instanceof B);//true
  11. }
  12. }

所以,可以利用instanceof关键字进行代码的优化,避免以上异常的发生:


  
  1. public class MainActivity extends AppCompatActivity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. A a = new B();
  6. if(a instanceof B){ //优化,判断是B的子类对象,才可以进行强制向下转型
  7. B b = (B)a;
  8. b.print();
  9. }
  10. }
  11. }

3、总结

  • 向上转型(90%):为了实现参数类型的统一,向上转型一定与方法覆写产生关联,没有覆写,就没什么意义;
  • 向下转型(1%):为了调用子类特殊的方法,但是向下转型必须实现了向上转型,其存在安全隐患,向下转型前可以使用instanceof进行判断;
  • 不转型(9%):为了方便操作直接使用系统类或一些功能类,如:String、简单Java类等。

 

作于202004202145,已归档

———————————————————————————————————

本文为博主原创文章,转载请注明出处!

若本文对您有帮助,轻抬您发财的小手,关注/评论/点赞/收藏,就是对我最大的支持!

祝君升职加薪,鹏程万里!

文章来源: winter.blog.csdn.net,作者:Winter_world,版权归原作者所有,如需转载,请联系作者。

原文链接:winter.blog.csdn.net/article/details/105627040

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。