抽象类和接口
抽象类和接口
抽象类abstract
abstract抽象类,抽象类不能实例化,他只是一个约束后面可以理解为会有人帮我们实现具体的功能。抽象类里可以有抽象类也可以有普通方法,但是普通类内不能存在抽象方法。
- 不能new这个抽象类,只能靠子类去实现它:约束!
- 抽象类中可以写普通方法
- 抽象方法只能在抽象类中
eg:
//父类:
package shiyan;
public abstract class Abstract {
public Abstract(){
System.out.println("Abstract的构造器");
}
public static void go(){
System.out.println("Abstract的普通方法");
}
public abstract void run();//仅仅约束,证明有这个方法方法没有实现的方法体
public static void main(String[] args) {
}
}
//子类:
package shiyan;
public class Son extends Abstract {//继承
@Override
public void run() { //实现方法
System.out.println("子类实现父类的抽象方法");
}
public Son()
{
System.out.println("StaticStatement的构造器");
}
public static void main(String[] args) {
Son s1=new Son();
s1.run();//抽象方法,实现体已写
s1.go();//继承自抽象类的普通方法
}
}
主要还是为了提高效率减少重复的代码,对于可以直接使用的用普通方法可以直接继承使用,对于有变化的可以使用抽象方法每次重新写出实现。
接口
接口类似于抽象类,不能被实例化,没有构造方法,只能通过类来实现它。
定义语法:
public interface 接口名 { }
**实现类语法: **
public class 类名 implements 接口名1,接口名2…{
实现接口方法体
}
特点:
- 只是一个内部有方法名的抽象个体,没有方法的实现。
写一个方法void run(); 其默认属性为public abstract void run();
-
定义的变量默认为常量 如int age=2; 默认为 public static final int age=2;
public static final自动省略。
-
一个类可以实现多个接口,利用 implements关键字实现。
-
必须重写接口中的方法。
-
在java1.8中接口的静态方法不能被它的实现类继承
接口内部允许存在静态方法,且静态方法需要写方法体。在这个接口的实现类中也不强制要求重写这个静态方法,也可以选择重写。未重写时:在接口的实现类中可以使用 接口名.方法名 访问这个方法,但是不能使用该类的实例化对象访问,重写后:使用接口名.方法名访问的是未重写的方法,使用实现类的对象访问的是重写后的方法。
//学生的接口定义
package Interface;
public interface Student {
int age=20; //常量定义
void study();//抽象方法定义,无实现,public abstract自动省去
public abstract void run();
public static void go(){//不被实现类继承,无法调用
System.out.println("静态方法在interface里要有方法体");
}
}
//老师的接口定义
package Interface;
public interface Teacher {
int age=44;
void teach();
}
//实现类
package Interface;
public class BodyIpil implements Student,Teacher{
@Override
public void study() {
System.out.println("学生接口的学习");
}
@Override
public void run() {
System.out.println("学生接口的跑");
}
@Override
public void teach() {
System.out.println("老师接口的教学");
}
public static void main(String[] args) {
// Student.age=2; 常量不能再被修改
int age= Student.age;
int age2= Teacher.age;//可以复制给响应的变量
BodyIpil body01=new BodyIpil();
body01.run();
body01.teach();
body01.study();
// body01.go();不能继承go();
}
}