Java 8 多态

本文详细介绍了Java中的多态性,包括Object类的toString、equals方法,以及==和equals的区别。此外,还深入讨论了多态的概念、转型(Cast)操作、instanceof的使用,以及抽象类和接口的相关知识,提供了Java类设计的重要规范和实践。
摘要由CSDN通过智能技术生成
十五、Object类

Object 类是所有 Java 类的根基类

如果在类的声明中未使用 extends 关键字指明其基类,则默认基类为 Object 类

在java中所有的类都会继承自Object类,因为不是直接继承,就是间接继承

1、toString: 当打印对象的引用时,默认调用toString()方法

toString : 返回对象的字符串表现形式,来自于Object类中toString方法的实现 :

 public String toString() {
            return getClass().getName() + "@" + Integer.toHexString(hashCode());
 }

*当在java中输出一个对象的引用时候,默认输出的是对象调用了toString方法的返回值(地址值)

*结合业务,希望输出一个对象的引用 时候,想要输出的是这个对象的所有属性值,而非地址值

*以后在定义实体类的时候,都应该根据所有的属性重写toString方法

2、实体类的定义规范 | Javabean类的定义规范:

1).类是公共的 2).至少提供一个空构造,根据需求提供带参 3).属性私有化,提供一对公共的访问方式 4).根据所有属性值重写toString方法

3、equals:比较相等是否相等

默认地址比较(”第一个盒子的比较”) 重写可以是实现比较两对象的内容是否一致

object1.equals(object2)
如 : p1.equals(p2)
• 比较所指对象的内容是否一样,具体看equals的方法重写
object1 == object2
如:p1==p2
• 比较p1和p2的值即内存地址是否相等,即是否是指向同一对象。

注意:自定义类须重写equals(),否则无法实现比较其内容

4、==和equals之间的区别

比较是否相同,返回值都是boolean

区别:

(1)、比较的数据的类型不同

= =基本数据类型的数据值

引用数据类型的对象

equals:比较引用数据类型的对象数据

(2)、比较内容不同

= =基本数据类型的数据值是否相等

引用数据类型的对象的地址值

equals:

来自Object类中的equals默认的是比较对象的地址值

public boolean equals(Object obj){

return (this==obj);

}

如果在使用equals方法比较对象时候,不想要比较地址,想要比较内容(属性值)------>在子类中进行重写

5、定义类的定义规范 | Javabean类的定义规范:

one:类是公共的

two: 至少提供一个空构造,根据需求提供带参

three:属性私有化,提供一对公共的访问方式

four:根据所有的属性值重写toString方法与equals方法

十六、多态(polymorphism)
1、多态

多态是一种事物的多种形态|多种表现形式|多种实现方式 ----->一个功能不同实现形式

实现多态的前提:类的继承 | 接口的实现

多态的最终体现:父类的引用指向对象

对应类型引用强调:

能调用的成员包含,子类中定义的成员 + 父类中的继承的成员

如果子类中存在重写方法,调用子类中重写后的方法对父类的方法进行屏蔽

多态的调用:

调用成员变量:编译运行找父类 | 看左边 | 看类型

调用成员方法:编译看父类 | 左边 | 类型,运行找子类 | 右边 | 对象

多态引用对子类新增成员不可见,但是如果子类中存在方法重写,会调用重写后的方法

注意:如果使用多态但是不配合方法的重写,多态就没有意义

2、转型(Cast)

标准赋值 : 对应类型的数据赋值给对应类型的变量 int i = 1; Person p = new Person(); 基本数据类型的类型转换 : 自动类型提升 : 小-->大 long l = i; 强制类型转换 : 大-->小 int i2 = (int)l; 引用数据类型的转型 : 向上转型 : 小-->大 Person p = new Student();-->多态 向下转型 : 大-->小 Student s = (Student)p; java.lang.ClassCastException : 类型转换异常 避免类型转换异常的出现 :instanceof 运算符 语法 : 引用 instanceof 类型 判断前面的引用是否是指向后面类型的对象|子类对象,如果是返回true,不是返回false

3、 instanceof

使用前提:在向下转型的时候,为了避免类型转换异常 ClassCastException 的出现,可以使用instanceof进行判 断。

Animal animal = new Dog();
System.out.println(animal instanceof Animal);
System.out.println(animal instanceof Cat);
System.out.println(animal instanceof Dog);
//先判断后转型
if(animal instanceof Dog){
    Dog dog = (Dog) animal;
}

十七、抽象的(abstract )
abstract修饰类 : 抽象类
        应用场景 : 1)想要包含定义抽象方法   2)当前类不能实例化
abstract修饰方法 : 抽象方法
        没有方法体
        必须存在于抽象类中

抽象方法指只有功能声明,没有功能主体实现的方法。 具有抽象方法的类一定为抽象类。 那么犬科就可以定义为抽象类,吼叫方法为抽象方法,没有方法体。 通过抽象类,我们就可以做到严格限制子类的设计,使子类之间更加通用。

1、定义

抽象方法 : 不需要方法体的方法,需要用 abstract 关键字修饰。只能出现在抽象类中。

抽象类 : 被 abstract 修饰的类为抽象类。

public abstract class Canine{
  private String brand;
 
  public Canine(){}
 
  public Canine(String brand){
    this.brand = brand;
 }
  //抽象方法
  public abstract void shout();
 
  //具体方法
  public void sleep(){
    System.out.println("闭着眼睛睡觉!!!");
 }
}
2、抽象类的使用要点
1.抽象类不能实例化
2.抽象类中可以包含属性,功能,静态,非静态的,抽象的,构造器...
3.抽象类的使用 :
    可以根据抽象类类名调用类中的静态内容
    可以根据抽象类的具体子类对象,调用成员
        具体子类 : 重写所有抽象方法 + 按需新增
        抽象子类 : 按需重写 + 按需新增
4.抽象方法一旦被重写一次,后续可以按需重写
5.abstract不能与private,final,static,native不能一起使用的
6.抽象类也是类,可以发生多态
十八、接口

普通类:具体实现 抽象类:具体实现,规范(抽象方法) 接口:规范(抽象方法)

1、接口 :

是一种引用数据类型 ​ 特殊的抽象类 ​ 提高代码的复用性 ​ 类只能单继承,接口可以多实现 ​ 解耦(降低耦合度) ​ 定义开发规范 ​ 一般为抽象功能的集合

2、继承 :子类 父类

子类一旦继承父类,有权使用父类的成员,继承侧重点关注的是 : 如果从父类中继承的成员满意,马过来直接使用 ​

3、实现 :实现类 接口

实现类一旦实现接口,具有了接口带来的功能,实现侧重点关注的是 : 实现类一旦实现接口,需要先对抽象方法进行重写,然后才能使用 ​

4、定义 : 通过interface定义接口
[权限修饰符]  interface 接口名  [extends  父接口1,父接口2…] {
        常量定义;
        抽象方法定义;
}
5、语法 :

jdk7及之前 : ​ 公共的静态的常量 : public static final 任意省略 ​ 公共的抽象的方法 : public abstract 任意省略

6、使用 :

1.接口不能实例化(不能new对象) ​ 2.类只能单继承,接口可以多实现 ​ 3.定义一个实现类去实现接口 implements(实现) ​ 4.需要通过具体实现类对象进行调用 ​ 具体实现类 : 重写所有的抽象方法 + 按需新增 ​ 抽象实现类 : 按需重写抽象方法 + 按需新增 ​ 需要具体子类继承,重写所有没有重写的抽象,通过具体子类对象进行调用 ​ 5.如果同时存在继承与实现,需要先继承后实现 ​ 6.类与类之间,只能继承,单继承 ​ 类与接口之间,只能实现,类实现接口,可以多实现 ​ 接口与接口之间,只能继承,可以多继承

7、接口的本质

接口就是 规范 ,定义的是一组规则,接口的本质是契约,就像我们人间的法律一样。制定好后大家都遵守

8、接口使用要点

子类通过 implements 来实现接口中的规范 接口不能创建实例,但是可用于声明引用变量类型。 一个类实现了接口,必须实现接口中所有的方法,并且这些方法只能是 public 的。 接口中只能包含 静态常量、抽象方法 ,不能有普通属性、构造方法、普通方法、静态块。

public class Class001_Interface {
    public static void main(String[] args) {
        System.out.println(Smoke.PI);
        //Smoke.PI = 1.1;
​
        //具体实现类对象
        Impl1 impl1 = new Impl1();
        impl1.smoking();
        impl1.test();
    }
}
​
//接口
interface Smoke{
    //公共的静态的常量
    double PI = 3.14;
​
    //公共的抽象的方法
    void smoking();
    void test();
}
​
​
//具体实现类
class Impl1 extends Object implements Smoke,D{
​
    @Override
    public void smoking() {
        System.out.println("边吸烟变吐烟圈...");
    }
​
    @Override
    public void test() {
        System.out.println("测试...");
    }
​
    @Override
    public void a() {
​
    }
​
    @Override
    public void b() {
​
    }
​
    @Override
    public void c() {
​
    }
}
​
interface A{
    void a();
}
interface B{
    void b();
}
interface C{
    void c();
}
​
interface D extends A,B,C{}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值