08_抽象_接口_final关键字_多态

第一章.抽象

1.抽象的介绍

java 复制代码
1.抽象类怎么形成:
   在父类中的方法无法做具体实现,需要延伸到子类中做具体实现
此时该方法定义成抽象方法,抽象方法所在的类一定是抽象类
2.抽象类定义:  abstract
   public abstract class 类名{}
3.抽象方法定义: abstract
   权限修饰符 abstract 返回值类型 方法名(形参);
4.使用:
   a.定义子类,继承抽象父类
   b.重写抽象方法,做具体实现
   c.创建子类对象(抽象类不能new对象),调用重写的方法
5.问题:
   继承是为了少写代码,后来我们继承完之后又设计了一个抽象父类
我们还得必须重写里面的抽象方法,好像我们并没有少写代码,那为啥还要用抽象呢?

   可以将抽象类的抽取看成是一类事物的"标准",只要是属于这一类的,必须拥有这些功能,怎么拥有呢?重写,至于具体怎么实现,重写之后自己去实现
6.抽象是代码的一种设计思想,可用可不用,我们后面自己开发的时候
基本上碰不上自己定义抽象类,抽象类都是底层的继承体系的顶级父类
java 复制代码
public abstract class Animal {
    public abstract void eat();
    public abstract void drink();
}
java 复制代码
public class Dog extends Animal{
    @Override
    public void eat() {
        System.out.println("狗吃屎");
    }

    @Override
    public void drink() {
        System.out.println("狗用舌头卷着喝水");
    }
}
java 复制代码
public class Cat extends Animal{
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }

    @Override
    public void drink() {
        System.out.println("舔水喝");
    }
}
java 复制代码
public class Test01 {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.eat();
        dog.drink();

        System.out.println("===================");
        Cat cat = new Cat();
        cat.eat();
        cat.drink();
    }
}

2.抽象的注意事项

java 复制代码
1.抽象类不能直接new对象,只能创建非抽象子类的对象
2.抽象类中,可以有构造方法,是供子类创建对象时,初始化父类中属性使用的
3.抽象类中可以有成员变量,构造,成员方法
4.抽象类中不一定非得有抽象方法,但是有抽象方法的类一定是抽象类
5.抽象类的子类,必须重写父类中的所有抽象方法,否则,编译无法通过.除非该子类也是抽象类
java 复制代码
public abstract class Employee {
    private String name;
    private int age;

    public Employee() {
    }

    public Employee(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public abstract void work();
}
java 复制代码
public class Teacher extends Employee{
    public Teacher() {
    }

    public Teacher(String name, int age) {
        super(name, age);
    }

    @Override
    public void work() {
        System.out.println("涛哥在讲课");
    }
}
java 复制代码
public class Test01 {
    public static void main(String[] args) {
        Teacher t1 = new Teacher("涛哥", 18);
        System.out.println(t1.getName()+"..."+t1.getAge());
        t1.work();//重写的
    }
}

第三章.接口

1.接口的介绍

2.接口的定义以及使用

java 复制代码
1.接口:一种标准,一种规范
2.定义接口:
   public interface 接口名{}
3.实现:定义实现类实现接口
   public class 实现类类名 implements 接口名{}
4.使用:
  a.创建实现类实现接口
  b.重写抽象方法
  c.创建实现类对象(接口不能new对象的),调用重写的方法
5.成员:
  a.jdk8之前:
    抽象方法:固定public abstract开头,不写也有
    成员变量:固定public static final开头,不写也有
  b.jdk8开始:
    默认方法:public default 返回值类型 方法名(形参){
                          方法体        
                          return 结果
                   }
    静态方法:和之前的带static的方法一样

   c.jdk9:
     私有方法,将public 改成private
java 复制代码
public interface USB {
    public abstract void open();
    public abstract void close();
}
java 复制代码
public class Mouse implements USB{
    @Override
    public void open() {
        System.out.println("鼠标打开了");
    }

    @Override
    public void close() {
        System.out.println("鼠标关闭了");
    }
}
java 复制代码
public class KeyBoard implements USB{
    @Override
    public void open() {
        System.out.println("键盘打开");
    }

    @Override
    public void close() {
        System.out.println("键盘关闭");
    }
}
java 复制代码
public class Test01 {
    public static void main(String[] args) {
        Mouse mouse = new Mouse();
        mouse.open();
        mouse.close();

        KeyBoard keyBoard = new KeyBoard();
        keyBoard.open();
        keyBoard.close();

    }
}

3.接口中的成员

3.1抽象方法

java 复制代码
1.格式:
  public abstract 返回值类型 方法名(形参);
2.特点:
  不写public abstract 默认也有
3.使用:
  通过实现类的重写去使用
java 复制代码
public interface USB {
    public abstract void open();
    String close(String name);
}
java 复制代码
public class Mouse implements USB{
    @Override
    public void open() {
        System.out.println("鼠标打开了");
    }

    @Override
    public String close(String name) {
        return name+"关闭了";
    }
}
java 复制代码
public class Test01 {
    public static void main(String[] args) {
        Mouse mouse = new Mouse();
        mouse.open();
        String result = mouse.close("鼠标");
        System.out.println(result);
    }
}

3.2默认方法

java 复制代码
1.格式:
  public default 返回值类型 方法名(形参){
      方法体
      return 结果
  }

2.使用:
  a.定义实现类实现接口
  b.在实现类中可重写可不重写
  c.创建实现类对象,调用默认方法    
java 复制代码
public interface USB {
    /**
     * 默认方法
     */
    public default void methodDef(){
        System.out.println("默认方法");
    }
}
java 复制代码
public class Mouse implements USB{
/*    @Override
    public void methodDef(){
        System.out.println("重写的默认方法");
    }*/
}
java 复制代码
public class Test01 {
    public static void main(String[] args) {
        Mouse mouse = new Mouse();
        mouse.methodDef();
    }
}

3.3静态方法

java 复制代码
1.格式:
  public static 返回值类型 方法名(形参){
      方法体
      return 结果
  }
2.使用:
  接口名直接调用
java 复制代码
public interface USB {
    /**
     * 静态方法
     */
    public static void methodSta(){
        System.out.println("静态方法");
    }
}
java 复制代码
public class Test01 {
    public static void main(String[] args) {
       USB.methodSta();
    }
}

默认方法和静态方法的使用有啥意义:

将来我们开发都是面向接口编程-->都是先定义一个接口,这个接口相当于是"功能的大集合",接口中定义的都是我们要实现的功能,然后在具体的实现类中实现,但是如果我们要临时加一个小功能,这个小功能不需要几行代码,此时我们就没必要在接口中定义抽象方法了,再去实现类中实现了,所以我们就可以在接口中直接定义默认方法或者静态方法,在接口中直接实现了就完事了!

3.4.成员变量

java 复制代码
1.格式:
  public static final 数据类型 变量名 = 值
2.特点:
  不写public static final 默认也有
3.注意:
  a.接口中的成员变量需要直接手动赋值
  b.被public static final修饰的变量,变量名需要全大写(习惯)
java 复制代码
public interface USB {
    public static final int NUM1 = 100;
    int NUM2 = 200;
}
java 复制代码
public class Test01 {
    public static void main(String[] args) {
        System.out.println(USB.NUM1);
        System.out.println(USB.NUM2);
    }
}

3.5.私有方法

java 复制代码
1.格式:
  将接口中的静态方法和普通方法的pubilc改成private
java 复制代码
public interface USB {
    private static void methodPri(){
        System.out.println("私有的静态方法");
    }

    public static void methodSta(){
        methodPri();
    }
}
java 复制代码
public class Test01 {
    public static void main(String[] args) {
        USB.methodSta();
    }
}

特殊语法: 接口名.super.方法名()

public class 实现类 implements 接口A,接口B{

​ public void method(){

​ 接口名.super.方法名()

​ }

}

public interface 接口A{

​ default void method(){

​ }

}

public interface 接口B{

​ default void method(){

​ }

}

4.接口的特点

java 复制代码
1.接口可以多继承
  pubilc interface A extends 接口B,接口C{}
2.接口可以多实现
  public class A implements 接口B,接口C{}
3.一个子类可以继承一个父类的同时实现一个或者多个接口
  public class Zi extends Fu implements 接口B,接口C{}

当一个类实现多个接口时,如果接口中的抽象方法有重名且参数一样的,只需要重写一次

java 复制代码
public interface InterfaceA {
    void methodAbs();
}
java 复制代码
public interface InterfaceB {
    void methodAbs();
}
java 复制代码
public class InterfaceImpl implements InterfaceA, InterfaceB {

    @Override
    public void methodAbs() {
       
    }
}

当一个类实现多个接口时,如果默认方法有重名的,参数一样,默认方法必须要重写一次

java 复制代码
public interface InterfaceA {
    public default void method(){
        System.out.println("接口A的默认方法");
    }
}
java 复制代码
public interface InterfaceB {
    public default void method(){
        System.out.println("接口B的默认方法");
    }
}
java 复制代码
public class InterfaceImpl implements InterfaceA, InterfaceB{
    @Override
    public void method() {
        //特殊语法-> 接口名.super.方法名
        InterfaceA.super.method();
    }
}

5.接口和抽象类的区别

java 复制代码
相同点:
  a.都位于继承的顶端,用于被其他类实现或者继承
  b.都不能new
  c.都包含抽象方法,其子类都必须重写这些抽象方法

不同点:
  a.抽象类:一般作为父类使用,可以有成员变量,构造,成员方法,抽象方法等
  b.接口:成员单一,一般抽取接口,抽取的都是方法,是功能的大集合
  c.类不能多继承,接口可以

第四章.final关键字

java 复制代码
1.概述:代表的是最终的,最后的
2.使用:
  修饰一个类
  修饰一个方法
  修饰一个成员变量
  修饰一个局部变量
  修饰一个对象
      
3.怎么学final:
  知道以上成员被final修饰之后的特点

1.修饰类

java 复制代码
1.格式:
  public final class 类名{}
2.特点:
  被final修饰的类,不能被继承
java 复制代码
public /*final*/ class Animal {
}
java 复制代码
public class Dog extends Animal{
}

2.修饰方法

java 复制代码
1.格式:
  修饰符 final 返回值类型 方法名(形参){
      方法体
      return 结果
  }

2.特点:
  a.被final修饰的方法不能被重写
3.注意:
  final和abstract不能连起来使用
java 复制代码
public /*final*/ class Animal {
    public /*final*/ void eat(){
        System.out.println("吃吃吃");
    }

    //public abstract final void drink();
}
java 复制代码
public class Dog extends Animal{
    public void eat(){
        System.out.println("狗啃骨头");
    }
}

3.修饰成员变量

java 复制代码
1.格式:
  final 数据类型 变量名 = 值
2.特点:
  被final修饰的变量,不能二次赋值
java 复制代码
public class Person {
    final String name = "张三";
    /*public Person(String name){
        this.name = name;
    }*/
}

4.修饰局部变量

java 复制代码
1.格式:
  final 数据类型 变量名 = 值
2.特点:
  被final修饰的变量,不能二次赋值
java 复制代码
public class Test01 {
    public static void main(String[] args) {
        final int i = 10;
        //i = 20;
        System.out.println(i);
    }
}

5.修饰对象

java 复制代码
1.格式:
  final 类名 对象名 = new 类名()
2.特点:
  被final修饰的对象地址值不能改变,但是对象的属性值可以改变
java 复制代码
public class Student {
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
java 复制代码
public class Test02 {
    public static void main(String[] args) {
        final Student s1 = new Student("张三", 10);
        System.out.println(s1);

        //s1 = new Student("李四", 20);
        s1.setName("王五");
        System.out.println(s1.getName()+"..."+s1.getAge());
    }
}

第五章.权限修饰符

java 复制代码
1.概述:在java中,有四种权限修饰符
  public:公共的访问权限,被public修饰的成员在哪里都能使用
  protected:受保护的
  默认:成员变量和方法前面的权限修饰符啥也不用,不写
  private:私有的,只能在本类中使用
public protected 默认 private
同类 yes yes yes yes
同包不同类 yes yes yes no
不同包子父类 yes yes no no
不同包非子父类 yes no no no
java 复制代码
如果不考虑特殊情况,我们应该这么使用权限修饰符
  1.成员变量 -> 建议用private,封装思想
  2.构造方法 -> 建议用public,便于new对象
  3.方法 -> 建议用public,便于调用

第六章.多态

java 复制代码
1.面向对象三大特征:  封装    继承    多态

1.多态的介绍

java 复制代码
1.前提:
  a.必须有子父类继承关系或者接口实现关系
  b.必须有方法的重写(没有方法的重写,多态没有任何意义)
  c.new对象需要:父类引用指向子类对象   ->  Fu fu = new Zi()  
      
2.怎么学多态:不要从字面上来学
  a.学多态的前提
  b.怎么写代码就是多态了
  c.用多态有啥好处      

2.多态的基本使用

java 复制代码
public abstract class Animal {
    public  abstract void eat();
}
java 复制代码
public class Dog extends Animal{
    @Override
    public void eat() {
        System.out.println("狗吃屎");
    }

    //子类特有功能
    public void lookHome(){
        System.out.println("狗看家");
    }
}
java 复制代码
public class Cat extends Animal{
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }

    //特有方法
    public void catchMouse(){
        System.out.println("猫抓老鼠");
    }
}
java 复制代码
public class Test01 {
    public static void main(String[] args) {
        //原始方式
        Dog dog = new Dog();
        dog.eat();
        dog.lookHome();
        System.out.println("===================");
        Cat cat = new Cat();
        cat.eat();
        cat.catchMouse();

        System.out.println("===================");

        //多态方式
        Animal animal = new Dog();//好比是double b = 10
        animal.eat();
        //animal.lookHome();//多态前提下,不能直接调用子类特有功能

        Animal animal1 = new Cat();
        animal1.eat();
    }
}
JAVA 复制代码
public interface USB {
    public abstract void open();
    public abstract void close();
}
JAVA 复制代码
public class Mouse implements  USB{
    @Override
    public void open() {
        System.out.println("鼠标打开");
    }

    @Override
    public void close() {
        System.out.println("鼠标关闭");
    }

    //特有功能
    public void click(){
        System.out.println("鼠标点击");
    }
}
java 复制代码
public class Keyboard implements  USB{
    @Override
    public void open() {
        System.out.println("键盘打开");
    }

    @Override
    public void close() {
        System.out.println("键盘关闭");
    }

    //特有方法
    public void input(){
        System.out.println("键盘输入");
    }
}
java 复制代码
public class Test02 {
    public static void main(String[] args) {
        USB usb = new Mouse();
        usb.open();
        usb.close();
        //usb.click();//多态前提下不能直接调用子类特有功能
        System.out.println("===================");
        USB usb1 = new Keyboard();
        usb1.open();
        usb1.close();
    }
}

3.多态的条件下成员的访问特点

3.1成员变量

java 复制代码
public class Fu {
    public int num = 10;
}
java 复制代码
public class Zi extends Fu{
    public int num = 100;
}
java 复制代码
public class Test01 {
    public static void main(String[] args) {
        Fu fu = new Zi();
        System.out.println(fu.num);
    }
}
java 复制代码
看等号左边是谁,先调用谁中的成员变量

3.2成员方法

java 复制代码
public class Fu {
    public int num = 10;
    public void show(){
        System.out.println("Fu...");
    }
}
java 复制代码
public class Zi extends Fu{
    public int num = 100;
    public void show(){
        System.out.println("Zi...");
    }
}
java 复制代码
public class Test01 {
    public static void main(String[] args) {
        Fu fu = new Zi();
        System.out.println(fu.num);
        fu.show();
    }
}
java 复制代码
看new的是谁,先调用谁中的方法,子类没有找父类
相关推荐
程序员zgh1 小时前
AUTOSAR CP 之 配置、开发流程、工具链 解析
c语言·开发语言·c++·系统架构·汽车
xyq20241 小时前
Bootstrap4 提示框
开发语言
Seven971 小时前
dubbo服务暴露源码
java
yqcoder1 小时前
JavaScript 的速度秘密:深入理解 JIT (即时编译)
开发语言·javascript·ecmascript
吴声子夜歌2 小时前
Java——动态代理
java·开发语言·代理模式
存在morning2 小时前
【GO语言开发实践】一 GO 语法快速上手
开发语言·python·golang
晨曦中的暮雨2 小时前
Python 并发模型理解:GIL、线程、async 到底是什么关系
开发语言·python
星恒随风2 小时前
四天学完前端基础三件套(JavaScript webAPI篇)
开发语言·前端·javascript
AI人工智能+电脑小能手2 小时前
【大白话说Java面试题 第59题】【JVM篇】第19题:并发标记过程中会出现什么问题?
java·开发语言·jvm