Java基础知识(JavaSE)总结进阶03

一阶段: JavaSE进阶学习03

1.接口(重点记忆)

接口的定义和特点:

场景:一个类中,所有的方法,都是抽象方法

​ 1.接口用关键字interface来定义

public interface 接口名 {} 

​ 2.类实现接口用implements表示

public class 类名 implements 接口名 {}

​ 3.接口不能实例化

​ 我们可以创建接口的实现类对象使用

​ 4.接口的子类

​ 要么重写接口中的所有抽象方法

​ 要么子类也是抽象类

注意: 接口和类的实现关系,可以单实现,也可以多实现。(接口之间用,隔开)

类和接口的关系:(重点)

类和类的关系:

​ 继承关系,只能单继承,不能多继承,但是可以多层继承

类和接口的关系:

​ 实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口

接口和接口的关系:

​ 继承关系,可以单继承,也可以多继承

接口中成员特点(记忆)

成员特点

​ 1成员变量

​ 只能是常量
​ 默认修饰符:public static final

​ 2.构造方法

​ 没有,因为接口主要是扩展功能的,而没有具体存在

​ 3.成员方法

​ 只能是抽象方法

​ 默认修饰符:public abstract

​ 关于接口中的方法,JDK8和JDK9中有一些新特性。

JDK8版本之后允许在接口中定义非抽象方法,但是需要使用default修饰,这些方法就是默认方法

定义格式:

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

//范例
public static void show() {
}

接口中默认方法的**注意事项:**

​ 1.默认方法不是抽象方法,所以不强制被重写,但是可以被重写,重写的时候去掉default关键字

​ 2.public可以省略,default不能省略(这里注意,default不是权限修饰符)

​ 3.如果实现了多个接口,多个接口存在相同的方法声明,子类就必须对该方法进行重写

JDK8版本之后允许定义静态方法

定义格式:

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

//范例
public static void show() {
}

接口中静态方法的**注意事项:**

​ 1. 静态方法只能通过接口名调用,不能通过实现类名或者对象名调用

​ 2. public可以省略,static不能省略

接口中私有方法

  • 私有方法产生原因

    Java 9中新增了带方法体的私有方法,这其实在Java 8中就埋下了伏笔:Java 8允许在接口中定义带方法体的默认方法和静态方法。这样可能就会引发一个问题:当两个默认方法或者静态方法中包含一段相同的代码实现时,程序必然考虑将这段实现代码抽取成一个共性方法,而这个共性方法是不需要让别人使用的,因此用私有给隐藏起来,这就是Java 9增加私有方法的必然性

  • 定义格式

    • 格式1

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

    • 范例1

      private void show() {  
      }
      
    • 格式2

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

    • 范例

      private static void method() {  
      }
      

    注意事项

    ​ 1.默认方法可以调用私有的静态方法和非静态方法

    ​ 2.静态方法只能调用私有的静态方法

2.多态

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

多态的前提和体现:(重点记忆)

​ 1.有继承/实现关系
​ 2. 有方法重写
​ 3. 有父类引用指向子类对象

多态中的成员访问特点:

  1. 成员变量:编译看左边,运行看左边
  2. 成员方法:编译看左边,运行看右边

为什么成员变量和成员方法的访问不一样呢?

​ 因为成员方法有重写,而成员变量没有

多态的好处和弊端:

  1. 好处:提高了程序的扩展性

​ 具体体现:定义方法的时候,使用父类型作为参数,该方法就可以接收者父类的任意子类对象

2.弊端:不能使用子类的特有功能


多态的转型:

转型方向引用
向上转型从子到父父类引用指向子类对象
向下转型从父到子父类引用转为子类对象

多态中的转型存在的风险

概述:如果被转的引用类型变量,对应的实际类型和目标类型不是同一类型,那么在转换的时候就会出现 ClassCastException (类型转换异常)

如何解决? 使用instanceof关键字

使用格式: 变量名 instanceof 类型

通俗的理解:判断关键字左边的变量,是否是右边的类型,返回boolean类型结果

//示例
/**
 * @author 你的大龙猫啊
 */
abstract class Animal {
    public abstract void eat();
}

class Dog extends Animal {
    public void eat() {
        System.out.println("狗吃肉");
    }

    public void watchHome(){
        System.out.println("看家");
    }
}

class Cat extends Animal {
    public void eat() {
        System.out.println("猫吃鱼");
    }
}

//测试类
public class TestPolymorpic {
    public static void main(String[] args) {
        useAnimal(new Dog());
        useAnimal(new Cat());
    }

    public static void useAnimal(Animal a){  // Animal a = new Dog();
                                             // Animal a = new Cat();
        a.eat();
        //a.watchHome();

//        Dog dog = (Dog) a;
//        dog.watchHome();  // ClassCastException  类型转换异常
      
        // 判断a变量记录的类型, 是否是Dog
        if(a instanceof Dog){
            Dog dog = (Dog) a;
            dog.watchHome();
        }
    }
}

上一篇:Java基础知识(JavaSE)总结进阶02

下一篇:Java基础知识(JavaSE)总结进阶04

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值