美文网首页
面向对象五——抽象类和接口

面向对象五——抽象类和接口

作者: 嗷老板 | 来源:发表于2018-02-08 16:40 被阅读0次

    一、final和static关键字

    1、final

      final是一个关键字,表示最终的意思,可以用来修饰类、变量、方法。
      修饰类:表明该类是最终类,不能被继承
      修饰变量:表明该类是常量,不能再次赋值
      修饰方法:表明该方法是最终方法,不能被重写

    2、static

      static是一个关键字,表示静态的意思。可以用来修饰成员变量和成员方法。

    (1)static修饰成员的特点

    • 被类的所有对象共享(这也是判断一个成员是否应该用static修饰的条件)
    • 可以通过类名直接访问
    • 优先于对象存在
    • 随着类的加载而加载

    (2)静态与非静态成员方法的对比

    非静态的成员方法:

    • 能访问静态的成员变量
    • 能访问非静态的成员变量
    • 能访问静态的成员方法
    • 能访问非静态的成员方法

    静态的成员方法:

    • 能访问静态的成员变量
    • 能访问静态的成员方法

    注意:
      静态成员方法中不能出现this,super这样的关键字
      原因:静态是随着类的加载而加载,this,super这样的关键字是随着对象的创建而存在的,先进内存的不能访问后进内存的。

    二、抽象类

    1、概述

      抽象类顾名思义就是用来描述一个抽象的事物的类,比如说我们在说动物的时候,并没有具体的说是那种动物,这就是一个抽象的事物,而如果我说猫,这相对而言就是一个具体的事物。同样的,每个动物都具有吃东西的行为,但是不同动物吃的东西是不同的,所以我们在定义动物这个类的时候不能给出具体的体现,只需要给一个声明既可。
      在Java中,一个没有方法体的方法应该定义为抽象方法,而一个类中如果有抽象方法,该类就必须定义为抽象类。

    2、特点

    (1)抽象类和抽象方法必须使用abstract关键字修饰;
    格式:

    public abstract class 类名 {}
    public abstract 返回值类型 方法名() {}
    

    (2)抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类;
    (3)抽象类不能直接实例化,如果想要实例化,需要参照多态的方式,通过子类对象实例化;
    (4)抽象类的子类要么是抽象类,要么必须重写抽象类中的所以抽象方法。

    案例1:

    //定义一个抽象类
    public abstract class Animal{
        public abstract void eat();
        
        //抽象类中可以有普通方法
        public void sleep(){
            System.out.println("睡觉");
        }
     }
    
    //定义一个子类Cat继承Animal
    public class Cat extends Animal{
        //重写抽象方法
        @Override
        public void eat(){
            System.out.println("猫吃鱼");
        }
    }
    
    //定义测试类
    public class AnimalDemo{
        public static void main(String[] args){
            //创建对象
            Animal a = new Cat();
            a.eat();
            a.sleep();
        }
     }
    

    3、成员的特点

    (1)成员变量:可以是变量也可以是常量;
    (2)构造方法:抽象类中也有构造方法,用于子类访问父类数据的初始化;
    (3)成员方法:成员方法可以是抽象的,也可以是非抽象的。
      抽象方法限定子类必须完成某些动作,非抽象方法能够提高代码的复用性

    案例2

    //定义一个Person类
    public abstract class Person {
        private int age = 20;   
        private String country = "中国";
        
        public Person() {}
        
        public Person(int age) {
            this.age = age;
        }
        
        public void show() {
            age = 30;
            System.out.println(age);
            System.out.println(country);
        }
        
        public abstract void eat();
    }
    
    //定义一个子类Student继承自Person
    public class Student extends Person {
    
        @Override
        public void eat() {
            System.out.println("学生爱吃KFC");
        }       
    }
    
    //定义测试类
    public class PersonDemo {
        public static void main(String[] args) {
            Person p = new Student();
            //Person的对象p可以调用Person的方法,但是运行的时候运行的是Student内的方法
            //如果Student内没有这个方法,再调用Person内的方法
            p.show();
            p.eat();
        }
    }
    

    三、接口

    1、概述

      我们在生活中,每个人都会有不同的技能,这些技能不是一个人与生俱来的,而是我们慢慢学来的,因此我们在定义人类时,不能将这些额外的技能定义进去,因为只有部分人才有这些技能。所以,为了体现事物功能的拓展性,Java中就提供了接口来定义这些额外的功能,并不给出具体实现,将来谁学会了特殊的技能,只需要这部分人实现这些额外的功能。

    2、特点

    (1)接口用关键字interface表示
    格式:

    public interface 接口名{}
    

    (2)类实现接口用implements表示
    格式:

    public class 类名 implements 接口名 {}
    

    (3)接口也不能直接实例化,补习按照多态的方式,有具体的实现类实例化。这也是多态的一种,称为接口多态。
    (4)接口的实现类要么是一个抽象类,要么重写接口中的所有的抽象方法。
    案例3:

    //定义一个钢琴接口
    public interface Piano {
        //抽象方法
        public abstract void playThePiano();
    }
    
    //定义学生类实现钢琴接口
    public class Cat implements Piano {
    
        @Override
        public void playThePiano() {
            System.out.println("学生会弹钢琴");
        }
    
    }
    
    //定义测试类
    public class InterfaceDemo {
        public static void main(String[] args) {
            //接口多态的形式实例化
            Piano p = new Student();
            p.playThePiano();
        }
    }
    

    3、接口的成员特点

    (1)成员变量:只能是常量,默认修饰符为public static final
    (2)构造方法:没有构造方法,因为接口是由于扩张功能的,没有具体存在
    (3)成员方法:只能是抽象方法,默认修饰符public abstract

    4、类与类、类与接口、接口与接口的关系

    (1)类与类:继承关系,只能单继承,但是可以多层继承。
    (2)类与接口:实现关系,可以单实现,也可以多实现。还可以在继承一个类的同时实现多个接口。
    (3)接口与接口:继承关系,可以单继承也可以多继承。

    四、抽象类和接口的区别

    1、成员区别

    抽象类:
      成员变量:可以是变量可以是常量
      构造方法:有
      成员方法:可以是城乡方法,也可以是非抽象方法
    接口:
      成员变量:只能是常量
      没有构造方法
      成员方法:只能是抽象方法

    2、关系区别

      类与类:继承关系,只能单继承,可以多层继承。
      类与接口:实现关系,可以单实现,也可以多实现。
      接口与接口:继承关系,可以单继承,也可以多继承。

    3、设计理念的区别

      抽象类 被继承体现的是:"is a" 抽象类中定义的是继承体系的共性功能。
      接口 被实现体现的是:"like a" 接口中定义的是该体系的扩展功能。
      用一张图来表示类,抽象类,接口的关系


    类,抽象类,接口的关系

    相关文章

      网友评论

          本文标题:面向对象五——抽象类和接口

          本文链接:https://www.haomeiwen.com/subject/jcettftx.html