Java学习笔记_12 抽象、接口、内部类

本文介绍了Java中的抽象类、接口和内部类。抽象类主要用于设计和实现分离,接口解决类单一继承问题,提供多继承特性。内部类则分为匿名、成员、静态和局部四种,强调访问外部类数据和隐藏实现细节的能力。文章通过概念辨析、代码演示和异同点对比,帮助理解抽象类与接口的区别。
摘要由CSDN通过智能技术生成

在Java中抽象类(abstract class)表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口(interface)。

抽象:

关键字:abstract

抽象类:用abstract修饰的类叫做抽象类。
在抽象类中,成员变量是常量、成员方法是抽象方法。

抽象方法:用abstract修饰且没有方法体的方法叫做抽象方法。

Java 语言提供了两种类,分别为具体类和抽象类。前面学习接触的类都是具体类。现在,介绍一下抽象类:

简言之,若一个类里面有一种方法只有方法名却没有方法体,这样的类就是抽象类。

在面向对象的概念中,所有的对象都是通过类来描绘的,反之,并不是所有的类都是用来描绘对象的,若一个类中没有包含足够的信息来描绘一个具体的对象,则称这样的类称为抽象类。

概念辨析:
能够定义(存储)抽象方法的类一定是抽象类。√
抽象类里面一定要有抽象方法。×
			
抽象类中:
			成员变量:常量
			成员方法:抽象方法

抽象类存在的意义?

官话:抽象类可以将设计和实现分离。

举个简单的例子:有一个Fish类,里头有一个swim方法,一条鲫鱼说我会swim,一条金枪鱼也说我会swim。此时每一个子类都要继承它。且由于swim已经被父类(Fish)实现了,所以每一个都要重写方法体,你说麻不麻烦。此时JDK发话了,既然这么多子类需要继承他,我就直接不实现这个方法(也就是成为抽象方法),你们谁要用,谁就去实现算了。

这,就是抽象类存在的意义。所以说,抽象方法必须被继承才有意义。

代码演示:

AbstractDemo:

package day11_9;

public abstract class AbstractDemo {
	public abstract void makeMoney();//抽象方法	
}

class S extends AbstractDemo{

	@Override//重写
	public void makeMoney() {
		System.out.println("我今年应挣了一个小目标了");		
	}
}

AbstractTest:

package day11_9;

public class AbstractTest {
	public static void main(String[] args) {
		AbstractDemo s = new S();//或者S s = new S(); 
		s.makeMoney();//【我今年应挣了一个小目标了】
		//向上造型,输出子类中重写父类的方法
		//抽象类不能被直接创建对象
	}
}

接口:

接口是一个特殊的抽象类,接口中的方法都是抽象方法,和常量。(解决类单一继承问题)

关键字:interface

类和接口的关系是实现,类可以实现接口。

Inn:

public interface Inn {
	int a = 1;//前默认static final。也就是常量!
	public void test();//这就是抽象方法!public和void中间的abstract可以省略,默认存在
}

Inn2:

public interface Inn2 {
	int b = 2;
	public void test2();
}

InDemo:

package day11_9;

public class InDemo implements Inn,Inn2{//implements是实现某个接口的意思
	
	public void test() {
		// TODO Auto-generated method stub
		System.out.println("实现了抽象方法");
	}

	public void test2() {
		// TODO Auto-generated method stub
		
	}
	public static void main(String[] args) {//InDemo实现了接口Inn,Inn2,就可以调用接口内部的代码
		InDemo in = new InDemo();
		System.out.println(in.a);
		System.out.println(in.b);
		in.test();
		//in.a = 2;//常量不可被赋值	
	}
}

运行结果:

1
2
实现了抽象方法

接口存在的意义?

为了更好的将设计与实现分离。

抽象类与接口的异同点

相同点:二者都不能直接实例化(new对象),都可以包含抽象方法。

不同点:
1、抽象类使用abstract修饰,接口使用interface修饰。
2、抽象类要被子类继承,接口要被类实现。
3、类是单继承的,接口是多继承的。一个类可以实现多个接口。
4、抽象类中的成员变量可以是各种类型的,而接口中只能定义全局常量(public static final类型)和抽象方法。
注:java中 变量分成员变量 和局部变量 成员变量是指这个类的变量,局部变量是类中 方法体内定义的变量。

联系:接口是一个特殊的抽象类

如何理解抽象类和接口的区别呢?★★★

抽象类是对事物本质的抽象,接口是对动作的抽象。

抽象类强调这个对象是什么,而接口强调这个对象能干什么。

例如,兔子,狗,耗子这三个类,他们的抽象类是动物。
说明他们都是动物。

兔子,狗,耗子都要“呼吸”、“吃饭”。你可以把“呼吸”、“吃饭”定义为一个接口,然后让这些类去实现它。

因此,一个类只能继承一个类(抽象类),正如耗子它不能同时为动物和植物。但是,可以却实现多个接口,例如“呼吸”接口、“吃饭”接口。

综上,当你关注某种事物的本质时,用抽象类。当你关注一个动作时,用接口。

内部类:

此处仅先了解其概念,相关用法后面用到再更。

一、概念

内部类是定义在另一个类中的类。下面类Swim 就是类Sports的内部类:

public class Sports{
    class Swim {}
}

二、内部类的用处?

  • 内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据。
  • 内部类可以对同一个包中的其他类隐藏起来。
  • 当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。

三、内部类的分类

1、匿名内部类

不定义类的名字,在使用的地方直接定义对象。

2、成员内部类

存在于某个类的内部,与全局属性或者方法同级的内部类就是成员内部类。

3、静态内部类

在成员内部类的基础上加上一个static关键字就是静态内部类。

4、局部内部类

定义在一个方法或者一个作用域里的类。它与成员内部类的区别在于,局部内部类的访问仅在于方法内或者作用域内。

package day11_9;

public class ABC {
	
	
	public static void main(String[] args) {
		new AbstractDemo() {//匿名内部类
			
			@Override
			public void makeMoney() {
				// TODO Auto-generated method stub
				
			}
		};//分号不能丢
	}

	class A{//成员内部类
		
	}
	static class B{//静态内部类
		
	}
	public void test(){
		class C{//局部内部类
			
		 }
	}
}

个人学习笔记,若有误还望不吝赐教。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值