1.接口
1.1 接口的定义格式
使用的关键字是interface,不再是原来的class.
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 多态
2.1 多态的两种写法
第一种写法: 有子类 有父类
父类名 对象名 = new 子类名(参数列表);
父类类型的变量指向了子类的对象;
通过多态的对象访问变量,访问的父类中的变量
如果子类中重写了父类中的变量,通过多态的对象访问变量,只能访问父类中的那个变量,不能访问子类中重写的变量。(没有为什么,语法就这么规定的,这是多态的一个弊端)没有重写父类中的方法的情况下,通过多态对象访问方法时访问的是父类中的方法
如果子类重写了父类中的方法,通过多态对象访问方法时访问的是子类中重写后的方法。(没有为什么,语法就这么规定的,这是多态的一个弊端)
第二种写法: 有接口 有实现类
接口名 对象名 = 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;
}