JAVA进阶--多态、内部类、常用API--2022年8月31日

第一节  多态

  1、什么是多态

    同类型的对象,执行同一个行为,会表现出不同的行为特征

  2、多态的常见形式

    父类  变量名称 = new 子类构造器;

    接口 变量名称 = new 实现类构造器;

  3、多态中成员访问特点

    方法调用:编译看左边,运行看右边

    变量调用:编译看左边,运行看左边(多态侧重行为多态)

  4、多态的前提

    有继承/实现关系,有父类引用指向子类对象;有方法重写

  5、多态的优势

    在多态形式下,右边对象可以实现解耦合,便于扩展和维护 

Animal a = new Dog();
//Aniamal a = new Cat() //不管是上面一行还是这一行,代码都不会报错 a.run();//后续业务行为随对象而变,后续代码无需修改

    定义方法的时候,使用父类型作为参数,该方法可以接受这父类的一切子类对象,体现多态的扩展性与遍历。

  6、多态下会产生一个问题

    多态下不能使用子类的独有功能,因为多态方法调用编译看左边,如果使用子类独有方法,编译会报错。

  7、引用类型自动类型转换(从子到父)

    子类对象赋值给父类类型的变量指向

  8、引用类型强制类型转换(从父到子

    此时必须进行强制类型转换:子类 对象变量 = (子类)父类类型的变量

    作用:可以解决多态下的劣势,可以实现调用子类独有的功能

    注意:如果转型后的类型和对象真实类型不是同一种类型,那么在转换的时候就会出现ClassCastException

      Animal t = new Tortoise();

      Dog d = (Dog)t;//出现异常  ClassCastException

    JAVA建议强制转换前使用instanceof判断当前对象的真实类型,再进行强制转换

      变量名 instanceof 真实类型

      判断关键字左边的变量指向的对象的真实类型,是否是右边的类型或者是其子类类型,是则返回true,反之,返回false。

  9、强制类型转换能解决什么问题?强制类型转换需要注意什么

    可以转换成真正的子类类型,从而调用子类独有功能

    有继承关系/实现关系的2个类型就可以进行强制转换,编译无问题

    运行时,如果发现强制转换后的类型不是对象真实类型则报错

  10、使用案例理解多态、接口等语法

package com.maofugui.di_polymorphic_test;

/**
 * USB接口 == 规范
 */
public interface USB {
    /**
     * 接入接出功能
     */
    void connect();
    void unconnect();
}
package com.maofugui.di_polymorphic_test;

public class keyBoard implements USB{
    private String name;

    public keyBoard() {
    }

    public keyBoard(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public void connect() {
        System.out.println(name + "接入电脑成功");
    }

    @Override
    public void unconnect() {
        System.out.println(name + "成功从电脑拔出");
    }

    /**
     * 独有功能
     */
    public void keyDown(){
        System.out.println(name + "敲下了:我变得富有了~~~~");
    }
}
package com.maofugui.di_polymorphic_test;

public class Mouse implements USB{
    private String name;

    public Mouse() {
    }

    public Mouse(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public void connect() {
        System.out.println(name + "接入电脑成功");
    }

    @Override
    public void unconnect() {
        System.out.println(name + "成功从电脑拔出");
    }

    /**
     * 独有功能
     */
    public void dbClick(){
        System.out.println(name + "点击三连~~~~");
    }
}

第二节  内部类

  1、内部类是什么

    内部类就是定义在一个类里面的类,里面的类可以理解成(寄生),外部类可以理解成(宿主)

    public class People{

      //内部类

      public class Heart(){

      }

    }

  2、内部类的使用场景和作用

 

   3、内部类的分类

    静态内部类(了解)

    成员内部类(非静态内部类)(了解)

    局部内部类(了解)

    匿名内部类(重点)

  4、静态内部类的使用场景、特点、访问总结

    如果一个类中包含了一个完整的成分,如汽车类中的发动机类

    特点、使用与普通类是一样的,类有的成分它都有,只是位置在别人里面而已

    可以直接访问外部类的静态成员,不能直接访问外部类的实例成员

    注意:开发中实际上用的还是比较少

    创建方式:外部类.内部类 变量名称 = new 外部类.内部类();

  5、成员内部类是什么样的、有什么特点

    无static修饰,属于外部类的对象

    可以直接访问外部类的静态成员,实例方法中可以直接访问外部类的实例成员(因为现有外部类对象,才能有成员内部类对象)

  6、成员内部类如何创建对象

    外部类名.内部类名 对象名 = new 外部类构造器.new 内部类构造器();

  7、成员内部类中如何访问外部类对象

    格式:外部类名.

  8、局部内部类(鸡肋语法,了解即可)

    局部内部类放在方法,代码块、构造器等执行体中

    局部内部类的类文件名:外部类$N内部类.class

  9、匿名内部类

    本质上是一个没有名字的局部内部类,定义在方法中、代码块中等

    作用:方便创建子类对象,最终目的为了简化代码编写

    格式:

      new 类|抽象类名|接口名(){}

      Employee a = new Employee(){

        public void work(){

        }

      }

      a.work();

    特点:匿名内部类是一个没有写名字的内部类

       匿名内部类写出来就会产生一个匿名内部类的对象

          匿名内部类的对象类型相当于是当前new的那个类型的子类类型

    匿名内部类可以作为方法的实际参数去传参

    使用总结:开发中不是我们主动去定义匿名内部类的,而是别人需要我们写或者我们可以写的时候才会使用,匿名内部类的代码可以实现代码进一步的简化。

 第三节  常用API

  1、Object的toString方法的作用是什么

    默认是打印当前对象的地址

    让子类重写,以便返回子类对象的内容

  2、Object的equals方法的作用是什么

    默认是与另一个对象比较地址是否一样

    让子类重写,以便比较2个子类对象的内容是否相同

  3、对象进行内容比较的时候建议使用什么?为什么?

    建议使用Objects提供的equals方法

    比较的结果是一样的,但是更安全,不会出现空指针异常

  4、为什么拼接、反转字符串建议使用StringBuilder

    String:内容是不可变的、拼接字符串性能差

    StringBuilder:内容是可变的、拼接字符串性能好,代码优雅

    定义字符串使用String

    拼接、修改等操作字符串使用StringBuilder

    就是说StringBuilder是手段,String是目的,有关于String的一切操作都可以用StringBuilder来操作,最后用toString方法返回String

  5、Math类

 

   6、System类

 

 

 

   7、BigDecimal类  大数据类

 

 

 

 

 

posted @ 2022-09-01 14:10  漫漫修行路  阅读(51)  评论(0)    收藏  举报