抽象类与接口
1.抽象类
(1)抽象类:含有抽象方法的类,抽象类一定是父类,有构造方法,不能实例化。
(2)抽象类与抽象方法的关系:含有抽象方法的类一定是抽象类,抽象类不一定含有抽象方法。当不希望这个类被创建对象时,可以将这个类定义为抽象类,此时不含抽象方法。
(3)抽象类与普通类的区别:
相同点:都是类,都在描述事物
不同点:A.抽象类不能创建对象,普通类可以
B.抽象类可以含有抽象方法,普通类不能含有抽象方法
(4)抽象类的特点:
A.抽象类不能创建对象(实例化),因为含有抽象方法----若能实例化,它就会调用抽象方法,而抽象方法没有实现,所以不可以
B.继承了抽象类的子类,没有重写父类中的抽象方法,那么该子类还是抽象类
(5)abstract不能和哪些关键字同用:
A.final:修饰的方法不能被重写,abstract:修饰的方法必须被重写
B.static:修饰的方法可以通过类名调用,abstract:修饰的方法不能通过类名调用(不能实例化)
C.private:修饰的方法不可以被重写(private作用范围为本类,重写要在另一个类中进行),abstract:修饰的方法必须被重写
(6)代码展示
1 /** 2 * 抽象类的特点: 3 * 1.抽象类不能创建对象(实例化), 4 * 因为含有抽象方法----若能实例化,它就会调用抽象方法,而抽象方法没有实现,所以不可以 5 * 2.继承了抽象类的子类,没有重写父类中的抽象方法,那么该子类还是抽象类 6 * 7 */ 8 9 //计算圆形,矩形的面积 10 abstract class Shape{ 11 public abstract double getArea(); 12 13 } 14 abstract class Circle extends Shape{ 15 private double radius; 16 Circle(double radius){ 17 this.radius = radius; 18 } 19 //继承了父类的抽象方法,含有抽象方法, 20 // 如果没有重写该抽象方法,那么该类也是抽象类 21 //public abstract double getArea(); 22 } 23 24 class Rectangle extends Shape{ 25 private double length; 26 private double width; 27 public Rectangle(double length,double width) { 28 this.length = length; 29 this.width = width; 30 } 31 public double getArea(){ 32 return length*width; 33 } 34 } 35 public class AreaTest { 36 37 public static void main(String[] args) { 38 //Shape s = new Shape();抽象类不能实例化 39 40 Rectangle r = new Rectangle(4.0, 3.0); 41 System.out.print(r.getArea()); 42 } 43 44 }
1 /** 2 *需求:公司中的程序员有姓名,工号,薪水,工作内容 3 *项目经理除了有姓名,工号,薪水,还有奖金,工作内容。 4 *对给出需求进行数据建模 5 * 6 * 7 */ 8 9 abstract class Employee{ 10 private String name; 11 private String id; 12 private double money; 13 14 public Employee(){} 15 16 public Employee(String name,String id,double money){ 17 this.name = name; 18 this.id = id; 19 this.money = money; 20 } 21 22 public abstract void work(); 23 } 24 25 class Programmer extends Employee{ 26 public Programmer(){} 27 public Programmer(String name,String id,double money){ 28 super(name,id,money); 29 } 30 public void work(){ 31 System.out.println("写代码"); 32 } 33 } 34 35 class Manager extends Employee{ 36 private double bonus;//奖金 37 public Manager(){} 38 public Manager(String name,String id,double money,double bonus){ 39 super(name,id,money); 40 this.bonus = bonus; 41 } 42 public void work(){ 43 System.out.println("管理程序员"); 44 } 45 } 46 public class AreaTest { 47 48 public static void main(String[] args) { 49 // TODO Auto-generated method stub 50 Programmer p = new Programmer("张三","001",1000.0); 51 p.work(); 52 53 Manager m = new Manager("李四","002",1000.0,1000.0); 54 m.work(); 55 56 } 57 58 }
2.接口
(1)定义形式
interface 接口名
{
全局常量(public static final)
抽象方法(public abstract)
}
(2)接口是可以多实现的
因为接口中的方法都是抽象的,都没有实现,在创建子类对象并调用该重写的抽象方法时很明确
就是调用重写之后的方法,不会出现调用的不确定性
接口解决了java单继承的问题
interface inter1{ public static final int Num = 25; public abstract void show(); } interface inter2{ public abstract void fun(); public abstract void show(); } class MyTest implements inter1,inter2{ @Override public void show() { System.out.println("show"); } @Override public void fun() { // TODO Auto-generated method stub } } public class InterfaceTest { public static void main(String[] args) { // TODO Auto-generated method stub MyTest test = new MyTest(); test.show(); System.out.println(test.Num); System.out.println(MyTest.Num); System.out.println(inter1.Num); } }
运行结果:
show
25
25
25
3.抽象类与接口的区别:
一个类在继承的同时还可以去实现接口
类和类之间是继承的关系
类和接口之间是实现的关系
通过继承可以得到该继承体系的基本功能
通过实现接口可以得到继承体系之外的功能
接口和接口之间是继承的关系,而且多继承
interface inner1{}
interface inner2{}
interface inner3 extends inner1,inner2,inner3{}