前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java——设计辅助概念(final关键字、对象多态性基本概念)

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

作者头像
Winter_world
发布2020-09-25 10:21:09
4040
发布2020-09-25 10:21:09
举报

1、final关键字

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

【举例】:利用final定义类

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

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

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

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

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

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

2、对象多态性

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

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

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

代码语言:javascript
复制
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
            B b = new B();
            b.print();
           }
}
class A{
    public void print(){
        System.out.println("hello");
    }
}
class B extends A{
    public void print(){
        System.out.println("world");
    }
}

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

  • 方法的多态性:

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

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

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

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

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

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

依然用以上代码:

代码语言:javascript
复制
            A a = new B();//向上转型
            a.print();
            B b = (B) a; //向下转型
            b.print();

输出都是

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

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

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

代码语言:javascript
复制
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
            fun(new A());
            fun(new B());
           }
           public static void fun(A a){
                a.print();
           }
            public static void fun(B b){
                b.print();
            }
}

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

代码语言:javascript
复制
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
            fun(new A());
            fun(new B());
           }
           public static void fun(A a){
                a.print();
           }
}

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

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

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

代码语言:javascript
复制
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
            A a = new B();
            a.print();
            B b = (B)a;//只能向下转型,才能调用子类的新方法
            b.fun();
           }
}
class A{
    public void print(){
        System.out.println("hello");
    }
}
class B extends A{
    public void print(){
        System.out.println("world");
    }

    public static void fun(){
        System.out.println("B类扩充的方法");
    }
}

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

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

代码语言:javascript
复制
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
            A a = new A();
            B b = (B)a;
            b.fun();
    }
}

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

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

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

代码语言:javascript
复制
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
            A a = new A();
            System.out.println(a instanceof A);//true
            System.out.println(a instanceof B);//false
            A x = new B();
            System.out.println(x instanceof A);//true
            System.out.println(x instanceof B);//true
    }
}

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

代码语言:javascript
复制
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
            A a = new B();
            if(a instanceof B){ //优化,判断是B的子类对象,才可以进行强制向下转型
                B b = (B)a;
                b.print();
            }
    }
}

3、总结

  • 向上转型(90%):为了实现参数类型的统一,向上转型一定与方法覆写产生关联,没有覆写,就没什么意义;
  • 向下转型(1%):为了调用子类特殊的方法,但是向下转型必须实现了向上转型,其存在安全隐患,向下转型前可以使用instanceof进行判断;
  • 不转型(9%):为了方便操作直接使用系统类或一些功能类,如:String、简单Java类等。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-04-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、final关键字
  • 2、对象多态性
  • 3、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档