1.接口

1.1 接口的定义格式

  1. 使用的关键字是interface,不再是原来的class.
  2. public interface 接口名{<br /> }

接口文件的扩展名还是.java格式的.,被编译后的格式还是.class格式的.

在接口可以定义方法,也可以定义变量。但是,在接口中定义的方法只能是抽象方法,在接口中定义的变量只能是常量。

1.2 在接口定义抽象方法的格式

public abstract 返回值类型 方法名(参数列表);

1.3 在接口中定义变量,格式

public static final 数据类型 变量名  = 初始值;

final 是最终的,不可修改的意思,其实上面的格式就是定义常量的格式;

在接口中定义的变量就是常量,也就是说接口中只能定义常量,不能定义变量;

1.4 接口中定义抽象方法和常量的注意事项

定义抽象方法:

方法前面的修饰 public abstract ,可以不写,也可以挑着写,如果这两个关键字没写或者没有写全,编译器在编译代码时,会自动补全;

定义常量:

常量前面的public static final 关键字,可以不写,也可以挑着写,如果这三个关键没写或者没写全,编译器在编译代码时,会自动补全;

总结:

       接口中只能定义常量和抽象方法;

1.5 接口的实现类

就是一个普通的类,只是实现了一个接口.

实现类的定义格式:

     修饰符 class 类名 implements 接口名{<br />             重写接口中所有的抽象方法;<br />             定义实现类特有的成员变量和成员方法;<br /> }

在实现类中重写接口中的抽象方法,叫做实现方法;

1.6 接口的特点:

1.定义接口使用关键字是interface,不是class;

2.接口不能创建对象,也就是不能new对象;

3.接口中只能定义常量和抽象方法,不能定义变量和普通的方法;

4.接口的实现类必须实现接口中所有的抽象方法,否则实现类必须被定义成抽象类;

5.接口可以继承接口,而且可以多继承,接口中的多继承弥补了java中单继承的缺陷;

比如C接口继承了A,B两个接口,那么在C接口中就拥有AB两个接口中所有的抽象方法和常量;

1.7 接口与抽象类的区别(面试常问)

1.定义接口使用的关键字是interface,定义抽象类的关键字是abstract class;

2.接口中只能定义常量和抽象方法,抽象类中可以定义常量和变量,也可以定义普通方法和抽象方法;

3.接口可以多继承,抽象类只能单继承,接口的扩展性比抽象类的更强;

4.接口主要用于给实现类扩展额外的功能,抽象类主要用给子类扩展本就应该有的功能;

2 多态

Java中的多态是指,一个对象有多种类型;

2.1 多态的两种写法

第一种写法: 有子类 有父类

父类名 对象名 = new 子类名(参数列表);

父类类型的变量指向了子类的对象;

  1. 通过多态的对象访问变量,访问的父类中的变量
    如果子类中重写了父类中的变量,通过多态的对象访问变量,只能访问父类中的那个变量,不能访问子类中重写的变量。(没有为什么,语法就这么规定的,这是多态的一个弊端)

  2. 没有重写父类中的方法的情况下,通过多态对象访问方法时访问的是父类中的方法
    如果子类重写了父类中的方法,通过多态对象访问方法时访问的是子类中重写后的方法。(没有为什么,语法就这么规定的,这是多态的一个弊端)

第二种写法: 有接口 有实现类

接口名 对象名 = new 实现类名(参数列表);

2.2 两种写法的特点

第一种写法多态的特点
格式:
父类名 对象名 = new 子类名(参数列表);
1.如果在子类中重写了父类中的方法,当通过多态对象访问这个方法,访问的是子类中的重写后的方法;
当通过多态对象访问不能父类中被重写的方法了;
2.如果在子类中重写了父类中的变量,当通过多态对象访问这个变量,访问的是父类中的变量;
当通过多态对象访问不能子类中重写后的变量了;
第二种写法的多态的特点:
格式:
接口名 对象名 = new 实现类名(参数列表);
1.如果实现类实现了接口中的方法,当通过多态的对象访问方法时,访问的是实现类中实现后的方法;
如果在实现类中定义了特有的方法(在接口中没有定义),当通过多态的对象访问方法时,编译报错;
2.如果在实现类中重写了接口中的常量,当通过多态的对象访问常量时,访问的是接口中定义的常量;
通过多态的对象访问常量时,不能访问实现类中重写后的常量.

3 强制类型转换

多态本身是子类类型向父类类型向上转型的过程。
多态的转型分为向上转型与向下转型两种:

  - 向上转型:当有子类对象赋值给一个父类引用时,便是向上转型,多态本身就是向上转型的过程。

使用格式:
父类类型 变量名 = new 子类类型();
如:Animal p = new Cat();

  - 向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用转为子类引用,这个过程是向下转型。如果是直接创建父类对象,是无法向下转型的!

使用格式:
子类类型 变量名 = (子类类型) 父类类型的变量;
如:Cat c = (Cat) a; //变量p 实际上指向Cat对象
 instanceof关键字(用于判断是不是这个类型)
使用格式:
boolean b = 引用变量 instanceof 类;
if(a instanceof Dog){
Dog d = (Dog)a;
}