Java基础-学习笔记(十二)——抽象类和接口
1、抽象类的定义
java中可以定义一些不含任何语句的方法,它的方法体的实现方式可以交由子类来实现,这种方法叫抽象方法,只要类中有一个抽象方法,这个类就称为抽象类。含有抽象方法的类为抽象类,抽象类中所有的方法不一定全是抽象方法。
2、抽象类的规则
1)抽象类和抽象方法都需要用abstract关键字修饰
2)抽象类不能进行实例化,也就是不能用new创建抽象类的对象
3)抽象方法只需要声明,不用写语句
4)继承抽象类的子类只有在将从父类继承过来的所有抽象方法全部覆盖,该子类才能进行实例化,不然该子类也是抽象类
3、抽象方法的写法
abstract 返回值类型 抽象方法名(参数列表)
1 abstract class Person 2 { 3 String name; 4 private int age; 5 public void getAge(int age) 6 { 7 this.age=age; 8 } 9 abstract void getInfo(){} 10 } 11 class Student extends Person 12 { 13 String school; 14 public void getInfo()//覆盖父类中的getInfo() 15 { 16 System.out.println("name="+name+" "+"age="+age+" "+"school="+school); 17 } 18 public void study() 19 { 20 System.out.println("I'm studing"); 21 } 22 }abstract class Person 23 { 24 String name; 25 private int age; 26 public void getAge(int age) 27 { 28 this.age=age; 29 } 30 abstract void getInfo(){} 31 } 32 class Student extends Person 33 { 34 String school; 35 public void getInfo()//覆盖父类中的getInfo() 36 { 37 System.out.println("name="+name+" "+"age="+age+" "+"school="+school); 38 } 39 public void study() 40 { 41 System.out.println("I'm studing"); 42 } 43 }
4、接口
一个抽象类中所有的方法都是抽象方法,那么我们可以将这个类用另外一种方式来定义。接口是抽象方法和常量值的定义的集合,从本质上讲,接口就是一种特殊的抽象类,这种抽象类只能有常量和方法的定义,不能有变量和方法的实现
abstract class Person
{
public static fina String name;
public static fina int age;
abstract void getInfo(){}
}
这个Person类我们就可以把它定义成接口,由于它是常量(均为全局静态变量)和抽象方法的集合,所以abstract可以省略,常量的public static final也可以省略,并且,默认用public修饰,所以也可以省略public。如下:
public interface Person
{
String name;
int age;
void getInfo();
}
5、实现接口
可以定义一个新的接口来继承一个已有的接口,同样是需要用extends关键字来实现。也可以定义一个类,来实现接口中所有的方法,需要用implements关键字来实现
1 interface Runner 2 { 3 int id=3; 4 void run(); 5 } 6 interface Animal extends Runner 7 { 8 void breathe(); 9 } 10 class Fish implements Animal 11 { 12 void run() 13 { 14 System.out.println("I can swim!"); 15 } 16 /*public void breathe() 17 { 18 System.out.println("I can breathe!"); 19 }*/ 20 } 21 /* 22 F:\java_example\lesson5>javac test.java 23 test.java:10: 错误: Fish不是抽象的, 并且未覆盖Animal中的抽象方法breathe() 24 class Fish implements Animal 25 ^ 26 test.java:12: 错误: Fish中的run()无法实现Runner中的run() 27 void run() 28 ^ 29 正在尝试分配更低的访问权限; 以前为public 30 2 个错误 31 */
上面这段代码出错了,第一:是没有实现接口Animal中的所有类;第二,是由于我们要进行重写方法,那么Fish类中的访问修饰符级别应该高于或等同于接口中方法的访问修饰符
一个类在继承一个父类的同时,可以实现一个或多个接口,但extends关键字必须在implements关键字之前,如下所示
1 class Student extends Person implements Runner 2 { 3 ... 4 public void run() 5 { 6 System.out.println("I can run!"); 7 } 8 ... 9 }
由于接口当中的是static修饰的常量,那么可以直接由类名来进行引用。用来实现接口的类,同样也可以通过该类来直接引用被实现接口中的常量,也可以新建对象来引用
1 interface Runner 2 { 3 int id=3; 4 void run(); 5 } 6 interface Animal extends Runner 7 { 8 void breathe(); 9 } 10 class fish implements Animal 11 { 12 public void run() 13 { 14 System.out.println("I can swim!"); 15 } 16 public void breathe() 17 { 18 System.out.println("I can breathe!"); 19 } 20 } 21 interface Flyer 22 { 23 void Fly(); 24 } 25 class Bird implements Runner,Flyer 26 { 27 public void run() 28 { 29 System.out.println("I can run!"); 30 } 31 public void Fly() 32 { 33 System.out.println("The bird is flying!"); 34 } 35 public static void main(String [] args) 36 { 37 Bird birds=new Bird(); 38 System.out.println("the runner's id is "+Runner.id); 39 birds.Fly(); 40 System.out.println("the runner's id is "+Bird.id); 41 System.out.println("the runner's id is "+birds.id); 42 } 43 } 44 /* 45 F:\java_example\lesson5>java Bird 46 the runner's id is 3 47 The bird is flying! 48 the runner's id is 3 49 the runner's id is 3 50 */
6、接口特性:
实现一个接口就是要实现该接口中的所有方法(抽象类除外);
接口中的方法都是抽象的;
多个无关的类可以实现同一个接口,一个类可以实现多个无关的接口。
7、接口设计的目的:
在java中,设计接口的目的就是为了让类不必受限于单一继承的关系,而可以灵活的继承一些共有的特性,从而达到多重继承的目的,并且避免了C++中多重继承的复杂关系所产生的问题。多重继承的危险性在于一个类可能继承了同一个方法中的不同实现,对于接口来讲就没有这种情况发生,因为接口没有实现。