栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java面向对象 接口

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java面向对象 接口

首先要清楚接口和类是两个并列结构。

接口:举例:


代码理解:

package com.atguigu.java2;

public class InterfaceTest {
	public static void main(String[] args) {
		System.out.println(Flyable.MAX_SPEED);
		System.out.println(Flyable.MIN_SPEED);
//		Flyable.MIN_SPEED=2;   //此处注释打开编译出错,final修饰不可变
		Plane plane =new Plane();
		plane.fly();
	}
}

interface Flyable{
	//定义全局常量
	public static final int MAX_SPEED=7900;
	int MIN_SPEED=1;  //public static final的,书写时可以省略,结构依然在
	//定义抽象方法
	public abstract void fly();
	void stop();   //省略了public abstract,结构依然在,仍为抽象方法 
}

class Plane implements Flyable{ //让飞机类实现“可飞”的接口
//接口中有两个抽象方法,此处需要重写抽象方法或将此飞机类设为抽象类
	@Override
	public void fly() {
		System.out.println("飞机通过引擎起飞");
		
	}
	@Override   //对于抽象的方法,严格来说不是重写,而是实现
	public void stop() {
		System.out.println("驾驶员加速停止");
	}  	
}

abstract class kite implements Flyable{  //注意此处使用了abstract

	@Override
	public void fly() {
		// TODO Auto-generated method stub
		
	}
	
}

package com.atguigu.java2;

public class InterfaceTest {
	public static void main(String[] args) {
		System.out.println(Flyable.MAX_SPEED);
		System.out.println(Flyable.MIN_SPEED);
		Plane plane =new Plane();
		plane.fly();
	}
}

interface Flyable{
	//定义全局常量
	public static final int MAX_SPEED=7900;
	int MIN_SPEED=1;  
	//定义两个抽象方法
	public abstract void fly();
	void stop();   
}
interface Attackable{
	void attack();   //此为抽象方法省略了public abstract
}

//实现多个接口(需要实现接口中所有抽象方法),逗号隔开
class Bullet extends Object implements Flyable,Attackable,CC{  //先继承父类,再写实现的接口
	@Override
	public void attack() {
			
	}
	@Override
	public void fly() {
		
	}
	@Override
	public void stop() {
		
	}
	//把CC中包含的抽象方法全部实现(重写)
	@Override
	public void method1() {
		
	}
	@Override
	public void method2() {
		
	}  
}
class Plane implements Flyable{ //让飞机类实现“可飞”的接口
	@Override
	public void fly() {
		System.out.println("飞机通过引擎起飞");
	}
	@Override   //对于抽象的方法,严格来说不是重写,而是实现
	public void stop() {
		System.out.println("驾驶员加速停止");
	}  	
}
/
public class USBTest {
	public static void main(String[] args) {
		Computer computer=new Computer();
		//接口不可以造对象,所以只能造它的实现类的对象---->多态
		Flash flash=new Flash();
		computer.transferData(flash);
	}
}
class Computer{
	public void transferData(USB usb){  //声明为USB,实际上new的是一个实现类对象
		usb.start();   //编译的时候认为调用的都是抽象方法,实际执行的是实现类对象重写的方法
		System.out.println("具体传输细节");
		usb.stop();
	}
}

interface USB{       //实际上体现一种规范:谁想和电脑传输数据都要把此接口进行实现,并且把其中的规范明确一下
	//省略长宽尺寸,最大最小的传输速度等常量的定义
	//定义两个抽象方法
	void start(); 
	void stop();
}

class Flash implements USB{  //U盘类
	@Override
	public void start() {
		System.out.println("U盘开启工作");
	}
	@Override
	public void stop() {
		System.out.println("U盘结束工作");
	}
}
class Printer implements USB{  //打印机类
	@Override
	public void start() {
		System.out.println("打印机开启工作");	
	}
	@Override
	public void stop() {
		System.out.println("打印机结束工作");
	}
}

创建接口匿名实现类的对象

package com.atguigu.java2;
public class USBTest {
	public static void main(String[] args) {
		Computer computer=new Computer();
		//接口不可以造对象,所以只能造它的实现类的对象---->多态
		//1,创建接口的非匿名实现类的非匿名对象
		Flash flash=new Flash();
		computer.transferData(flash);
		//2,创建接口的非匿名实现类的匿名对象
		computer.transferData(new Printer());
		//3,创建接口的匿名实现类的非匿名对象
		USB phone=new USB(){  //对象名为phone
			@Override
			public void start() {
				System.out.println("手机开始工作");
			}
			@Override
			public void stop() {
				System.out.println("手机结束工作");
			}
		};
		computer.transferData(phone);
		//4,创建接口的匿名实现类的匿名对象
		computer.transferData(new USB(){
			@Override
			public void start() {
				System.out.println("mp3开始工作");
			}
			@Override
			public void stop() {
				System.out.println("mp3结束工作");
			}
		});
		
	}
}
class Computer{
	public void transferData(USB usb){  //声明为USB,实际上new的是一个实现类对象
		usb.start();   //编译的时候认为调用的都是接口的抽象方法,实际执行的是实现类对象重写的方法
		System.out.println("具体传输细节");
		usb.stop();
	}
}

interface USB{       //实际上体现一种规范:谁想和电脑传输数据都要把此接口进行实现,并且把其中的规范明确一下
	//省略长宽尺寸,最大最小的传输速度等常量的定义
	//定义两个抽象方法
	void start(); 
	void stop();
}

class Flash implements USB{  //U盘类
	@Override
	public void start() {
		System.out.println("U盘开启工作");
	}
	@Override
	public void stop() {
		System.out.println("U盘结束工作");
	}
}
class Printer implements USB{  //打印机类
	@Override
	public void start() {
		System.out.println("打印机开启工作");	
	}
	@Override
	public void stop() {
		System.out.println("打印机结束工作");
	}
}

练习:


此程序会编译出错,因为x不明确,需要进行修改:

我们想输出父类的x时,使用:
System.out.println(super.x); //1


我们想输出接口的x,使用:
System.out.println(A.x); //0
接口中的x为全局常量,可以通过此方法调用。






①Circle

package com.atguigu.exer2;

public class Circle {
	private double radius;
	
	public Circle() {
		super();
	}
	public Circle(double radius) {
		super();
		this.radius = radius;
	}
	
	public double getRadius() {
		return radius;
	}
	public void setRadius(double radius) {
		this.radius = radius;
	}
}

②接口

package com.atguigu.exer2;
public interface CompareObject {
	public int compareTo(Object o); //此方法为抽象方法。若返回值是 0 , 代表相等; 若为正数,代表当前对象大;负数代表当前对象小
}

③ComparableCircle类

package com.atguigu.exer2;

import javax.management.RuntimeErrorException;

public class ComparableCircle extends Circle implements CompareObject{
	public ComparableCircle(double radius) {
		super(radius);
	}
	
	//重写接口中的抽象方法  ---->比较对象大小
	@Override
	public int compareTo(Object o) {
		if(this==o){
			return 0; //地址都一样,必定等
		}
		if(o instanceof ComparableCircle){
			ComparableCircle c=(ComparableCircle)o;
//			return (int) (this.getRadius()-c.getRadius()); //错误。强转会造成精度损失,如2.3-2.1强转后变为0
			//正确写法:
			if(this.getRadius()>c.getRadius()){
				return 1;
			}else if(this.getRadius() 

④ComparableCircleTest测试

package com.atguigu.exer2;

public class ComparableCircleTest {
	public static void main(String[] args) {
		ComparableCircle c1=new ComparableCircle(3.4);
		ComparableCircle c2=new ComparableCircle(3.6);
		
		int comparevalue=c1.compareTo(c2);
		if(comparevalue>0){
			System.out.println("c1对象大");
		}else if(comparevalue<0){
			System.out.println("c2对象大");
		}else{
			System.out.println("c1与c2一样大");
		}
		
	}
}


JDK7及以前:只能定义全局常量和抽象方法

 全局常量:public static final的,书写时可以省略
 抽象方法:public abstract的

JDK8开始:除了定义全局常量和抽象方法之外,还可以定义静态方法、默认方法。

接口1:

package com.atguigu.Java8;

public interface CompareA {  //接口
	//静态方法(可以直接通过接口来调用)
	public static void method1(){   //Java8中可以有方法体
		System.out.println("CompareA:北京");
	}
	//默认方法
	public default void method2(){  //默认方法
		System.out.println("CompareA:上海");
	}
	default void method3(){  //默认方法,省略public
		System.out.println("CompareA:上海");
	}
}

接口2:

package com.atguigu.Java8;

public interface CompareB {
	default void method3(){
		System.out.println("CompareB:上海");
	}
}

父类SuperClass:

package com.atguigu.Java8;

public class SuperClass {
	public void method3(){
		System.out.println("SuperClass:北京");
	}
}

SubClassTest:

package com.atguigu.Java8;
public class SubClassTest {
	public static void main(String[] args) {
		SubClass s=new SubClass();
//		s.method1();    此处注释打开会报错,说没有定义method1方法
		//知识点1:接口中定义的静态方法只能通过接口来调用
		CompareA.method1();  //CompareA:北京。此为正确写法
		//知识点2:通过实现类的对象,可以调用接口中的默认方法;如果实现类重写了接口中的默认方法,调用时,调用的是重写以后的方法
		s.method2();  //SubClass:上海
		
		s.method3();  //注意此处输出SuperClass:北京
		
//		SubClass.method2();  //此处注释打开会报错,因为method2不是静态的,所以不能通过类调用,而是需要经过对象
	}

}

class SubClass extends SuperClass implements CompareA,CompareB{  //继承父类,实现接口
	public void method2(){  //重写覆盖
		System.out.println("SubClass:上海");
	}
	
	public void myMethod(){
		super.method3(); //调用父类中的方法
		//调用接口中的默认方法
		CompareA.super.method3();
		CompareB.super.method3();
	}
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/782306.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号