抽象方法与抽象类的介绍
抽象类:定义了抽象方法的类或者用abstract关键字修饰的类就是抽象类。
抽象方法:就是用abstract关键字修饰,并且没有大括号直接,直接分号结束的方法。
(1)抽象类的语法格式 :
[权限修饰符(例如:public private等)] abstract class 类名
{
成员变量;
成员方法;
构造方法;
抽象方法;
}
(2)抽象方法的语法格式:
[访问修饰符] abstract 返回值类型 方法名(参数表);
例如:
public abstract void show();
abstract的注意事项:
1.抽象类中可以有抽象方法,也可以没有。
例如:
public abstract class People {
public int age;
public String name;
public void show()
{
System.out.println(age+""+name);
}
}
2.但拥有抽象方法就必须是抽象类。
例如:
很明显程序报错无法运行。
那么抽象类到底有何意义呢?
其实抽象类的意义不在于实例化而在于被继承,若一个类继承自抽象类,那么就必须重写该方法。因此抽象类对子类有很强的规范性。
与C语言的对比
在C语言中中,我们常常会说先声明后定义,而在Java中同样也有这种类似的声明概念,即抽象方法。抽象方法和抽象类有效的帮我们解决了代码的规范问题。
抽象方法的缺点
抽象方法的的缺点十分容易找到就是代码过于赘余。
例如:
public abstract class People {
public int age;
public String name;
public abstract void show();
public abstract void walk();
public abstract void sleep();
public abstract void watch();
public abstract void sniff();
public abstract void hear();
}
我们可以看到pubic abstract 过于重复,而且抽象类又不完全是只能写抽象方法,因此起到的规范性其实并不是特别强。那么这样解决这个问题呢?于是引入了下一个概念:接口
接口的介绍
(1)接口定义
使用 interface 来定义一个接口。接口的定义与类的定义类似,也是分为接口的声明和接口体,其中接口体由常量定义和方法定义两部分组成。定义接口的基本格式如下:
[修饰符] interface 接口名[ extends 父接口名列表]{
[public ][ static ][ final ]常量;
[ public ][ abstract ]方法;
}
修饰符:可选,用于指定接口的访问权限,可选值为 public 。如果省略则使用默认的访问权限。
接口名:必选参数,用于指定接口的名称,接口名必须是合法的 Java 标识符。一般情况下,要求首字母大写。
方法:接口中的方法只有定义而没有实现。
例如:
public interface CallInterface {
final static float PI=3.1415926f;//定义用于表示圆周率的常量PI
float getArea(float r); //定义一个计算面积的方法 getArea()
float getCircumference(float r); //定义一个用于计算周长的方法 getCircumference()
}
(2)接口实现
接口在定义后,就可以在类中实现该接口。在类中实现接口可以使用关键 implements ,其基本格式如下:
[修饰符] class <类名>[ extends 父类名][ implements 接口列表]
例如:
public class Circle implements CallInterface{
public float getArea(float r){
return PI*r*r;
}
public float getCircumference(float r){
return 2*PI*r;
}
}
值得一提的是尽管接口是一种新的关键字,但它的本质还是一种类即public abstra的类,但与直接写public abstract类不同的是它其实加了一个规则:既无法写成员方法了,所写的全部方法其实都是public abstract的方法了。因此规范性更强。而与继承不同的是它支持多接口[ implements a1,a2,a3……(a1,a2表示接口名)],与继承相同的是它也支持多态。