1. instanceof 和 类型转换
instanceof
是Java
的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例或者是右边类的子类的实例,返回boolean
的数据类型。- 对于向下转型(父类转换为子类),必须进行强制类型转换;对于向上转型(子类转换为父类),不必使用强制类型转换。
2. 内部类
-
内部类有两种:
-
非静态内部类
-
非静态内部类是一个类中嵌套着另外一个类。 它有访问外部类成员的权限, 通常被称为内部类。
class OuterClass { // 外部类 // ... class InnerClass { // 内部类 // ... } }
-
由于内部类嵌套在外部类中,因此必须首先实例化外部类,然后创建内部类的对象来实现。
OuterClass myOuter = new OuterClass(); OuterClass.InnerClass myInner = myOuter.new InnerClass(); myInner.属性名/方法名();
-
private
修饰的内部类不可被外部类访问。 -
内部类可以访问外部类的属性和方法。
myInner.外部类属性名/外部类方法名()
-
-
静态内部类
-
静态内部类使用
static
关键字定义。class OuterClass { //... static class InnerClass { //... } }
-
静态内部类不需要创建外部类来访问,可以直接访问它。
OuterClass.InnerClass myInner = new OuterClass.InnerClass(); myInner.属性名/方法名();
-
静态内部类无法访问外部类的成员。
-
-
3. static 关键字
-
静态类:使用
static
关键字修饰的内部类,就是静态类。 -
静态变量:当成员变量声明时使用了
static
关键字,那么这个变量称为静态变量,静态变量访问时不需要创建对象,可直接通过类名.变量名
访问。 -
静态方法:使用
static
关键字修饰的方法为静态方法,可直接使用类名.方法名()
调用。 -
静态代码块:使用
static
修饰的代码块就是静态代码块,该代码块仅在该类被加载时执行一次。 -
静态导入包:
//不导入包 System.out.println(); //导入包 import static java.lang.System.out; out.println();
4. 抽象类
-
抽象类的声明
public abstract class Student{ //类体 }
-
抽象类的实现
public class Classmate extends Student{ //类体 }
-
抽象方法
/** *如果一个类包含抽象方法,那么该类必须是抽象类。 *任何子类必须重写父类的抽象方法,或者声明自身为抽象类。 */ public abstract double study();
-
抽象类的特点:
- 抽象类不能被实例化。只有抽象类的非抽象子类可以创建对象。
- 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
- 抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。
- 构造方法,类方法(用
static
修饰的方法)不能声明为抽象方法。 - 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。
5. 接口
-
由于 Java 只有单继承关系,一个类只能继承一个抽象类,很不方便,所以接口应运而生了。一个类可以变相继承多个接口,准确的说是实现多个接口,即单继承,多实现。
-
接口定义
[访问权限] interface 接口名称 [extends 其他的接口名] { // 声明变量 // 抽象方法 }
-
接口实现
public class 类名 implements 接口名1, 接口名2...{ //方法实现 }
-
接口的特点
- 接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为
public abstract
(只能是public abstract
,其他修饰符都会报错)。 - 接口中可以含有变量,但是接口中的变量会被隐式的指定为
public static final
变量(并且只能是public
,用private
修饰会报编译错误)。 - 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。
- 接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为
-
接口与抽象类的区别
参数 抽象类 接口 方法 可以有方法体 不能有方法体 变量 各种类型 只能是 public static final 类型 静态 可以有静态代码块和静态方法 不能含有静态代码块以及静态方法 继承 一个类只能继承一个抽象类 一个类却可以实现多个接口