在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{//局部内部类
}
}
}
个人学习笔记,若有误还望不吝赐教。