接口、多重接口实现、抽象类、类型转换

一、什么是接口 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()默认构造器执行了...") ;
	}
}
发布了55 篇原创文章 · 获赞 109 · 访问量 5257

猜你喜欢

转载自blog.csdn.net/qq_37717494/article/details/104951827