一、抽象方法与抽象类
1.抽象方法:只有声明没有方法体:abstract public void shout();
2.抽象类:含有抽象方法的类
abstract class Animal {
abstract public void shout(); //抽象方法
}
class Dog extends Animal {
//子类必须实现父类的抽象方法,否则编译错误
public void shout() {
System.out.println("汪汪汪!");
}
public void seeDoor(){
System.out.println("看门中....");
}
}
//测试抽象类
public class TestAbstractClass {
public static void main(String[] args) {
Dog a = new Dog();
a.shout();
a.seeDoor();
}
}
- 抽象类不能实例化,抽象类的构造方法只能被子类调用
- 抽象类只能用来被继承。
- 抽象方法必须在子类中实现,即使方法体为空也行
例子:
public class TestAbstract {
public static void main(String[] args) {
Animal a =new Dog();
a.shout();
// 编译器报错:a.seeDoor();
}
}
abstract class Animal {
abstract public void shout(); //抽象方法
}
class Dog extends Animal {
//子类必须实现父类的抽象方法,否则编译错误
public void shout() {
System.out.println("汪汪汪!");
}
public void seeDoor(){
System.out.println("看门中....");
}
}
- 用抽象类实例化子类时,只能调用抽象类里面的方法
- 注意:抽象类中也可以有非抽象方法,但必须有抽象方法!有抽象方法必定是抽象类!
public class TestAbstract {
public static void main(String[] args) {
Animal a =new Dog();
a.shout();
//a.seeDoor();
a.a();
}
}
abstract class Animal {
abstract public void shout(); //抽象方法
void a(){
System.out.println("lalala");
}
}
class Dog extends Animal {
//子类必须实现父类的抽象方法,否则编译错误
public void shout() {
System.out.println("汪汪汪!");
}
public void seeDoor(){
System.out.println("看门中....");
}
}
二、接口
比较:
-
普通类:具体实现
-
抽象类:具体实现,规范(抽象方法)
-
接口:规范!
什么是接口?
接口就是比抽象类还抽象的抽象类,接口中全部的方法都是抽象方法。
如何使用?
public class TestInterface {
public static void main(String[] args) {
people p = new people();
p.walkWay();
p.walk();
Walk walk = new people();
walk.walk();
}
}
interface Walk{
void walk(); //public abstract ...
int speed = 1; //public static final ...
}
class people implements Walk{
@Override
public void walk() {
// TODO Auto-generated method stub
System.out.println("走路速度:"+speed);
}
public void walkWay() {
System.out.println("双腿行走");
}
}
//双腿行走
//走路速度:1
//走路速度:1
接口说明
- 常量:接口中的属性只能是常量,总是:public static final 修饰。不写也是。
- 方法:接口中的方法只能是:public abstract。 省略的话,也是public abstract。
- 接口不能创建实例,但是可用于声明引用变量类型(可用于调动接口里面的方法)。
- 一个类实现了接口,必须实现接口中所有的方法,并且这些方法只能是public的。
- 接口可以多继承。