抽象类与接口

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{}

原文地址:https://www.cnblogs.com/langdon/p/6297791.html