Java基础复习之抽象类、接口

//本人觉得重点的部分会用不同颜色标出

  • 抽象类

1.抽象类的由来

        父类中的方法,如果所有子类都要重写,那么此时父类的方法体就失去了意义

        那么我们可以把方法体去掉,只留方法的声明,这种只有方法声明没有方法实现的方法称为抽象方法

        含有抽象方法的类一定是抽象类

2.抽象方法的格式;

        public abstract 返回值类型 方法名(参数列表);

3.抽象类的格式:

        public abstract class 类名{....}

4.抽象类怎么用??*************

        a.抽象类不是用来创建对象的!!不能创建对象!!!

        b.天生就是做爹的,用来被子类继承的!!!

        子类继承了抽象类,那么必须重写抽象类中所有的抽象方法,否则子类还是一个抽象类

5.注意事项:

        a.抽象类是不能创建对象的!!!

        b.抽象类是有构造方法,是给子类的构造方法调用的

        (子类所有构造中都有默认使用super()调用父类的无参构造)

        c.抽象类不一定包含抽象方法,但是包含抽象方法的类一定是抽象类

        (抽象类可以有也可以没有抽象方法)

        d.抽象类子类 必须 重写所有抽象方法,否则子类还是一个抽象类

  •  
  • 抽象类中可以定义成员变量,成员方法,构造方法,抽象方法
  • 定义抽象类和抽象方法的关键字是abstract
  • 子类继承抽象类必须重写所有的抽象方法,否则子类还是一个抽象类,必须加上abstract
  • "多态"时,左边可以写"抽象类"类型吗?

         多态:

                 父类类型 变量名 = new 子类类型();

                 假设 Animal是抽象类  Dog 是子类,重写Animal中的所有抽象方法

 

         多态:

                  Animal an = new Dog();

                  an.eat();//编译看父类 ,运行子类

         多态的格式:

                  父类类型 变量名 = new 子类类型();

                  抽象类型类 变量名 = new 子类类型();

  • 接口

1.什么是接口

         专业:接口是方法的集合(接口中只有方法,没有普通的成员变量)

         通俗:接口是一种极端的抽象类(在JDK1.7之前 所有的方法必须都是抽象方法)

         (在JDK1.8时增加默认方法,静态方法)

         (在JDK1.9时增加私有方法,了解即可)

2.定义接口的格式:

         类: 使用关键字 class

         枚举: 使用关键字enum

         抽象类:使用abstract class

         接口: 使用关键字interface

格式:

         public interface 接口名{

                  //不能写普通的成员变量

                  //抽象方法(JDK1.7)

         public abstract 返回值类型 方法名(参数列表);

                  //默认方法(JDK1.8)

         public default 返回值类型 方法名(参数列表){

                 

         }

         //静态方法(JDK1.8)

         public static 返回值类型 方法名(参数列表){

         }

                  //私有方法(忽略)

         private 返回值类型 方法名(参数列表){

 

         }

         }

3.接口的使用**********

         a.接口也是不能创建对象的

         b.天生做爹的,给实现类 实现的!!!

         实现类 实现(implements) 接口 (相当于子类 继承 抽象类)

         public class 实现类 implements 接口{

         a.实现类需要重写接口中所有的抽象方法,否则实现类变成一个抽象类

         b.实现类可以选择性重写接口中默认方法

         c.实现类对于接口的静态方法没有重写这种说法

         d.实现类对于接口的私有方法没有重写这种说法

         }

4.接口的多实现

         一个实现类 可以 实现多个接口

格式:

         public class 实现类 implements 接口1,接口2,接口3....{

                  //1.必须重写所有接口中的所有抽象方法

                  //2.可以选择性重写所有接口中的任何默认方法

                  //3.实现类对于接口的静态方法没有重写这种说法

                  //4.实现类对于接口的私有方法没有重写这种说法

         }

         有同名的方法的接口多实现

         public class 实现类 implements 接口1,接口2,接口3....{

                  //1.如果多个接口有同名的抽象方法,实现类只需要重写一次

                  //2.如果多个接口中有同名的默认方法,实现类必须重写一次

                  //3.静态方法同名,没有问题,哪个接口调用静态方法,调用的就是那个接口中静态方法

                  //4.私有方法同名,更加没有问题,私有方法只能在当前接口中使用

         }

 

5.继承和实现是两套机制

         在实际开发中,一个类 继承 一个父类,同时实现多个接口

格式:

         public class 类名 extends 父类 implements 接口1,接口2...{

                  //如果父类和接口都有相同的抽象方法,只需要写一次即可

                  //父类有一个方法和接口的默认方法重名,可以不重写,父类方法的优先级高

         }

7.接口和接口之间多继承(了解即可)

格式:

         public interface 子接口 extends 父接口1,父接口2...{

                  a.如果多个父接口中有相同抽象方法,子接口只有一个抽象方法

                  b.如果多个父接口中有相同的默认方法,子接口必须重写一次

                  c.私有和静态不需要关注

 

         }

         public class 类名 implements 子接口{

 

         }

         相当于

         public class 类名 implements 父接口1,父接口2,...{

 

         }

 

8.接口的其他成员

         a.接口中无法定义变量,但是可以定义常量

                  必须使用三个修饰符修饰 public static final 数据类型 常量名 = 值;

                  三个修饰符可写可以不写,默认就有!!!!

         b.接口中没有构造方法,也不能创建对象

         c.接口中,没有静态代码块。

 

扩展面试题:

a.Java这么语言支持多继承吗??

         如果是类与类 不支持多继承,只能单继承,但是可以多层继承

         如果是接口与接口 支持多继承

         如果是类和接口,称为实现,而且多实现

b.Java中的抽象类和接口的异同

         相同点

                  a.都可以有抽象方法

                  b.都不能创建对象

                  c.都可以有静态方法和私有方法

                  d.子类继承或者实现后都必须重写所有的抽象方法(如果有)

         不同点

                  a.关键字不一样 abstract class 和 interface

                  b.抽象类可以有普通的变量 接口只能有常量

                  c.抽象类可以有正常方法,接口只能是默认方法

                  d.抽象类支持单继承,接口支持多实现

                  e.抽象类有构造,接口无构造

                  f.抽象类有静态代码块,接口无静态代码块

                  g.从思想层面上

抽象类         定义共性内容

接口         定义额外扩展功能

 

//练习

计算某个图形的面积和周长;
//        具体要求如下:
//        1.所有图形都有面积和周长,计算的方式不同
//        2.正方形周长为: 边长*4; 正方形的面积为: 边长*边长
//        正方形的面积和周长只与边长相关
//        3.圆形的周长为: 2*π*半径; 圆形的面积为: π*半径*半径
//        圆形的面积和周长只与半径相关
//        (PI的值可以使用Math类中的常量值Math.PI或者3.14);

接口

interface Graph {
    //周长
    public abstract void perimeter();
    //面积
    public abstract void area();

}

圆形

public class Cricle implements Graph{
    //圆形
    double banjing;                //英语不太好,用拼音代替了,见谅
    public Cricle(){}
    public Cricle(double banjing){
        this.banjing = banjing;
    }

    @Override
    public void perimeter() {
        System.out.println("半径为"+banjing +"的圆形的半径为" + banjing*2*Math.PI);
    }

    @Override
    public void area() {
        System.out.println("半径为"+banjing+"的圆形的面积为" + banjing * banjing * Math.PI);
    }
}

正方形

public class Square implements Graph{
    double bianchang;            //英文不太好用拼音代替了,见谅
    public Square(){}
    public Square(double bianchang){
        this.bianchang = bianchang;
    }
    @Override
    public void perimeter() {
        System.out.println("边长为"+bianchang+"的正方形的周长是"+4*bianchang);
    }

    @Override
    public void area() {
        System.out.println("边长为"+bianchang+"的正方形的面积是"+bianchang*bianchang);
    }
    //正方形
}

主方法

public class TestDemo {
    public static void main(String[] args) {
        Square s = new Square(2.5);
        s.perimeter();
        s.area();
        Cricle c = new Cricle(2.5);
        c.perimeter();
        c.area();

    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值