抽象类基本语法
抽象类
1.如何定义抽象类?
class关键字前加abstract
2.抽象类无法被实例化,抽象类无法创建对象
public abstract class A{
public static void main(String[] args){
A a1 = new A(); //这条语句执行会报错,因为抽象类无法实例化,即无法创建新的对象
}
public A(){
System.out.printlm("sss"); //虽然无法被实例化,但是也有构造方法
}
}
public B extends A{
public B(){
super();//通过super关键字访问父类构造方法,从这也可以看到super并没有创建新的对象
}
}
3.虽然抽象类没有办法实例化,但是抽象类也有构造方法,该构造方法是给子类创建对象用的(子类是通过super访问父类的构造方法)
4.抽象类中可以定义抽象方法。
抽象方法的语法:在方法的修饰符列表中添加abstract关键字,并且抽象方法应该以';' 结束不能带有'{}'
例如:public abstract void m1();
5.当一个非抽象子类继承一个含有抽象方法的抽象类时,必须在子类中对这个抽象方法进行重写否则会报错
err:The type B must implement the inherited abstract method A.m10l
6.一个非抽象类的类继承抽象类,必须将抽象类中的抽象方法覆盖,实现,重写
}
7.抽象类不能被final修饰
public final abstract class A{} //这个会报错的
抽象方法不能被final修饰
public final abstract void m1(); 同样会报错 //总结final和abstract不能共存
深入final关键字
public class Test{
public static void main(String[] args)
{
final Customer c = new Customer("JACK",15); //这样的语法是正确的,final可以在创建对象的 时候使用
c = new Customer("Bob",16);//这行命令无法执行,因为使用了final之后代表了c的内存地址被锁住 了无法再更改为其他对象的内存地址
c.name = "Bob";
c.age = 16; //这两句代码时允许的,因为对象内部的数据是可以更改的,锁住的只是对象的内存地址
}
}
public class Custmoer{
public String name;
public int age;
public Customer(String n,int a){
this.name = name;
this.a = age;
}
}
接口
/*
接口也是一种引用类型,可以等同看做类。
1.如何定义接口,语法;
[修饰符] interface 接口名{}
2.接口中只能出现常量:常量、抽象方法
3.接口尤其是一个特殊的抽象类,特殊在接口是完全抽象的。
4.接口中没有构造方法,无法被实例化。
5.接口和接口之间可以多继承。
6.一个类可以实现多个接口。(这里的“实现”可以等同看作“继承”)
7.一个非抽象的类可以实现接口,需要将接口中所有的方法“实现/重写/覆盖”
*/
public interface A{
//常量(必须要用public static final修饰)
public static final String SUCCESS = "success";
public static final double PI = 3.14;
byte MAX_VALUE = 12;//常量
//抽象方法
//抽象方法(接口中所有的抽象方法都是public abstract)
public abstract void m1();
//public abstract 是可以省略的
void m1();
}
1.可以实现多继承
public interface A{
void m1();
}
public interface B{
void m2();
}
public interface C{
void m3();
}
public interface Test extends A,B,C{ //这代表接口和接口之间可以多继承
void m4();
}
一个类实现多个接口 通过implements关键字来连接
implements代表实现的意思
implements跟extends意义相同
class MyClass implements B,C{ // 代表了一个实现了多个接口
public void m2(){}
public void m3(){} //代表要重写实现接口里的所有抽象方法
}
class F implements E{
public void m1(){}
public void m2(){}
public void m3(){}
public void m4(){} //同样代表要实现接口里所有的抽象方法
}
接口的作用(应用)
1.可以使项目分层,所有层都面向接口开发,开发效率提高了。
这里理解为,一个只需要写接口里的实现方法,另一个只需要去调用接口里的方法,都是面对接口。
2.接口使代码和代码之间的耦合度降低,就像内存条和主板之间的关系,变得可”插拔“
首先会写一个接口
public interface CustomerService{
public void quit();
}
会需要有人去写这个接口的实现类
public CustomerServericeImp implements CustomerServerice{
public void quit(){
System.out.println("系统成功退出")
}
}
public class Test{
public static void main(String[] args){
CustmoerServerice c1 = new CustomerServericeImp();//多态,(要点:编译期看左边,执行阶段 看右边,具体对象内的quit()函数)
c1.quit(); //程序执行完毕会,会输出:系统成功退出
}
}
通过汽车与引擎的例子,其中引擎有不同的品牌
//引擎作为接口,引擎生产厂家面向他,汽车页面向它
public interface Engnie{
public void start();
}
public class YAMAHA implements Engine{
public void start(){
System.out.println("YAMAHA Start!");
}
}
public class HONDA implements Engine{
public void start(){
System.out.println("HONDA Start!");
}
}
public class Car{
Engnie engnie;
public Car(Engnie e){
this.engnie = e;
}
public void carTest(){
e.start();
}
}