匿名内部类+抽象类+接口+多态

匿名内部类+抽象类+接口+多态

一. 匿名内部类

概述
没有名字的内部类就是匿名内部类
匿名内部类使用前提
必须要有继承关系[继承与实现]
场景:
匿名内部类其实是对父类的子类对象的体现

匿名内部类的格式

格式:
new 父类类名(参数){
	重写父类中相关功能
}

或
new 接口名(){ 
    重写接口的抽象方法 
}
  • 匿名内部类的实质

    是一个子类或实现类的对象

  • 匿名内部类作为对象直接使用

    1、直接当做匿名对象调用资源使用【只能使用一次】 
        new 父类类名(参数){ 
        	重写父类中相关功能 
    	}.方法名(); 
    2、可以赋值给父类类型的变量 
        父类类型 对象名 = new 父类类名(参数){ 
        	重写父类中相关功能 
    	};
    	对象名.方法名();
    
    
  • 匿名内部类的使用

当发现某个方法需要接口或类的子类对象,我们就可以传递一个匿名内部类过去

二. 权限修饰符

public  	私有的       限定范围:没有范围
默认     	啥也不写     	限定范围:本类和本包中使用
protected	受保护的	 限定范围:本类和本包使用  不同包下可继承 不可直接使用
private   	私有的  	  限定范围:本类中使用

三. 抽象类

抽象方法
1. 概述:
java中只有方法声明没有方法实现并且被关键字 abstract 修饰的方法就是抽象方法
abstract :关键字 表示抽象的含义 被他修饰的资源自然而然的变为了抽象的
    
    抽象方法: 修饰符 abstract 返回值类型 方法名(参数列表);
2. 作用
提取相同功能不同结果的方法的声明, 用来需要定义一个这样的方法名字,但是不提供方法实现.以后谁想用这 个方法,那就自己提供这个方法实现
3. 注意
只能定义在抽象类中和接口中
抽象类
1. 概念
1.属于类的一种
2.java中被关键字abstract修饰  用来存储抽象方法的类
2.格式
修饰符 abstract class 类名{
	抽象类能出现内容和普通一样,只是多了抽象方法
}
3. 内容
1.属性【变量表示】
2.行为【方法】
3.构造方法
4. 普通行为
1.普通方法
2.静态方法
5.特殊行为
抽象方法【可有可无】 抽象类中一般都会定义抽象方法
6. 构造方法
和普通方法一样
7.特点
1、有构造方法但是不能创建对象, 抽象类不能实例化  抽象类就是用当做父类用的
2、构造方法给子类创建对象的时候调用使用
3、他的抽象方法必须要求子类重写全部的抽象方法
一个普通类如果是抽象类的子类,那么这个类在继承抽象类之后,就必须全部重写抽象方法.否则子类就会编译 报错.

8. 抽象类和抽象方法的关系

1、抽象类不一定有抽象方法, 但是一般定义抽象类都会在里面写抽象方法的 

2、有抽象方法的类一定是抽象类

9.抽象类的使用场景

抽象类一般用于父类,用来抽取一系列类的共性资源【属性和行为】,如果你觉的父类的有些方法,即使在父类 
中提供了方法实现,子类继承过去之后,子类必然重写.那么你就把这些方法定义为抽象方法,没必要提供实现了

四. 接口

1. 概述
接口本身是对规则定义的一种集合体 (接口中定义的都是规则) 规则:指定的一种固定标准【行为规范】 比如:婚姻法的一夫一妻制 电脑的usb接口 (电脑厂商制定USB结构规则, 设备要多长,多宽,怎么排线) 规则只是声明了行为,没有指定具体的行为内容
-- java中规则就是行为,【方法】的声明
-- 规则就变为方法的声明,规则其实就是java中的抽象方法 
    接口其实就可以理解为是定义抽象方法的集合体 
    作用:对外公开功能【规则】,让大家想要使用该功能必须来实现接口
    好处: 可以实现解耦合的作用
2.接口定义&特点
  • 格式
使用关键字 interface 来定义
 格式:
    修饰符 interface 接口名{
    	接口的内容(抽象方法)
} 
注意:
   1、接口的源文件也是.java文件, 也是参与编译的 
   2、编译后的文件也是字节码文件(*.class) [接口的本质其实还是一个类]. 
   3、运行子解码文件也需要加载到内存的方法区中 
  • 接口的本质还是类的证明,编译之后依然生成字节码文件

  • 1、属性 —也是使用变量体现 【默认被 public static final 修饰】

  • 2、行为:【也是使用方法体现的】

    jdk8版本之前接口:只有抽象方法

3.注意事项
1 没有构造方法,不能直接创建接口对象
2.功能必须需要类来实现之后被类的对象调用使用
接口实现
  1. 接口中的规则描述的只有声明没有具体的内容,想要被使用必须要把具体的内容描述具体,只能通过类类对接

口规则的描述进行补充,类就和接口产生关系,类通过 implements 关键字连接接口, 就可以对接口的规则

进行补充。

  1. 注意:类对接口进行规则的补充,类自然而然的有了接口描述的规则的功能,而且类必须实现接口中所有抽象方法.
1.如何实现接口
类通过 implement 关键字连接接口
2.格式
修饰符 class 类名 implement 接口名1,接口名2,。。。。{
 类的内容
}

//举例
public interface InterA { 
    public abstract void noSomking();
}
public interface InterB { 
    public abstract void makeMoney();
}

// 一个类可以实现多个接口
public class Man implements InterA, InterB { 
    @Override 
    public void noSomking() { 
        System.out.println("不吸烟..."); 
    }
    @Override 
    public void makeMoney() { 
        System.out.println("挣钱...");
    }
3.分类:

单实现:一个类实现一个接口

多实现:一个类实现多个接口

注意:

  1. 重写所有接口中的抽象方法
  2. 多个接口中的规则[抽象方法]只需重写一次
  3. 多实现接口不要出现方法名相同,返回值不同的方法,此时只能舍弃一个接口

4、类与类、类与接口,接口与接口之间的关系

  • 类和类

    只能是继承关系,java中的继承只支持单继承,多层继承

  • 接口与接口的关系

    单继承 多继承 多层继承

注意:接口继承其他接口后就拥有了父接口中的所有的抽象方法

父类和接口的区别
  1. 父类定义的都是先天就具备的属性和行为
  2. 接口定义的是一类可以通过后天学习额外补充的功能

5.接口中抽象方法定义的格式:

public sbstract 返回值类型 方法名(参数列表);
public static final 数据类型 属性名 = 初始值;

五. 多态

概述:
  • 多态:同一事物的不同表现形态
前提
必须要有继承关系
特点
父类的引用指向子类对象 接口类型引用指向实现类对象
格式
父类名 变量名[对象名] = new子类对象(实参);  
Person p = new Student();


接口名 变量名 = new实现类(实参);
// 接口的多态 Inter i = new Impl();
2.多态中成员变量的访问原则
  • 原则

    编译看左边,运行看左边 
    左边指的是父类 右边指的是子类 
        
    编译的时候先要到左边的父类中查看是否描述了该变量,描述了编译通过 否则编译报错 
        
    运行的时候对该变量进行取值到子类对象的父类引用空间中【super管理的空间】获取对应的值 
    【运行的时候取值取得还是子类对象从父类继承过来的成员变量实例化的值】
    
  • 多态中成员方法的访问原则

编译看左边,子类重写运行看右边, 子类不重写运行还看左 

多态对象调用方法的时候在编译时先到父类中查看是否有该方法的定义,有定义编译通过 没有编译报错 

在运行的时候先到子类中查看是否对该方法重写,有优先执行重写的方法体,没有执行父类定义的方法体
4.引用数据类型的向上向下转型
  • 向上转型
子类对象从子类的类型变为父类的类型体现,向上转型就是多态的体现
写出多态的格式,就自然而然发生了向上转型. 比如: Person p = new Student();
  • 向下转型
前提:必须已经发生向上转型

多态对象回归自己类型的过程  上面的p发生了向上转型, 把p恢复为它的真实类型(Student)的过 程就是向下转型.
  • 格式
子类类型 类型名 = (子类类型) 多态对象;   Student s = (Student)p;
  • instanceof 关键字
判断多态对象要转换的数据类型是不是指定的数据类型,返回值为布尔类型的数据 
	格式: 
	多态对象 instanceof 指定的数据类型 
	返回值就boolean类型值:true就是 false不是 
	作用:
    	解决向下转型类型转换异常
5.多态的弊端和好处
  • 弊端
	一旦产生多态, 就相当于缩小了真实类型对象的访问范围,因为只能访问到父类中有的内容,或者是父子类中都 出现的内容.子类独有内容就访问不到了. 
    如何解决这个弊端,就是向下转型.恢复真实对象访问范围.
  • 好处
增强了代码的扩展性,提升代码复用性 
    比如:
	咱们在定义方法的时候,如果参数类型定义为父类类型形参.那么实参的范围就比较大了. 实参可以是父类类 型的对象,也可以它子类类型对象. 
     如果一个返回值类型父类类型,那么return关键后就可以跟父类对象当做返回值,也可以跟子类对象当做返回 值.
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值