面向对象进阶-多态、抽象类、枚举、常量


活动地址:优快云21天学习挑战赛

目录

权限修饰符

final

常量

枚举

什么是枚举

枚举的定义

枚举常用的方法

枚举的构造器

抽象类

抽象类的定义

抽象类的特征

多态

什么是多态

使用多态的好处

多态下的类型转换


包是用来分别管理不同用途的类的,和文件夹的使用方式差不多,方便代码的管理。

建包语句必须在文件的第一行,IDEA一般会自己创建。

建包的语法格式: package com.项目名字.功能包

导包

在不同包下的文件需要使用就需要导包。导包格式 import 包名.类名

假如一个类中需要用到不同类,而这个两个类的名称是一样的,那么默认只能导入一个类,另一个类要带包名访问。

权限修饰符

权限修饰符是用来控制一个成员是否能访问的范围

可以修饰成员变量,方法,构造器,内部类,不同权限修饰符修饰的成员能够被访问的范围将受到限制。

权限修饰符:有四种作用范围由小到大(private -> 缺省 -> protected - > public )

修饰符同一 个类中**同一个包中其他类不同包下的子类不同包下的无关类
private
缺省
protected
public

成员变量一般私有。方法一般公开。如果该成员只希望本类访问,使用private修饰。如果该成员只希望本类,同一个包下的其他类和子类访问,使用protected修饰。

final

final的作用

  • final 关键字是最终的意思,可以修饰(类、方法、变量)

  • 修饰类:表明该类是最终类,不能被继承。

  • 修饰方法:表明该方法是最终方法,不能被重写。

  • 修饰变量:表示该变量第一次赋值后,不能再次被赋值(有且仅能被赋值一次)。

注意

  • final修饰的变量是基本类型:那么变量存储的数据值不能发生改变。

  • final修饰的变量是引用类型:那么变量存储的地址值不能发生改变,但是地址指向的对象内容是可以发生变化的。

常量

常量是使用public static final修饰的变量,必须对其初始化,而且执行的过程中其值不能被改变。

常量名的命名规范:英文单词全部大写,多个单词下划线连接起来。

public class Constant {  
    public Long final String SESSION_TIME  = “30*60L"; 
    public static final String LOGIN_NAME  = “admin";
    public static final String PASS_WORD  = “123456";
} 

好处

在编译阶段会进行“宏替换”:把使用常量的地方全部替换成真实的字面量。

维护系统容易,可读性更好。

枚举

什么是枚举

我们学习过单例模式,即一个类只有一个实例。而枚举其实就是多例,一个类有多个实例,但实例的个数不是无穷的,是有限个数的。

枚举的定义

枚举定义使用enum关键字

修饰符 enum 枚举名称{

第一行都是罗列枚举类实例的名称。

}

public enum Season{
    SPRING , SUMMER , AUTUMN , WINTER;
}
Season s = Season.SPRING;

枚举常用的方法

所有枚举类都默认是Enum类的子类,无需我们使用extends来继承。这说明Enum中的方法所有枚举类都拥有。

int compareTo(E e):比较两个枚举常量谁大谁小,其实比较的就是枚举常量在枚举类中声明的顺序,例如FRONT的下标为0,BEHIND下标为1,那么FRONT小于BEHIND ;

boolean equals(Object o):比较两个枚举常量是否相等﹔

int hashCode():返回枚举常量的hashCode ;

String name():返回枚举常量的名字;

int ordinal():返回枚举常量在枚举类中声明的序号,第一个枚举常量序号为0;

String toString():把枚举常量转换成字符串;

static T valueOf(Class enumType, String name):把字符串转换成枚举常暴。

枚举的构造器

枚举类也可以有构造器,构造器默认都是private修饰,而且只能是private。因为枚举类的实例不能让外界来创建!

public enum Season{
    SPRING , SUMMER , AUTUMN , WINTER;
    Season(){
        System.out.printf("hello");
    }
}

总结:

枚举类都是继承了枚举类型:java.lang.Enum

枚举都是最终类,不可以被继承。

构造器都是私有的,枚举对外不能创建对象。

枚举类的第一行默认都是罗列枚举对象的名称的。

枚举类相当于是多例模式。

抽象类

抽象类的定义

在Java中abstract是抽象的意思,可以修饰类、成员方法。

abstract修饰类,这个类就是抽象类;修饰方法,这个方法就是抽象方法。

定义格式:

修饰符 abstract class 类名{

修饰符 abstract 返回值类型 方法名称(形参列表);

}

注意:抽象方法只有方法签名,不能声明方法体。一个类中如果定义了抽象方法,这个类必须声明成抽象类,否则报错。

抽象的使用场景

  • 抽象类可以理解成不完整的设计图,一般作为父类,让子类来继承。

  • 当父类知道子类一定要完成某些行为,但是每个子类该行为的实现又不同,于是该父类就把该行为定义成抽象方法的形式,具体实现交给子类去完成。此时这个类就可以声明成抽象类。

抽象类的特征

类的全部成员(成员变量,方法,构造器)抽象类都有(抽象类也是一个类).

抽象类可以没有抽象方法,但是抽象方法一定存在于抽象类。

一个类继承了抽象类,就需要重写他全部的抽象方法,否则这个类也要定义成抽象类

不能用abstract修饰变量、代码块、构造器。

最重要的特征:得到了抽象方法,失去了创建对象的能力(其他的类不能创建抽象类的对象)

final和abstract的关系

互斥关系

abstract定义的抽象类作为模板让子类继承,final定义的类不能被继承。

抽象方法定义通用功能让子类重写,final定义的方法子类不能重写。

多态

什么是多态

多态的前提条件:

子类继承父类、子类重写父类方法、父类引用指向子类对象

创建格式:

父类类型 对象名称 = new 子类构造器;

多态中成员访问特点

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

变量调用:编译看左边,运行也看左边。(注意)

使用多态的好处

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

Animal a = new Dog();

a.run(); // 后续业务行为随对象而变,后续代码无需修改

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

多态下会产生的一个问题:

多态下不能使用子类的独有功能

多态下的类型转换

父类引用指向子类对象(自动转换)

子类引用指向父类对象(强制转换)

如果继承父类有多个子类,当父引用调用子引用后,其他子类强转父引用,就会出现ClassCastException

例如:

Animal c = new Cat();

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值