Java详述抽象类与接口区别

什么是抽象类

在一个“类”中,如果有抽象方法,则这个类称之为抽象类,需要在class前加abstract。
抽象方法:若一个方法中没有方法体,则方法称之为抽象方法,是因为在多态中,父类的方法体往往多余,因此选择舍去方法体形成抽象方法。其代码形式为:


public abstract class Mammal {//父类
	
	public abstract void move();
}

抽象类详述

1、如果父类有抽象方法,则子类必须实现所以抽象方法,否则该子类必须为抽象类,且抽象类不能创建对象。

public abstract class Mammal {//父类
	
	public abstract void move();
	
	public abstract void breathe();
}

子类可写为:

public class Whale extends Mammal{//子类

	@Override
	public void move() {
		System.out.println("靠鱼鳍游泳");
	}
	
	@Override
	public void breathe() {
		System.out.println("靠鱼鳃游泳");
	}
}

或者:

public abstract class Whale extends Mammal{//子类

}

2、抽象类不能创建对象,但可以有构造方法。

public abstract class Mammal {//父类
	
	public Mammal(int age) {//可以创建Mammal方法
		//Mammal mammal = new Mammal();mammal不能创建对象
	}
	
	public abstract void move();
	
	public abstract void breathe();
}

3、一个抽象类中可以没有抽象方法,但有抽象方法的一定为抽象类
4、抽象类不能由final修饰(多态的直接体现)。
5、抽象类与普通类的区别:
a.抽象类中不能创建对象,普通类中可以;
b.抽象类中有abstract关键词修饰,普通类没有;
c.抽象类可以有抽象方法,普通类一定没有抽象方法。

什么是接口

如果一个源文件中的所有方法,全部为抽象方法,则这个源文件可以定义为接口。代码形式如下:

public interface IMammal {

		public abstract void move();
		
		public abstract void breathe();

}

详述接口

1、接口中没有构造方法。
2、接口中的方法默认为public abstract,所以可以忽略。

public interface IMammal {

	/*public IMammal() {//不能构造方法
		
	}*/
	
	void move();//忽略public abstract
		
	void breathe();//忽略public abstract

}

3、一个接口可以继承多个接口。

interface IA{//接口A
	
}

interface IB{//接口B
	
}
public interface Mammal extends IA,IB{//继承接口A,B
	
	void move();
		
	void breathe();

}

4、规定:接口名以I开头(代码规范)
5、接口中的变量默认为public static final(即均为静态常量)。所以接口中变量的命名需全部大写。

public interface IMammal{
	
	void move();
		
	void breathe();

	int AGE = 957;
}

public class Test {

	public static void main(String[] args) {
		//IMmammal.AGE = 125;  //不可实现,代码报错,从而证明5。
		System.out.println(IMammal.AGE);
		
	}
}

6、接口中抽象方法继承,需要使用implements。
7、实现接口时,可以继承接口中定义的常量。

public interface IMammal{
	
	void move();
		
	void breathe();

	int AGE = 957;
}

public class Whale implements IMammal{

	@Override
	public void move() {
		
	}

	@Override
	public void breathe() {
		
	}

}
public class Test {

	public static void main(String[] args) {
		
		System.out.println(IMammal.AGE);
		System.out.println(Whale.AGE);
		
	}
}

8、一个类如果不实现接口中的所有抽象方法,则该类必须为抽象类。

public interface IMammal{
	
	void move();
		
	void breathe();

	int AGE = 957;
}

public abstract class IWhale implements IMammal{
	@Override
	public void move() {
		
	}
}

9、一个类可以实现多个接口。

public abstract class IWhale implements IMammal,List{

	@Override
	public void move() {
		
	}

	@Override
	public void breathe() {
		
	}
	@Override
	public int size() {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public boolean isEmpty() {
		// TODO Auto-generated method stub
		return false;
	}

}

10、instanceof用来判断前面指向的对象是否为后面的类,结果为boolean类型。

public class Test {

	public static void main(String[] args) {
		
		Whale whale = new Whale();
		
		System.out.println(whale instanceof Whale);
		System.out.println(whale instanceof Object);//Object为所有类的父类
		System.out.println(whale instanceof IMmammal);
		
		
	}
}

结果为:
true
true
true

区别

1、成员变量:
抽象类可以定义任何形式合法的成员变量;
接口只能定义public static final的变量,也是常量。
2、构造方法:
抽象类可以有构造方法;
接口没有限定它不能创建对象,不可以有抽象方法。
3、定义(修饰词):
抽象类需要在class前加abstract;
接口需要在接口名前加interface,而没有class。
4、继承(可继承的数量):
抽象类只能继承一个父类;
接口可以继承多个接口。
5、实现继承:
抽象类使用extends关键字;
接口使用implements关键字。
6、方法:
抽象类可以定义任何方法;
接口只能定义抽象方法,JDK8及其以上版本可以定义多个由static/default关键词修饰的方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中,没有内置的 Tuple2 类型,但是我们可以使用第三方库来创建元组类型。下面以 javatuples 库为例,详述 Tuple2 的使用。 首先需要在项目中引入 javatuples 库的依赖,例如在 Maven 项目中可以添加以下依赖: ```xml <dependency> <groupId>org.javatuples</groupId> <artifactId>javatuples</artifactId> <version>1.2</version> </dependency> ``` 接下来就可以使用 Tuple2 类型了,它的定义如下: ```java public class Tuple2<A, B> extends Tuple { public A getValue0(); public B getValue1(); public void setAt0(A a); public void setAt1(B b); // ... } ``` 其中,A 和 B 分别表示元组中第一个元素和第二个元素的类型,getValue0 和 getValue1 方法用于获取元组中的值,setAt0 和 setAt1 方法用于设置元组中的值。 下面是一个使用 Tuple2 的例子: ```java import org.javatuples.Tuple2; public class Main { public static void main(String[] args) { Tuple2<Integer, String> tuple = new Tuple2<>(42, "hello"); System.out.println("value0 = " + tuple.getValue0()); System.out.println("value1 = " + tuple.getValue1()); tuple.setAt0(99); tuple.setAt1("world"); System.out.println("value0 = " + tuple.getValue0()); System.out.println("value1 = " + tuple.getValue1()); } } ``` 上述代码创建了一个 Tuple2 类型的对象,其中第一个元素是整数 42,第二个元素是字符串 "hello"。通过 getValue0 和 getValue1 方法可以分别获取元组中的值,通过 setAt0 和 setAt1 方法可以修改元组中的值。运行结果如下: ``` value0 = 42 value1 = hello value0 = 99 value1 = world ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值