l
但是,运行时,如果发现对象的真实类型与强转后的类型不同会报错(ClassCastException)。
3、强制类型转换前?Java建议我们做什么事情?
l
使用instanceof判断当前对象的真实类型:对象 instanceof 类型 。
认识final
l
final 关键字是最终的意思,可以修饰(类、方法、变量)
l
修饰类:该类被称为最终类,特点是不能被继承了。
l
修饰方法:该方法被称为最终方法,特点是不能被重写了。
l
修饰变量:该变量只能被赋值一次。
final修饰变量的注意:
final修饰基本类型的变量,变量存储的数据不能被改变。
final修饰引用类型的变量,变量存储的地址不能被改变,但地址所指向的队对象的内容是可以被改变的。
常量
l
使用了static final 修饰的成员变量就被称为常量;使用了static和final修饰的成员变量称之为常量。
l
作用:通常用于记录系统的配置信息。
常量
l
使用了static final 修饰的成员变量就被称为常量;
l
作用:通常用于记录系统的配置信息。
使用常量记录系统配置信息的优势、执行原理
l
代码可读性更好,可维护性也更好。
l
程序编译后,常量会被“宏替换”:出现常量的地方全部会被替换成其记住的字面量,这样可以保证使用常量和直接用字面量的性能是一样的。
认识枚举类型:
枚举的格式:
修饰符 enum 枚举类名{
名称1,名称2,。。。。
}
public enum A{
X, Y, Z;
}
注意:
l
枚举类中的第一行,只能写一些合法的标识符(名称),多个名称用逗号隔开。
l
这些名称,本质是常量,每个常量都会记住枚举类的一个对象。
Compiled from “A.java"public final class A extends java.lang.Enum<A> { public static final A X = new A(); public static final A Y = new A(); public static final A Z = new A();
public static A[] values(); public static A valueOf(java.lang.String);}
l
枚举类的第一行只能罗列一些名称,这些名称都是常量,并且每个常量记住的都是枚举类的一个对象。
l
枚举类的构造器都是私有的(写不写都只能是私有的),因此,枚举类对外不能创建对象。
l
枚举都是最终类,不可以被继承。
l
枚举类中,从第二行开始,可以定义类的其他各种成员。
l
编译器为枚举类新增了几个方法,并且枚举类都是继承:java.lang.Enum类的,从enum类也会继承到一些方法。
枚举的常见应用场景:
l
用来表示一组信息,然后作为参数进行传输。
选择定义一个一个的常量来表示一组信息,并作为参数传输
l
参数值不受约束。
选择定义枚举表示一组信息,并作为参数传输
l
代码可读性好,参数值得到了约束,对使用者更友好,建议使用!
抽象类:
什么是抽象类?
Java中有一个关键字叫:abstract,它就是抽象的意思,可以用它修饰类、成员方法。
abstract修饰类,这个类就是抽象类;修饰方法,这个方法就是抽象方法。
修饰符 abstract class 类名 {
修饰符 abstract 返回值类型 方法名称(形参列表)
}
public abstract class A{
public abstract void test();
}
抽象类的注意事项、特点
l
抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类。
l
类该有的成员(成员变量、方法、构造器)抽象类都可以有。
l
抽象类最主要的特点:抽象类不能创建对象,仅作为一种特殊的父类,让子类继承并实现。
l
一个类继承抽象类,必须重写完抽象类的全部抽象方法,否则这个类也必须定义成抽象类。
抽象类、抽象方法是怎样的?
都是用abstract修饰的;抽象方法只有方法签名,不能写方法体
抽象类有哪些注意事项和特点?
抽象类中可以不写抽象方法,但抽象方法的类一定是抽象类
类有的成员(成员变量、方法、构造类)抽象类都具备。
抽象类不能创建对象,仅作为一种特殊的父类,让子类继承并实现。
一个类继承抽象类,必须重写抽象类的全部抽象方法,否则这个类也必须定义成抽象类。
使用抽象类的好处
public abstract class Animal{ private String name; public abstract void cry(); public String getName() { return name; } public void setName(String name) { this.name = name; }
1、抽象类的应用场景和好处是什么?
l
父类知道每个子类都要做某个行为,但每个子类要做的情况不一样,父类就定义成抽象方法,交给子类去重写实现,我们抽出这样的抽象类,就是为了更好的支持多态。