JavaSE进阶学习

249 阅读17分钟

一、private关键字

  • 是一个权限修饰符

  • 可以修饰成员(成员变量和成员方法)

  • 被private修饰的成员只有在本类中才能访问

  • 权限修饰符

    • private
    • (默认、缺省的)
    • protect
    • public
  • 针对private修饰的成员变量,如果需要被其他类使用,提供相应的操作

  • 提供“get变量名()”方法,用于获取成员变量的值,方法用public修饰

  • 提供“set变量名()”方法,用于设置成员变量的值,方法用public修饰

  • public class Student2 {
    private int age;
        private String name;
    ​
        //    设置年龄
        public void setAge(int n) {
        //     判断传入的年龄的值是否符合
            if (n >= 0 && n <= 120) {
                age = n;
            } 
            else {
                System.out.println("您输入的年龄有误");
            }
        }
        //    获取年龄
        public int getAge() {
            return age;
        }
    }
    
  • 
    public class Student2Test {
        public static void main(String[] args) {
            Student2 st2 =new Student2();
            st2.setAge(18);
            System.out.println(st2.getAge());
    ​
        }
    }
    

二、封装

  • 封装体现的是一种思想

  • 面向对象三大特征之一(封装、继承、多态

  • 隐藏实现细节,仅对外暴露公共访问方式

  • 封装常见的体现:

    • 1.私有成员变量,提供setXxx和getXxx方法
    • 2.将代码抽取到方法中,这是对代码的一种封装
    • 3.将属性抽取到类当中,这是对数据的一种封装
  • 封装的好处:

    • 1.提高了代码的安全性
    • 2.提高了代码的复用性

三、Java内存图

  • 1、栈:

    • 方法运行时所进入的内存

  • 2、堆:

    • new出来的东西会在这块内存中开辟空间并产生地址

  • 3、方法区

    • 字节码文件中的方法

  • 4、本地方法栈

  • 5、寄存器

四、二维数组

  • 二维数组是一种容器,该容器用于存储一维数组;

  • 
    //        定义一个二维数组
    int[][] arr1 = {{11,2211,22,33},{1,2,3,4,5,6}};
    ​
    //        遍历数组
      for (int i=0;i<arr1.length;i++){
          for(int j=0;j<arr1[i].length;j++){
    //  i代表的是二维数组的索引,j代表的是一维数组的索引
                System.out.print(arr1[i][j]+" ");
        }
                System.out.println();//换行
    }
    ​
    
  • 索引i代表的是二维数组的索引,j代表的是一维数组的索引

  • 
    格式:数组类型[][]  数组名 = new 数组类型[m ][n]
    
  • m表示这个二维数组,可以存放多少个一维数组
  • n表示每一个一维数组,可以存放多少个元素

五、构造方法

  • 1.概述

    • 构建、创造对象的时候,所调用的方法
  • 2.格式

    • 1.方法名与类名相同,大小写也要一致
    • 2.没有返回值类型,连void都没有
    • 3.没有具体的返回值(不能由return带回结果数据)
  • 3.执行机制

    • 1.创建对象的时候调用,每创建一次对象,就会执行一次构造方法
    • 2.不能手动调用构造方法
  • 4.构造方法的作用

    • 用于给对象的属性(数据)进行初始化
  • 5.构造方法注意事项:

    • 1.构造方法的创建

      • 如果没有定义构造方法,系统将会给出一个默认的无参数构造方法
      • 如果定义了带参构造方法,还要使用无参数构造方法,就必须再写一个无参数构造方法
    • 2.构造方法的重载

      • 如果自定义了带参构造方法,还要使用无参数构造方法,就必须再写一个无参数构造方法
    • 3.推荐的使用方式

      • 无论是否使用,都手动书写无参数构造方法和带参数构造方法;

六、String

  • 字符串对象不能更改内容,不能修改;
  • 如果修改后查看地址值,发现地址值不一样,不是原来的对象,所以字符串对象内容不可以改变
  • Java 程序中所有的双引号字符串,都是 String 类的对象
  • 字符串不可变,它们的值在创建后不能被更改
  • 虽然 String 的值是不可变的,但是它们可以被共享

常量优化机制

  • Java中存在常量优化机制,字面量运算会在编译期完成,
  • 
    例如 String s1 = 'a'+'b'+'c';
        String s2 = "abc";
        sout(s1==s2); //true
        
    
  • 如果是常量的计算,会在编译期就得到结果,运行的时候已经是最终结果了

1.遍历字符串

  • 方法一:

    • 
      for(int i=0;i<s.length;i++){
          s.charAt(i);//就是索引处的字符值
      }
      
  • 方法二:

    • 
      //将字符串拆分为字符数组
      char[] chars = s.toCharArray();
      //遍历字符数组
      for(int i=0;i<chars.length;i++){
          char[] chs = chars[i])
      }
      

2.统计字符次数

  • 方法一:

    • 
      if(c >= 'A'&&c<='Z'){
          bigCount++;
          //大写字符
      }else if(c>='a' && c<='z'){
          smallCount++;
          //小写字符
      }else if(c>=0 && c<=9){
          numCount++;
          //数字
      }
      

3.字符串截取

  • 方法一:

    • String substring (int beginIndex);
    • 从传入的索引位置处,向后截取,一直截取到末尾,得到新的字符串并返回
    • 
      String s = "qwertyuiop"
      String ss=s.substring(2); 
      //ss = "ertyuiop"
      
  • 方法二:

    • String substring (int beginIndex, int endIndex;
    • 从beginIndex索引位置开始截取,截取到endIndex索引位置,得到新字符串并返回(包含头,不包含尾)
    • 
      String s = "qwertyuiop"
      String ss=s.substring(0,2);
      //ss = "qw"
      

4.字符串切割

  • 例如“张三,23”,从该字符串中切割出有效数据,封装为Student学生对象

  • 方法一:

    • String[] split(String regex) :根据传入的字符串作为规则进行切割,将切割后的内存存入字符串数组中,并将字符串数组返回
    • 这里可以将逗号作为分隔符,是其返回一个字符数组
    • 从得到的字符串数组中取出数组元素内容,通过Student类的有参构造方法封装为对象
    • 通过调用对象getXxx()方法,取出数据并打印
    • 
      stuInfo = "张三,23";
      //根据逗号切割字符串,得到(张三)(23)
      String[] sArr = stuInfo.split(",");
      //从得到的字符串数组中取出数组元素内容,通过Student类的有参构造方法封装为对象
      Student stu = new Student(sArr[0],sArr[1]);
      //通过调用对象getXxx()方法,取出数据并打印
      System.out.println(stu.getname()+"--"+stu.getAge());
      

5.StringBuilder

  • StringBuilder是一个可变的字符串类,我们可以把它看成是一个容器, 操作字符串的容器

  • 作用:提高字符串的操作效率

  • 常用方法:

    • append(任意类型),添加数据,返回对象本身
    • reverse(), 返回相反的字符序列
    • length(),返回长度(字符出现的个数)
    • toString(), 可以实现把StringBuilder转换为String
  • 链式编程

    • 如果一个方法返回的是对象类型,对象就可以继续向下调用方法
    • 例如:sb.append("红色").append("蓝色").append("绿色");
  • StringBuilder和String的区别

    • String :内容是不可变的
    • StringBuilder:内容是可变的
  • StringBuilder提高效率的原因

    • 做多次拼接只开辟一个内存空间
    • String做一次拼接开辟2个内存空间

StringBuilder和String的相互转换

  • StringBuilder转换为String

    ​ public String toString():通过 toString() 就可以实现把 StringBuilder 转换为 String

  • String转换为StringBuilder

    ​ public StringBuilder(String s):通过构造方法就可以实现把 String 转换为 StringBuilder

6.API应用程序编程接口

  • (Application Programming Interface)
  • Java API :指的就是JDK中提供的各种功能的Java类

7.字符串的比较

  • 比较基本数据类型:比较的是具体的值;比较a和b(a==b)

  • 比较引用数据类型:比较的是对象地址值;比较a和b(a.equals(b))

  • 字符串常量池:当使用双引号创建字符串对象的时候,系统会检查该字符串是否在字符串常量池中存在

    • 不存在:创建
    • 存在:不会重新创建,而是直接复用
    • JDK7之后字符串常量池从方法区移到了堆内存

8.字符串敏感词替换

  • 替换敏感词String replace(CharSequence target, CharSequence replacement)
  • 将当前字符串中的target (被替换的旧值 )内容,使用replacement (替换的新值) 进行替换返回新的字符串

七、补充知识点

  • 1.switch语句

    • 
      switch(){}
      ()中可以跟的数据类型:byte/short/ int/ char /枚举 /string
      

八、集合

  • 1、集合和数组的区别

    • 共同点:都是存储数据的容器
    • 不同点:数组的容量是固定的,集合的容量是可变的
  • 2.如果存储的数据,长度经常发生改变,推荐使用集合

  • 3.打印StringBuilder和集合的对象名都不会出现内存地址

    1.ArrayList

    • 构造方法:

      • ArrayList()构造一个初始容量为10的空列表
    • 成员方法:

      • 添加

        • boolean add(E e),将指定的元素添加到此列表的尾部
        • void add(int index,E element)将指定的元素插入此列表中的指定位置
    • 注意

      • 集合容器如果没有加入<>,就可以存储任意数据类型
      • 
        <E>泛型:对集合容器存储的数据类型进行限制
        ​
        E   需要使用引用数据类型
        
    • 
      ArrayList<String> list = new ArrayList<>();
      //字符串类型的集合创建
      
    • 
      ArrayList list = new ArrayList();
      //任意类型的集合创建
      
    • 
      //调用对象的add方法,向容器中添加数据
      list.add("abc");
      
    • 
      //调用对象的add方法,向容器中0号索引添加数据123
      list.add(0"123");
      
  • 集合常用方法

    • 添加

      • boolean add(E e),将指定的元素添加到此列表的尾部
      • void add(int index,E element)将指定的元素插入此列表中的指定位置
      • 返回值是布尔值
    • 删除:

      • public boolean remove(Object o) , 删除指定的元素,返回删除是否成功
      • public E remove (int index) ; 删除指定索引处的元素,返回被删除的元素
    • 修改

      • public E set(int index,E element) ; 修改指定索引处的元素,返回被修改的元素
    • 查询

      • public E get(int index ); 返回指定索引处的元素,返回查询的元素

      • public int size() 返回集合中的元素的个数 ,返回查询到的个数

九、方法

  • 1.方法的参数传递

    • 基本数据类型参数传递的是值;(例如:int /double等 基本类型,参数传递的是值)
    • 引用数据类型参数传递的是地址;(例如数组,参数传递的是地址)

十、Static关键字

static介绍

  • static关键字是静态的意思,是Java中的一个修饰符,可以修饰成员方法,成员变量
  • 被static修饰的成员变量,一般叫静态变量
  • 被static修饰的成员方法,一般叫静态方法

static特点

  • 1被static修饰的成员,会被该类所有对象所【共享】
  • 2.被static修饰的成员,会随着类的加载而加载,优先于对象存在
  • 3.多了一种调用方式,可以通过类名点 .的方式进行调用

static注意事项

  • 1.静态随着类的加载而加载,优先于对象存在
  • 2.非静态需要在创建对象之后,才可以使用
  • 3.静态方法中,只能访问静态成员(成员变量、成员方法)
  • 4.非静态方法中,可以使用静态成员,也可以使用非静态成员
  • 5.静态方法中,没有this关键字 【this需要在创建对象之后,才会存在,静态存在的时候,对象可能还没有被创建】

十一、面向对象

  • 1.面向对象并不是一个技术,而是一种编程的指导思想;以什么形式 组织代码;以什么思路 解决问题;
  • 万物皆对象

重点学什么

  • 1.学习如何设计对象
  • 2.学习已有的对象如何使用

类和对象

  • 1.Java 中需要根据类去创建对象

  • 2.类的组成:

    • 属性:成员变量,跟之前定义变量格式一样,只不过位置需要放 在方法的外面
    • 行为:成员方法;跟之前定义方法的格式一样,只不过需要去掉 static 关键字
  • 3.创建对象

    • 
      类名 对象名 = new 类名();
      
  • 4.变量的使用格式

    • 
      对象名.变量名;
      
  • 5.方法的使用格式

    • 
      对象名.方法名(实际参数);
      
  • 6.注意事项:

    • 直接打印对象名,打印的是该对象在堆内存中的地址
    • 类中可以定义成员属性和成员方法,但不是必须都要有,根据需求决定
    • 定义成员属性可以不用赋值,创建对象时会给该对象的属性默认值
    • 一个类的多个对象的属性数据,相互独立不影响

成员变量和局部变量

  • 1.位置:成员变量方法外; 局部变量方法中
  • 2.初始化:有默认值; 没有,使用之前要复制
  • 3.内存位置:栈内存; 堆内存
  • 4.生命周期:随着对象的创建而存在,随着对象的消失而消失;随着方法的调用到而存在,随着方法的运行结束而消失
  • 5.作用域:自己归属的大括号
  • 
    类中位置不同:
     *      成员变量在方法外,局部变量在方法内
    初始化值不同:
     *      成员变量有默认初始化值,局部变量没有
    内存位置不同:
     *      成员变量空间在堆内存,局部变量空间在栈内存
    生命周期不同:
     *      成员变量随着对象出现而出现,随着对象消失而消失
     *      局部变量随着方法调用并定义而存在,随着方法结束而结束
     作用域:
     *      都在自己归属的大括号中
    ​
    

this 关键字


作用:解决成员变量和局部变量同名的问题
      this:代表当前类对象的引用(地址)
  • Java就近原则:不是代码距离的远近,是内存空间的距离,比如执行时在栈内存

构造方法

  • 1.构造器

    • 初始化一个新建的对象
    • 构建,创建对象的时候,所调用的方法就是构造方法
  • 2.格式

    • 1.方法名与类名相同,大小写也要一致
    • 2.没有返回值类型,连void都没有
    • 3.没有具体的返回值(不能由return带回结果数据)
  • 3.构造方法作用

    • 本质作用:给对象中的属性(成员变量)进行初始化
  • 4.构造方法也可以重载(空参构造和带参构造)

  • 5.构造方法的作用是给对象属性赋值! 构造方法是创建对象这句话是错误的。

  • 6.new关键字才是创建对象的!它有两个功能,第一是创建对象,第二是调用构造方法!

  • 7.构造方法不能用来修改属性值!

封装

  • 1.将属性抽取到类中,这是对数据的一种封装
  • 2.将功能抽取到方法中,这是对方法的封装
  • 隐藏实现细节,仅对外暴露公共访问方式

JavaBean

  • 定义属性:用private修饰,提高安全性
  • 定义构造:提供空参、满参构造
  • 操作属性的方法:set和get方法
  • 可以使用IDEA一键生成

十二、static关键字

作用

  • static关键字:让对象可以共享属性数据,让方法调用更加简单

static修饰成员变量-静态属性

  • static修饰的类属性,被这个类所有对象所共享

    
    //关于静态的属性,推荐使用类名调用:格式:类名.静态属性名
    //因为使用对象访问,底层还是用类名访问
    
    1. 被static修饰的成员,会被该类的所有对象所[共享]
    2. 被static修饰的成员,会随着类的加载而加载,优先于对象而存在
    3. 多了一种调用方式,可以通过类名 点 . 进行调用
  • 定义:static关键字是静态的意思,是Java中的一个修饰符,可以修饰 成员方法,成员变量

    • 被static修饰的成员变量,一般叫做静态成员变量,
    • 被static修饰的成员方法,一般叫做静态方法

注意事项:

  • 静态随着类的加载而加载,优先于对象存在,
  • 非静态需要在创建对象之后,才可以进行使用
  • 1.静态方法中,只能访问静态成员(成员变量/成员方法)
  • 2.非静态方法中,可以使用静态成员,也可以使用非静态成员
  • 3.静态方法中,没有this关键字

this关键字

  • this:当前对象的引用
  • this需要在创建对象之后,才会存在,静态存在的时候,对象可能还没有被创建

成员方法的分类

  • 静态成员方法(有static修饰,属于类),建议用类名访问,也可以用对象访问[本质上还是类名调用]
  • 实例成员方法(无static修饰,属于对象),只能用对象触发访问
  • 静态成员不能访问非静态成员
  • 静态方法不能访问没有被static修饰的成员,只是不能直接访问,但是可以创建对象访问;
  • 为什么呢? 原因:静态成员是随着类加载的,此时对象可能没有创建;

使用场景

  • 如果方法不用访问实例成员并且需要需要方便调用,可以声明成静态方法
  • 方法中需要访问实例成员的,该方法必须声明成实例方法

十三.单例设计模式

设计步骤

  • 1.把类的构造器私有
  • 2.创建类的对象,并定义一个静态变量记住这个对象
  • 3.定义 一个方法,返回上面创建的对象

饿汉设计模式

懒汉设计模式


//静态属性记录了一个Music对象,类加载对象就创建,属于饿汉单例模式
    //private static QQ qq = new QQ();
    //改进:不用new
    private static QQ qq ;
    
    
    /*在需要的时候才创建
    * */
    public static  QQ getInstance(){
        if (qq == null){
            qq = new QQ();
        }
        return qq;
    }
​

//1.改进之前,QQ类之前使用饿汉单例设计模式,这时我想看看qq的信息,调用show()方法
        //  改进之后,这里只会进行展示信息功能, 不会自动下载
        QQ.show();
​
        //2.改进qq,如果只是想看看QQ的信息,就不希望吧对象创建出来,只有当我真正想用的时候再去创建
        //   调用getInstance 会创建QQ 对象, 会进行下载操作
         QQ.getInstance();

十四.继承

继承特点

  • 1.什么是继承、继承的好处

    • 继承用extends关键字,让一个类和另一个类建立起一种父子关系
    • 提高代码复用性,减少代码冗余
  • 2.继承的格式

    • 子类 extends 父类
  • 3.继承后子类的特点?

    • 子类继承父类,子类可以得到父类的属性和行为
  • 4.继承需要满足什么样的设计规范?

    • 子类们相同特征(共性属性,共性方法)放在父类中定义
    • 子类独有的的属性和行为应该定义在子类自己里面
  • 5.详解继承的特点

    • 子类可以继承父类非私有的属性和行为,但是子类不能继承父类的构造器
    • Java是单继承模式:一个类只能继承一个直接父类。
    • Java不支持多继承、但是支持多层继承。
    • Java中所有的类都是Object类的子类。
  • 6.子类不能继承父类的构造器,构造器需要new ,不能继承

  • 7.在子类方法中访问成员(成员变量、成员方法)满足:就近原则

    • 先子类局部范围找
    • 然后子类成员范围找
    • 然后父类成员范围找,如果父类范围还没有找到则报错
  • 8.如果子父类中,出现了重名的成员,会优先使用子类的,此时如果一定要在子类中使用父类的怎么办?

    • 可以通过super关键字,指定访问父类的成员
    • 格式:super.父类成员变量/父类成员方法
    • super写在哪个类里面,访问的就是哪个类的父类

方法重写

  • 在继承中,子类出现了个父类一模一样的方法声明,我们称子类的方法就是方法重写

  • 应用场景:

    • 当子类需要父类的功能,但父类的功能不能完全满足需求,子类可以重写父类中的方法
  • 子类不能重写父类的静态方法


方法重写涉及到的一些细节问题:
一、@Override重写注解
@Override是放在重写后的方法上,作为重写是否正确的校验注解。
加上该注解后如果重写错误,编译阶段会出现错误提示。
建议重写方法都加@Override注解,代码安全,优雅!
​

二、方法重写注意事项和要求
重写方法的名称、形参列表必须与被重写方法的名称和参数列表一致。
私有方法不能被重写。
子类重写父类方法时,访问权限必须大于或者等于父类 (暂时了解 :缺省 < protected < public)
子类不能重写父类的静态方法,如果重写会报错的。
​

方法重写建议加上哪个注解,有什么好处?
@Override注解可以校验重写是否正确,同时可读性好。
重写方法有哪些基本要求?
重写方法的名称和形参列表应该与被重写方法一致。
私有方法不能被重写。
子类重写父类方法时,访问权限必须大于或者等于父类被重写的方法的权限。
​

子类继承父类后构造器的特点

    1. 子类中所有的构造器默认都会先访问父类中无参的构造器,再访问自己
  • 为什么?

    • 子类初始化的时候,有可能会使用到父类中的数据。如果父类没有完成初始化,子类就无法使用父类的数据子类初始化之前,一定要调用父类构造器先完成父类数据空间的初始化
  • 怎么调用父类构造器的?

    • 子类构造器的第一行语句默认都是:super(),不写也存在

如果父类中没有无参数构造器,只有有参构造器,会出现什么现象呢?
会报错。因为子类默认是调用父类无参构造器的
​
如何解决?
子类构造器中可以通过书写 super(参数值),手动调用父类的有参数构造器
​
推荐解决方案:在给一个类定义构造的时候,把空参/有参数都给上
​
super调用父类有参数构造器的作用:
 初始化继承自父类的数据
​

this和super

  • this:代表本类对象的引用
  • super:代表父类存储空间的标识

this(...)和super(…)使用注意点:

  • 子类通过 this (...)去调用本类的其他构造器,本类其他构造器会通过 super 去手动调用父类的构造器,最终还是会调用父类构造器的
  • 注意:this(…) super(…) 都只能放在构造器的第一行,所以二者不能共存在同一个构造器中

Object特点

  • Java中的所有类,要么直接继承了Object,要么默认继承了Object,要么间接继承了Object;
  • Object是祖宗类

十五、final

final的作用

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

final修饰变量的注意

  • 1.final修饰成员变量的时候,需要给它指定值,或者在构造中给它值;赋值后不能发生改变
  • final修饰的变量是基本类型:那么变量存储的数据值不能发生改变
  • final修饰的变量是引用类型:那么变量存储的地址值不能发生改变,但是地址指向的对象内容是可以发生变化的

十六、常量

  • 在程序运行期间,其值不能发生改变的量

常量的作用

  • 可以用于做系统的配置信息,方便程序的维护,提高可读性

  • 
    使用final修饰的基本数据类型变量都是常量
    使用final修饰的String类型变量也是常量
    
  • 一般的引用数据类型,用final修饰,不能算常量,因为对象的属性值可以改变

  • 命名规范

    • 英文单词全部大写,多个单词下划线连接起来。
  • 宏替换

    • 当定义final变量时就为该变量指定了初始值,并且这个初始值在编译时就可以确定,那么这个变量就是“宏变量”。编译期会把程序中所有用到这个变量的位置直接替换成该变量的值。

十七、抽象类

  • 在Java中abstract是抽象的意思,如果一个类中的某个方法的具体实现不能确定,就可以申明成abstract修饰的抽象方法(不能写方法体了),这个类必须用abstract修饰,被称为抽象类
  • 抽象类格式: 
    修饰符 abstract class类名{}
    
  • 抽象方法格式:
    修饰符 abstract 返回值类型 方法名称(形参列表);
    

注意事项

  • 得到了抽象方法,失去了创建对象的能力

  • 抽象类为什么不能创建对象?

    • 类有的成员(成员变量/方法/构造器)抽象类都具备
    • 抽象类中不一定有抽象方法,有抽象类方法的类一定是抽象类
    • 一个类继承了抽象类必须重写抽象类的全部抽象方法,否则这个类也必须是抽象类
    • 不能用abstract修饰变量/代码块/构造器
  • final和abstract是互斥关系,被abstract修饰的类是希望别人继承的,但是final修饰的类是不让别人继承

十八、接口

接口概述与特点

  • 什么是接口

    • 接口也是一种规范
  • 接口格式

    • 
      public interface 接口名{
          //常量
          //抽象方法
      }
      
    • JDK8之前接口中只能是抽象方法和常量,没有其他成分
    • 接口不能实例化
    • 接口中的成员都是public修饰的,写不写都是,因为规范的目的是为了公开化
  • 接口中成员的特点:

    • 成员变量:

      • 只能是常量, 系统会默认加上三个关键字
      • public static final
    • 构造方法:

      • 没有
    • 成员方法

      • 只能是抽象方法
      • 系统会默认加上 public abstract

接口的基本使用:被实现

  • //jdk8以前,接口中只能有抽象方法和常量,这个常量也是希望直接提供给别人使用的
    //比如圆周率,而且圆周率不能改变,所以是常量
    //接口不能创建对象,所以属性名也得是静态的,这样别人才能通过接口名直接调用
     //public final static double PI  = 3.1415926759;
        double PI = 3.1415926759;
    
  • //抽象方法
    //public abstract对于接口的抽象方法可以省略
    //public abstract void squaring();
    void squaring();
    
  • 接口是用来被类实现(implements)的,实现接口的类称为实现类.实现类可以理解成所谓的子类

    • 格式:
      修饰符 class 实现类 implements 接口1,接口2,接口3{
          
      }
      //实现的关键字:implements
      
    • 接口可以被类单实现,也可以被类多实现

接口与接口的关系:多继承

  • 类和类的关系:单继承
  • 类和接口的关系:多实现
  • 接口和接口的关系:多继承,一个接口可以同时继承多个接口
  • 作用:整合多个接口,方便子类实现

十九、多态

多态概述

  • 同一个对象,在不同时刻表现出来的不同形态

多态的前提

  • 1.要有(继承/实现)关系
  • 2.要有方法重写
  • 3.要有父类引用,指向子类对象
Fu f = new Zi();

多态中成员访问特点

  • 构造方法:同继承一样,子类会通过super访问父类构造方法
  • 成员变量:编译看左边(父类) , 运行看左边(父类)
  • 成员方法:编译看左边(父类) , 运行看右边(子类)

多态的好处与弊端

  • 多态的好处:提高了程序的拓展性,

    • 具体体现:定义方法的时候,使用父类型作为参数,该方法就可以接收父类的任意子类对象
  • 多态的弊端:不能使用子类的特有功能

  • 弊端解决方案

    • A:直接创建子类对象
    • B:向下转型
    • 向下转型:从父类类型,转换回子类类型
      Zi z = (Zi)f;
      

多态中的转型

  • 向上转型

    • 从子到父
    • 父类引用指向子类对象
  • 向下转型

    • 从父到子
    • 父类引用转为子类对象

JDK8版本中接口成员的特点-默认方法

  • JDK8版本后,

    • 允许接口中定义非抽象方法,但是需要使用default修饰,这些方法都是默认方法
    • 作用:解决接口升级问题
  • 格式

    • 
      public default 返回值类型 方法名(参数列表){
          
      }
      
    • 
      public default void show(){
          
      }
      
  • 注意事项:

    • 默认方法不是抽象方法,不强制被重写
    • 但是可以被重写,重写时去掉default关键字
    • public 可以省略,default不能省略
    • 如果实现了多个接口,多个接口中存在相同的方法声明,子类就必须对该方法进行重写

JDK8版本中接口成员的特点-静态方法

  • JDK8版本后

    • 1.允许在接口中定义非抽象方法,但是需要使用关键字default修饰,这些方法就是默认方法

      • 作用:解决接口升级问题
    • 2.接口中允许定义static静态方法

  • 格式:

    
    public static 返回值类型 方法名(参数列表){
        
    }
    
    
    public static void show(){
        
    }
    
  • 注意事项:

    • 静态方法只能通过接口名调用,不能通过类名或者对象名调用
    • public可以省略,static不能省略

JDK9版本中接口成员的特点-私有方法

  • 限制在本类中使用,加上private关键字修饰
  • 作用:解决方法中出现的重复代码

接口的使用思路

  • 如果发现一个类中所有的方法都是抽象方法,那么就可以将该类,改进为一个接口
  • 涉及到了借口大面积更新方法,而不想去修改每一个实现类,就可以将更新的方法,定义为带有方法体的默认方法
  • 希望默认方法调用的更加简洁,可以考虑设计为static静态方法(需要去掉default关键字)
  • 默认方法中出现了重复的代码,可以考虑抽取一个私有方法(需要去掉default关键字)

end

\