接口、接口实现、抽象类、类型转换
一、什么是接口 interface
接口的概念:接口就是某个事物对外提供的一些功能的申明,一种标准.
一般使用接口声明方法或常量,接口中的方法只能是声明,不能是具体的实现
/**
*开关接口类型
*/
interface ISwitch {
//默认修饰符为public static final .
int num = 123;
//接口中的方法默认修饰符public abstract
void turnOn() ; //开
void turnOff () ; //关.
}
二、如何定义接口和使用接口
使用 interface 关键字定义接口
- 接口中的成员变量默认的修饰符为: public static final
- 接口中中的成员方法默认的修饰符: public abstract
对 static、final、abstract 不太清楚的朋友可以我写的这篇文章:
方法的修饰符static、final、abstract - 声明接口类型对象,持有实现该接口的子类对象的引用. [多态]
- 子类实现接口使用关键字 implements
- 子类实现接口,必须实现接口中的所有抽象方法
package com. whos. demo09;
/**
*开关接口类型
*/
interface ISwitch {
//默认修饰符为public static final
int num = 123;
//接口中的方法默认修饰符public abstract
void turnOn() ; //开
void turnOff() ; //关
}
class A implements ISwitch{
public void turnOn() { // reduce 减少visiblity可见性
System.out.println ("实现开关的开功能!") ;
}
public void turnOff () {
System.out.println ("实现开关的关功能!") ;
}
}
public class Test {
public static void main (String[] args) {
ISwitch il = new A() ;
il.turn0n() ;
il.turnOff () ;
}
}
三、接口多重实现
- 可以利用接口实现多态,同时接口也弥补了Java单一继承的弱点
- 接口可以继承接口,此时可以理解为接口合并,使用关键字 extends
/**
*开关接口类型
*/
interface ISwitch {
//接口中的方法默认修饰符public abstract
void turnOn() ; / /开
}
interface ISwitch2 {
void turnOff(); //关
}
class A implements ISwitch, ISwitch2 {
public void turnOn() { //reduce减少visiblity可见性
System.out.println ("实现开关的开功能!") ;
}
public void turnOff () {
System.out.println ("实现开关的关功能!") ;
}
接口继承接口--->等价于接口合并
interface ISwitch {
//接口中的方法默认修饰符public abstract
void turnOn(); //开
}
interface ISwitch2 extends ISwitch{
void turnOff () ; //关
}
class A implements ISwitch2 {
public void turnOn(){ //reduce减少visiblity可见性
System.out.println ("实现开关的开功能!") ;
}
public void turnOff () {
System.out.println ("实现开关的关功能!") ;
}
}
- 类A继承一个实现了给定接口 (Iswitch2) 的 OEM 父类,相当于该类A支持了该接口Iswitch2
package com.demo;
/**
*开关接口类型
*/
interface ISwitch {
//接口中的方法默认修饰符 public abstract
void turnOn() ; //开
}
interface ISwitch2 {
void turnOff() ; //关
}
class A extends OEM implements ISwitch {
public void turnOn() { //reduce减少visiblity可见性
System.out.println ("实现开关的开功能!") ;
}
class OEM implements ISwitch2 {
public void turnOff() {
System.out.println ("实现开关的关功能!");
}
}
public class Test {
public static void main (String[] args) {
ISwitch2 i2 = new A() ;
i2.turnOff () ;
}
}
四、抽象类与接口比较
- 相同:都不被直接实例化 instantiate
- 不同:
(1)抽象类用于定义公共模板,强调部份实现
(2)接口用于做功能上的约定,申明.没有实现.
五、instanceof 运算符
用于测试某对象是否是某类的实例,布尔型
为了避免发生java.lang.ClassCastException
类型转换异常.
通常在进行数据类型转换之前,使用 intanceof 判断
package com. whos. demo10;
class Person {
}
class Teacher extends Person{
}
public class Test {
public static void main (String[] args) {
//instanceof用于在对象类型转换之前判断,以避免发生类型转换异常
Teacher t = new Teacher () ;
Person p = t;
if(p instanceof Teacher) {
Teacher t2 = (Teacher)p;
System.out.println ("p对象是一个Teacher ,转换成功") ;
}else{
System.out.println ("p对象不是Teacher") ;
}
}
}
补充 - 类型转换
类型转换又叫造型
对象之间的类型转换必须满足条件: 对象所属的类之间有继承关系
分为:自动类型转换和强制类型转换.
/*
int num = 123;
doublex=num;//自动类型转换
int num2 = (int)x; / /强制类型转换
*/
/*
Teacher t = new Teacher () ;
Person p = t; //自动造型 (类型转换)
Teacher t2 = (Teacher)p; //强制造型
*/
自由块又称为初始化块,先于构造器执行
class Persont{
String name;
static int age;
//自由块
{
age = 20;
System.out.println ("Person类自由块执行了...") ;
}
//静态自由块
static{
age = 30;
System.out.println ("Person类静态自由块执行了... ");
}
public Person() {
System.out.println("Person()默认构造器执行了...") ;
}
}