【java基础】04-接口和多态

1.抽象类入门

抽象类概述

抽象方法: 将共性的行为(方法)抽取到父类之后,发现该方法的实现逻辑无法在父类中给出具体明确,该方法就可以定义为抽象方法。

抽象类: 如果一个类中存在抽象方法,那么该类就必须声明为抽象类。

抽象方法的定义
要点:

 抽象方法意义,格式
 		父类有些方法,知道有这个功能,但是,方法体不明确,可以声明为 abstract 方法,去掉方法体{} 

         //抽象类
        public abstract class Animal {
            //抽象方法             
            public abstract void eat();
            //具体方法
            public void drink() {                
            }
        }
 抽象类的意义,格式
 		抽象方法必须存活在抽象类中, 抽象类为抽象方法提供了存活的环境.
     
 例如: Animal类(动物类)有吃的方法,但是动物吃什么,是不明确的
​		一个方法,只有方法声明,没有方法体{},就是抽象方法,使用 abstract 修饰  //public abstract void eat();
​		抽象方法必须定义在抽象类中!!   //public abstract class Animal {}

2.抽象类的注意事项

抽象类的注意事项

3.模板设计模式

设计模式
模板设计模式
小结:

模板设计模式的优势 模板已经定义了通用结构,使用者只需要关注自己需要实现的功能即可

自己理解: 设计模式就是一套反复使用的,经过分类编目的,前人代码设计经验的总结。

好处: 模板类定义了通用的结构,方便重用,子类可以对细节进行扩展(方法重写)!
简单说,1.重用通用的结构 2.可以扩展

4.final关键字

final关键字
final修饰特点
final修饰变量类型特点
要点:

final: 关键字的意思?
 		最终的;决定性的;不可更改的 
    
可以修饰哪些?什么效果?final是一个关键字,可以修饰类,方法,变量.

  修饰类: 该类不能被继承(太监类)
  修饰方法:该方法不能被子类重写(子类可以直接继承使用)
  修饰变量:  修饰基本类型,是常量,值只能赋值一次
​			修饰引用类型,地址值不能改
​			final修饰成员变量,要么声明时赋值,要么在构造方法结束前赋值.

应用场景:
1.一个类的所有方法都不希望被重写,类使用 final 修饰 例如:String类
    		public final class String {....}
2. 一个类的某些方法不想被重写,方法使用 final 修饰
    		  public final void work() {
        			System.out.println("work hard....");
    		  }
3. 一个变量赋值一次后,不希望被修改,使用 final 修饰
    		 final int NUM = 10;
  
abstract  final 对比      
    
    final       				abstract
    //修饰类  不能继承    		 希望被子类继承
    //修饰方法  不能重写   		希望子类重写
    //修饰变量   常量      	  abstract 不能修饰变量
    
 static
    	含义: 静态
		可以修饰哪些东西?
            	成员方法,成员变量
    	有什么作用?
    			声明为静态方法,进行程序的初始化操作

5.代码块

局部代码块:
局部代码块
构造代码块:

位置: 类中方法外定义

特点: 每次构造方法执行的时候,都会执行该代码块中的代码,并且在构造方法执行前执行

作用: 将多个构造方法中相同的代码,抽取到构造代码块中,提高代码的复用性

构造代码块
构造代码块运行示例
静态代码块的应用场景: 系统的初始化代码,最先执行,且仅执行一次。

6.接口的介绍

接口介绍
要点:

日常生活中,两个实体之间进行连接的部分称为接口。
       接口就是规范,规范一旦确定,不能随意修改!!!       
    例如:   
       电脑和U盘连接的标准USB接口。
       接口可以确保不同实体之间的顺利连接。如不同的电脑厂家和U盘厂家只要按照相同的USB接口进行生产,那么所有的电脑和U盘就可以顺利的连接起来。 
           
- 接口就是规范,只要符合相同的规范,不同的实体就可以连到一起使用。
           
- Java中接口存在的两个意义
  1. 定义规范(有了规范,可以让不同的实体连接到一起使用,只要规范不变,换了实体也可以连接使用)
           	好处:降低实体之间的耦合性,提高扩展性和灵活性
  2. 功能的扩展(符合一个规范,就相当于拥有一种能力,实体可以符合多个规范,就拥有多种能力) 

7.接口的定义和特点

  • 接口使用关键字interface来定义
    public interface 接口名 {}
  • 接口不能实例化
  • 接口和类之间是实现关系,通过implements关键字表示
    public class 类名 implements 接口名 {}
  • 接口的子类(实现类)
    要么重写接口中的所有抽象方法
    要么是抽象类

接口中的抽象方法
定义实现类实现接口

8.接口的成员特点

接口中成员的特点
要点:

接口成员,有默认修饰符
成员变量、成员方法、构造方法默认修饰符?

成员变量:默认 public static final  (静态常量)        	 
   			[public static final] int NUM = 10;
    成员方法:默认 public abstract         	 
        	[public abstract] void coding(); //写代码的方法   
    构造方法: 接口没有构造方法!!!
interface Coding {
    //写代码
    public abstract void coding();
    //void coding();

   //int NUM = 10;
   public static final int NUM = 10;

   //public Coding() {} //接口没有构造方法

}

9.jdk8版本中的默认方法

接口默认方法的定义格式
接口默认方法的注意事项
举例:

interface InterA {
    abstract void show();
    //void defaultMethod();
   public default void defaultMethod()
     {
         System.out.println("我是接口的默认方法,解决接口升级问题,让原来已经存在的实现类不报错");
     }
}

class InterAImpl implements InterA {
    @Override
    public void show() {
        
    }
}

扩展:

子类中可以通过 super.父类方法()调用父类方法
接口实现类中如何访问接口的 default 方法?
接口名.super.默认方法名();

10.jdk8版本中的静态方法

接口中静态方法定义格式
接口中静态方法注意事项
接口的静态方法的意义:

​ 和实现类无关,直接使用接口现成的功能, 调用格式:接口名.静态方法()


扩展

default方法的区别:

​ 接口升级,需要添加新的抽象方法时,为了使已存在的实现类不报错,能继续使用, 新创建的实现类可以不重写,

也可以重写!


接口的使用思路

11.接口成员小结

接口成员小结


12.类和接口的关系

类和接口的关系
实现类如何访问接口中的默认方法?

接口名.super.默认方法();

13.多态的前提条件

  • 有继承/实现关系
  • 方法重写
  • 父类引用指向子类对象

14.多态的成员访问特点

多态成员访问特点
多态中成员变量与成员方法的访问区别
总结:


成员变量: 编译看左边,运行看左边 (成员变量,实际开发中,不关注!!)

成员方法(重点掌握): 编译看左边,运行看右边

一句话:编译全部看左边,只有成员方法运行看右边!

理解: 成员变量没有覆盖重写这一说,当父类看,就用父类的成员变量,成员方法有覆盖重写

15.多态的好处和弊端

多态好处和弊端

16.写一个多态程序的步骤

抽象类多态
1.写一个抽象类(父类)
2.写多个子类继承抽象类,重写方法
3.在测试类中,创建一个方法(useAnimal),方法的参数类型是抽象类类型
4.在测试类的main方法中,调用刚创建的方法,传入子类对象
多态代码示例1
多态代码示例2

17.多态中的转型

多态中的转型
要点:

​ 什么是向上转型?

​ 父类引用指向子类对象

​ 把猫当动物看

​ 多态的格式

​ 向下转型? (强制类型转换)

​ 恢复猫的本来面目

18.向下转型的隐患和解决

instanceof 运算符

public static void useFlyable(Flyable flyable) {//需要传入实现类对象,扩展性强
        flyable.fly();
        //多态不能访问子类特有功能
        //flyable.suckBlood();

        //向下转型
        判断这个对象是否是蝙蝠的类型
        if (flyable instanceof Bat) { //了解下  instanceof 判断对象是否属于某种类型 返回布尔值
            //向下转型(强转格式)
            Bat bat = (Bat)flyable;
            //吸血
            bat.suckBlood();
        }
        //蜻蜓不能强转成蝙蝠
        //ClassCastException: class com.bibabo.demo6.Dragonfly cannot be cast to class com.bibabo.demo6.Bat

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值