天天看点

java面向对象编程——抽象和接口第九章、抽象类第十章、接口(重点)

目录

第九章、抽象类

一、抽象方法和抽象类

1.抽象类

2.抽象方法

3.使用抽象类

4.抽象类继承关系

5.避免矛盾final不能和abstract同时修饰同一个类

二、案例:面积和周长

第十章、接口(重点)

一、接口的定义

1.表现

二、接口的实现

三、接口的继承

四、接口和抽象类的区别

1.相同点:

2.不同点:

五、1.8新特性,可以存在方法体

1.default,必须有方法体

2.static 修饰的方法可以有方法体

六、练习

第九章、抽象类

一、抽象方法和抽象类

        抽象:abstract修饰,没有实体,其实现内容交给子类完成

1.抽象类

  • -由abstract修饰的类,有抽象方法的类就是抽象类
  • - 有抽象方法的类,一定是抽象类
  • - 抽象类可以有非抽象方法
  • -一个类没有抽象方法也可以修饰为抽象类
  • - 抽象类不能被实例化
//抽象类
public abstract class Shape {
    
   
}
​

​
public class TestShape {
    public static void main(String[] args) {
        new Shape();//错误
    }
}
           

2.抽象方法

  • - 没有方法体的方法,称为抽象方法
  • -不需要实现功能,只需要给出定义的方法
public abstract class Shape {
    //抽象方法
    public  abstract void area();//由子类实现内容
    public  abstract void perimeter();//由子类实现内容
}
​

​
           

3.使用抽象类

- 通过继承关系实现定义在抽象类中的所有抽象方法

public abstract class Shape {
    
    public  abstract void area();//由子类实现内容
    public  abstract void perimeter();//由子类实现内容
}
​
public class Circle extend Shape {
    @Override
    public void area() {
        System.out.println("圆的面积:"+4*4*3.14);
    }
}
​
public class Square extend Shape {
     @Override
    public void area() {
        System.out.println("正方形的面积:"+4*4);
    }
}
​
           

4.抽象类继承关系

  • -一个抽象类可以继承另一个抽象类
  • -子类必须实现所有继承关系中没有被实现的方法

5.避免矛盾final不能和abstract同时修饰同一个类

public class Circle extend Shape {  
   //报错,Circle必须声明为抽象类,并完成抽象方法
}
​
           

解决1:当前类变成抽象类

public abstract class Circle extend Shape {  
  
}
​
           

解决2:实现父类中的抽象方法

public class Circle extend Shape {  
   @Override
    public void area() {
        System.out.println("圆的面积:"+4*4*3.14);
    }   
}
           

二、案例:面积和周长

public  abstract  class Shape {
    public  abstract void area();//由子类实现内容
    public  abstract void perimeter();//由子类实现内容
​
}
           
public  abstract  class Circle extends Shape {
​
    public  abstract void show();//由子类实现内容
}
           
public class Square extends Shape{
​
    @Override
    public void area() {
        System.out.println("正方形的面积:"+4*4);
    }
​
    @Override
    public void perimeter() {
        System.out.println("正方形的周长:"+4*4);
​
    }
}
​
           
public  class CircleImpl extends Circle {
​
​
    @Override
    public void area() {
        System.out.println("圆的面积:"+4*4*3.14);
    }
​
    @Override
    public void perimeter() {
        System.out.println("圆的周长:"+4*2*3.14);
​
    }
​
    @Override
    public void show() {
        System.out.println("show.....");
    }
}
           
public class TestShape {
​
    public static void main(String[] args) {
​
        CircleImpl circle = new CircleImpl();
        circle.area();
        circle.perimeter();
​
        Square square = new Square();
        square.area();
        square.perimeter();
    }
}
           

第十章、接口(重点)

一、接口的定义

  • 用interface修饰的为接口
  • 接口中的方法没有方法体---->默认为public abstrace修饰
  • 接口是一种特殊的抽象类,它的功能性更加“纯粹”
  • 接口中的属性都为常量,默认为public static final修饰
  • 接口不能实例化

1.表现

  • 用interface修饰的为接口
public interface Shape {
   
}
           
  • 接口中的方法没有方法体---->默认为public abstrace修饰
    public interface Shape {
        
        public void area();
        public void perimeter();
    }
               
  • 接口是一种特殊的抽象类,它的功能性更加“纯粹”
public interface Shape {
    
    public void area();
    public void perimeter();
    
    public void addUser();
    public void delUser();
    public void queryUser();
    public void updUser();
   
}
           
  • 接口中的属性都为常量,默认为public static final修饰
public interface Shape {
    
    public  static final int USERNAME = 10;   //必须初始化,斜体
    public void area();
    public void perimeter();
   
   
}
           

二、接口的实现

  • 通过实现类采用implement关键字实现定义在接口中的方法
  • 实现类实现接口时必须实现接口中定义的所有方法
  • 接口与接口之间存在继承关系,同样实现类在实现时必须实现其所有关系中的方法
  • 一个实现类可以实现多个接口
public interface SuperShape  {
      
       void show();
    }
}
           
public interface Shape extend SuperShape{
          void area();
          void perimeter();
      
}
           
public class Circle implement Shape,SuperShape {
     @Override
    public void area() {
        System.out.println("area");
    }

    @Override
    public void perimeter() {
        System.out.println("perimeter");
    }

    @Override
    public void show() {
        System.out.println("show....");
    }
}
           

三、接口的继承

  • 接口之间可以有继承关系,但实现类实现某一接口时,必须实现所有继承关系中的抽象方法。
  • 一个类可以实现多个接口,同样也必须实现多个接口中定义的抽象方法
class UserImp implements UserDao,UserMpper{ }
           

四、接口和抽象类的区别

1.相同点:

  • (1)都不能被实例化
  • (2)接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能实例化。

2.不同点:

  • (1)接口只有定义,不能有方法的实现,java 1.8中可以定义default方法体,而抽象类可以有定义与实现,方法可在抽象类中实现。
  • (2)实现接口的关键字为implements,继承抽象类的关键字为extends。一个类可以实现多个接口,但一个类只能继承一个抽象类。所以,使用接口可以间接地实现多重继承。
  • (3)接口强调特定功能的实现,而抽象类强调所属关系。
  • (4)接口成员变量默认为public static final,必须赋初值,不能被修改;其所有的成员方法都是public、abstract的。抽象类中成员变量°默认default,可在子类中被重新定义,也可被重新赋值;抽象方法被abstract修饰,不能被private、static.synchronized和native等修饰,必须以分号结尾,不带花括号。

五、1.8新特性,可以存在方法体

1.default,必须有方法体

default void show() {
​
}
           

2.static 修饰的方法可以有方法体

static  void show() {
​
}
           

六、练习

java面向对象编程——抽象和接口第九章、抽象类第十章、接口(重点)