Java知识总结-抽象类和接口

本文详细介绍了抽象类和接口的概念,包括抽象方法、成员变量、常量、权限修饰符等关键要素,并通过示例代码展示了它们的使用方式及区别。通过对比抽象类和接口的特性,帮助读者深化对面向对象编程的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


说明:接口中容易混淆的是成员的隐式修饰,并且犯过以为抽象方法不需要写返回值类型的错误。这里特意写篇关于抽象类和接口的文章加深记忆。

一、抽象类

抽象方法:只有功能定义,没有功能主体的方法。抽象不可以被直接调用。

具有抽象方法的类一定要定义为抽象类,注:抽象类中可以不定义抽象方法。

下面为简单的抽象类和抽象方法定义:

abstract class Demo{    //抽象类
	abstract void show();  //抽象方法
}

注意:抽象方法具有返回值类型。

1.抽象类不可以被创建对象:

abstract class Demo{
	abstract void show();
}
public class Test {
	public static void main(String[] args) {
     Demo d=new Demo();
	}
}

结果:编译失败,无法创建抽象类对象。

2.当抽象类中不定义抽象方法时,其目的仅仅是为了不让该类创建对象。例:

abstract class Demo{
	void show(){
		System.out.println("show");
	}
}

3.抽象类中的抽象方法要被使用,必须由子类复写其所有的抽象方法后,建立子类对象后调用子类的复写方法。例:

abstract class People{  //抽象类
	abstract void say();//抽象方法
}
class Chinese extends People{  //抽象类的子类
	public void say(){   // 复写父类的抽象方法
		System.out.println("中文");
	}
}
public class Test {
	public static void main(String[] args) {
	 Chinese s=new Chinese();//创建子类对象
     s.say();//调用子类对象的复写方法
	}
}

运行结果:

中文

4.如果子类子覆盖了一个抽象类的部分抽象方法(还有一部分抽象没有被覆盖),那么该子类还是一个抽象类。例:

abstract class People{  //抽象类
	abstract void say();//抽象方法
	abstract void eat();//抽象方法
}
abstract class Chinese extends People{  //子类仍然为抽象类
	public void say(){   // 只复写父类的部分抽象方法
		System.out.println("中文");
	}
}

5.抽象类中可以定义成员变量,并且不用被abstract关键词所修饰。例:

abstract class People{  //抽象类
	abstract void say();//抽象方法
	int x=5;//抽象类中的成员变量
}
class Chinese extends People{  //子类仍然为抽象类
	public void say(){   // 只复写父类的部分抽象方法
		System.out.println("中文");
	}
}
public class Test {
	public static void main(String[] args) {
	 Chinese s=new Chinese();//创建子类对象
     s.say();//调用子类对象的复写方法
     System.out.println(s.x);
	}
}

运行结果:

中文
5



二、接口
接口中常见定义:常量,抽象方法。

接口中的成员都有固定修饰符。
常量:public static final

方法:public abstract

注:因为接口中抽象方法被public修饰,所以当子类实现接口复写抽象方法时,复写方法也必须用public修饰。否则会因为权限小于接口中抽象方法而无法实现覆盖。

且这些修饰符都是默认隐式存在的,当没有手动添加的时候,java会隐式地添加这些修饰符。

下面是一个简单的接口:

interface Demo{  //接口
	public abstract void show(); //常量
	public static final int NUM=3;//抽象方法
}

1.与抽象类一样,接口是不可以创建对象的,因为接口中也有抽象方法,例:

interface Demo{
	public abstract void show();
	public static final int NUM=3;
}
public class Test {
	public static void main(String[] args) {
	 Demo d=new Demo();
	}
}

结果编译失败,无法为接口创建对象。

2。可以通过一个子类实现该接口,子类需要覆盖接口中的全部抽象方法,才可以创建子类对象。例:

interface People{//定义接口
	public abstract void say();//抽象方法
	public abstract void eat();//抽象方法
}
class Chinese implements People{//定义子类实现接口
	public void say(){ //复写抽象方法
		System.out.println("中文");
	}
	public void eat(){//复写抽象方法
		System.out.println("中餐");
	}
}
public class Test {
	public static void main(String[] args) {
	 Chinese c=new Chinese();//创建子类对象
	 c.eat(); //调用子类复写方法
	 c.say();//调用子类复写方法
	}
}

运行结果;

中餐
中文

3.当子类实现接口时,如果没有将全部抽象方法覆盖(还有部分抽象方法没有覆盖),那么子类就是一个抽象类,

interface People{//定义接口
	public abstract void say();//抽象方法
	public abstract void eat();//抽象方法
}
abstract class Chinese implements People{//子类为抽象类
	public void say(){ //复写抽象方法
		System.out.println("中文");
	}
	/*
	 * 该抽象方法没有被覆盖
	  public void eat(){//复写抽象方法
	
		System.out.println("中餐");
	}
	*/
}

4.接口与接口是继承关系.例:

interface People{//定义接口
	public abstract void say();//抽象方法
	public abstract void eat();//抽象方法
}
interface Chinese extends People{//子接口
	public abstract void gongfu();//抽象方法
}

注:接口继承接口也使用关键词extends.

5.接口可以同时继承都多个接口,实现多继承特性。

interface A{
	
}
interface B{
	
}
interface C extends A,B{
	
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值