Java接口和抽象方法

在这里插入图片描述

抽象方法

  • 抽象类的子类必须重写/覆盖/实现抽象类中的抽象方法,否则编译无法通过
  • 问题: 没有方法体的都是抽象方法吗?
    • 错误 Object中的public native int hashCode();
    • native: 表示调用本地JVM程序(C++的动态链接库(dll))

  • public abstract void abstractMethod();
    • 没有方法体,以分号结尾
    • 在修饰符后面用abstract进行修饰
    • 抽象方法必须出现在抽象类中,但是抽象类中不一定存在抽象方法,可以有普通方法
/**
 * 
 * @author 28229
 *
 *	1. 抽象类的子类必须重写/覆盖/实现抽象类中的抽象方法,否则编译无法通过
 *
 */


public class abstract02 {

	public static void main(String[] args) {
		
		//多态
		Animal animal = new Bird(); //向上转型, 自动类型转换
		
		animal.move();
		
	}
}

//抽象类animal
abstract class Animal{
	
	//抽象方法
	public abstract void move();
	
}

//bird
class Bird extends Animal{
	
	//实现父类中的抽象方法
	public void move() {
		System.out.println("鸟在飞...");
	}
	
}

接口

  • 接口是一种引用数据类型
  • 接口是完全抽象的
  • 如何定义接口?
    • [修饰符列表] interface 接口名
  • 接口中有多继承
  • 接口中只有常量+抽象方法(jdk1.8后可以有静态方法)
  • 接口中所有的元素都是public修饰的
  • 接口中的抽象方法public abstract可以省略
  • 接口中的public static final可以省略
  • 在jdk1.8中,接口里可以有静态方法,接口里的静态方法 必须要有方法体,并且静态方法不需要子类实现
  • 注意: 接口和接口之间转换时,即使没有继承关系,也可以强制类型转换,但是,在运行时,也可能会报ClassCastException异常

  • 接口中的静态方法


package myinterface;

public class text01 {

	public static void main(String[] args) {
		
		//无法修改,因为k是常量
		//Myinter.k = 20;
		
		Myinter.syahello();
		
	}
	
}

interface Myinter{
	
	int k = 2;
	
	//接口中可以存在静态方法,并且静态方法不需要子类实现
	public static void syahello() {
		System.out.println("hello");
	}
	
}


  • 接口多继承

package myinterface;

public class test02 {

	public static void main(String[] args) {
		
		//多态: 子类的实例可以赋给父类做引用
		A a = new D();
		B b = new D();
		
		//a去调用m1
		a.m1();

		//如果a想调用m2怎么办?
		//1.强制类型转换(接口转换)
		B b1 = (B)a;
		b1.m2();
		
		//2.向下转型
		D d = (D)a;
		d.m2();
		
		/**
		 * 注意: 接口和接口之间转换时,即使没有继承关系,也可以强制类型转换
		 * 但是,在运行时,也可能会报ClassCastException异常
		 */
		
		//此时a和c并没有任何关系,但是依然可以进行强转,不过在运行时会出错
		//C c = (C)a;
		/**
		 * 异常信息
		 *  java.lang.ClassCastException: class myinterface.D cannot be cast to class myinterface.C
		 *  
		 */
		
		//在进行强制类型转换时,尽量使用if+instanceof进行判断
		if(a instanceof C) {
			C c = (C)a;
		}
		
	}
	
}

interface A{
	public void m1();
}

interface B{
	public void m2();
}

interface C{
	
}

//多实现
class D implements A,B{
	
	//重写两个接口中的方法
	public void m1() {
		System.out.println("m1...");
	}
	
	public void m2() {
		System.out.println("m2...");
	}
	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值