面向对象(2)

本文用来整理面向对象中 封装、继承、多态、抽象类、接口、内部类、代码块的关系


一、面向对象的三大特性

1.封装

将类的某些信息隐藏在类的内部,不允许外部直接访问,只能通过类的对象使用该类提供的方法,实现对隐藏信息的操作和访问
“隐藏信息”:由private定义的方法变量
“该类提供的方法”:与变量相对应的get、set方法

使用“this”关键字
this代表当前调用方法的引用,this.成员变量 / this(成员方法)

2.继承

让类与类之间产生父子关系,可以使子类具有父类的属性和方法 class 子类 extends 父类{ }

  • 子类继承父类后,直接使用的只有父类的非私有成员,想要访问私有变量要调用get,set方法

2-1 继承的特点

①只能单继承,不能多继承(只能有一个父类)
②支持多层继承,多层继承的非私有化成员可以进行传递

2-2 变量的访问特点

“就近原则”:子类方法中→子类中→父类

2-3“super”关键字

super与this的区别:

  • this:代表对当前类的对象的引用【this( )访问本类的构造方法】
  • super:(存在继承关系),代表对父类对象的引用【super( )访问父类的构造方法】

2-4方法重写(Override)

子类和父类有一样的方法声明(方法名、列表参数、返回值类型都有关)
注意事项:

  • 私有方法不能被重写
  • 子类方法访问权限不能更低(子>父)
  • 静态方法不能被重写

权限修饰符:
在这里插入图片描述

重写和重载的区别:

  • 重写:必须在继承关系当中,子类与父类出现相同的方法声明(名字、参数都一样)
  • 重载:同一个类中,方法名相同,参数不同(与返回值无关)

3.多态

同一个对象不同时刻表现的不同形态
多态的三个必要条件:
有继承关系、有重写存在、有父类引用指向子类对象Fu f=new Zi()

二、抽象类→接口

1.抽象类

一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类

  • 定义抽象类
    public abstract class 类名{ } ;
  • 定义抽象方法
    public abstract void 类名( ) ;

特点:
①抽象类不能被实例化
②抽象类可以有构造方法,但无法通过其实例化
③有抽象方法的必是抽象类,但抽象类可以普通方法、抽象方法共存

final关键字:
final代表“最终”的意思,可以修饰成员变量、成员方法、类

  • 修饰类:代表该类不能被继承
  • 修饰方法:代表方法不能被重写
  • 修饰变量:表示该变量是常量,地址不可变(基本数据类型是常量,引用数据类型的引用不可变,不可以重新new一个对象)

2.接口

当一个类中所有方法都是抽象方法时,定义这个类为接口

  • 接口的定义: public interface 接口名{ }
  • 可以把接口看作父类来操作
  • 接口的实现类的命名:接口名+impl ( implements )
  • 接口的实现类
    ①要么将接口中的方法全部重写
    ②要么将其变成抽象类
    ③(jvm1.8/1.9后有更新)

2-1成员特点

①成员变量:默认是由“public static final”修饰,只能是常量
②抽象方法
(没有构造方法,和非抽象方法)

2-2接口的默认方法

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

2-3接口中的静态方法

public static 返回值类型 (参数列表) { }

  • 静态方法无法被重写
  • 静态方法只能通过接口名调用
  • public可省,static不可省

接口中的私有方法

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

  • 默认方法可以调用私有的静态和非静态方法
  • 静态方法只能调用私有的静态方法

3.接口和抽象类

1.共同点
①都用于实现多态性
②都不能被实例化,只能被子类实现或继承
③都可以包含抽象方法,需要由子类提供具体实现
2.区别

  • 语法上的区别:
    接口使用interface;抽象类使用abstract
  • 实现方法:
    一个类可以实现多个接口,但只能继承一个抽象类
  • 成员变量:
    接口只能定义常量(final),但抽象类可以有普通成员变量
  • 构造函数:
    接口没有构造函数,抽象类有
  • 方法实现:
    接口中的方法无方法体,都是抽象函数
    抽象类中,抽象函数、正常函数都有
  • 使用场景
    接口适用于定义一组相关操作,强调行为规范
    抽象类适用于定义通用的基础结构,强调子类的共性

Java中有多继承,接口可以多继承。但类中没有多继承

三、内部类

1.内部类

class 外部类名{
      修饰符 class 内部名{
      }
}

1-1创建对象

先创建外部类对象,再创建内部类对象

Outer.Inner i = new Outer( ) . new Inner

1-2内部类的访问特点

① 内部类可以直接访问外部类的成员变量(包括私有)
② 外部类要访问内部类成员,必须创建对象

1-3内部类的分类

内部类:在类中创建的类
成员内部类:在类中方法外
局部内部类:在方法中定义的类(要在方法内部创建对象并使用)
私有成员变量:private,外部无法访问
静态内部类:被static修饰,静态内部类只能访问外部类中的静态变量静态方法
匿名内部类:一种特殊的局部内部类 new 类名(){重写方法}

//匿名内部类
use方法名(new 方法名()){
      重写方法
}

2.lambda

一种特殊的匿名内部类
函数式思想:重点在做什么 (形式参数)-> {代码块}

2-1使用前提

  • 有一个接口
  • 这个接口只有一个抽象方法

注意:
①Lambda表达式中的形参要跟接口中抽象方法的形参保持一致
②方法体中注意有无返回值的问题

2-2省略模式

  • 参数类型可以省略
  • 如果参数有却只有一个,小括号可以省略
  • 如果代码块只有一条语句,“{ }”、“ ; ”、“return”可以省略
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值