首页 > 其他分享 >继承

继承

时间:2022-09-26 17:45:51浏览次数:43  
标签:调用 继承 子类 hashCode 类型 方法 final

this&super

  • 关键字this的两个含义
    1. 指示隐式参数的引用,也就是当前对象实例
    2. 调用当前类的其他构造方法
  • 关键字super的两个含义
    1. 调用超类的方法
    2. 调用超类的构造方法

is-a规则

is-a规则用来判断是否将数据设计为继承关系。另一种表述是替换原则,他指出程序中出现超类对象的任何地方都可以用子类对象来替换

多态的在编译时可能出现问题

方法调用

例如x.f(args),x声明为类C的一个对象

  1. 查找x实际声明类型和其超类所有名为f的可访问方法
  2. 编译器根据args参数类型来匹配,如果没有找到直接对应的类型则会寻找类型转换后能匹配的方法,如果有多个方法匹配则会报错。这个过程称为重载解析

方法覆盖

  • 方法的名字和参数列表成为方法的签名,不包含返回类型
  • 覆盖方法时,需要保证返回类型与父类相同或者为其子类
  • 子类方法可见性不能低于父类方法的可见性

静态绑定

private、static、final、构造器方法在调用时,编译器可以准确知道应该调用哪个方法

动态绑定

  • 调用的方法依赖于隐式参数的实际类型,就是在运行时利用动态绑定来查询调用哪个方法
  • 程序运行并且采用动态绑定调用方法时,虚拟机要先查找对象实际类型是否有匹配的方法,再调用其超类是否有匹配的方法
  • 虚拟机为每个类预先计算了一个方法表,来节省搜索方法的时间花销

final

  • final定义的类不允许被继承,所有方法默认为final方法,属性不会默认为final
  • final定义的方法不允许被覆盖
  • final定义的属性构造对象之后不允许修改,引用类型属性不允许修改引用地址,但是引用变量的内容可以修改
  • 使用final可以进行内联优化

强制类型转换

  • 从上往下转换时先用 instanceof 判断再转换

abstract

  • 有一个或者多个abstract方法的类必须定义为abstract类
  • abstract类可以没有abstract方法
  • abstract类不能实例化,只能引用非抽象子类的实例

protected

  • protected只能修饰属性和方法
  • protected修饰的属性和方法可以由同包的其他类通过实例化对象来访问,还可以在子类定义的方法中访问

equals()方法

  • 需要通过对象状态来判断是否相等时,需要重写equals方法,满足自反性、传递性、对称性、一致性、null值返回false
    1. 用“==”判断引用地址是否相等
    2. 判断比较对象是否为空
    3. 如果equals语义可以在子类中改变,则用用getClass()方法判断所属类是否相同
    4. 如果所有子类都有相同的相等性语义,可以使用instanceof 检测
    5. 比较属性值时,基本类型用“==”判断值是否相等,引用类型用Objects.equals(a,b)方法来判断是否相等,数组类型可以使用Arrays.equals(a,b)

hashCode()方法

  • Object默认的hashCode()方法是根据对象存储地址得出的
  • String重写了hashCode()方法,是根据内容得出的
  • equals与hashCode方法要有一致性,a.equals(b)为true时,a.hashCode 必须等于 b.hashCode()
  • 重写hashCode()方法时,Objects.hashCode(arg)方法可以对单个实例属性计算值,Objects.hash(args...)可以同时对多个实例属性计算hashCode值,数组类型字段Arrays.hashCode()方法

toString()方法

  • 重写toString方法打印类名时,推荐使用getClass().getName()来获取类型,这样子类也可以使用
  • 一维数组推荐使用Arrays.toString(arg)
  • 多维数组推荐使用Arrays.deepToString(args)

可变长参数

  • 可以定义基本类型:int...
  • 允许将数组作为最后一个参数传递给有可变参数的方法

反射

Class类

  • 每一种类型都有一个唯一的Class对象
  • 获取Class的三种方式
    1. object.getClass()
    2. T.class
    3. Class.forName()

继承的设计技巧

  • 将公共操作和字段放在超类中
  • 不要使用protected字段(会破坏封装性,不安全,任意继承的子类和同包类都可以访问)
  • is-a关系是判断是否继承的基础
  • 除非所有继承的方法都有意义,否则不要使用继承
  • 再覆盖方法时,不要改变预期的行为
  • 尽量使用多态,不要使用类型信息判断来调用同类型方法
  • 不要滥用反射

标签:调用,继承,子类,hashCode,类型,方法,final
From: https://www.cnblogs.com/studyhaha/p/16731774.html

相关文章

  • Python菱形继承(网易面试题)
    菱形继承顾名思义,是一个菱形继承(好像是废话),直接上图  菱形继承就是多继承,例上图所有,A是父类,B和C是A的子类,B和C是D的父类。classParent(object):def__init__(......
  • 继承中构造方法的访问特点和super关键字的三种用法
    继承中构造方法的访问特点1.子类构造方法当中有一个默认隐含的“super()"调用,所以一定是先调用的父类构造,后执行的子类构造。2.子类构造可以通过super关键字来调用父类重......
  • SpringBoot Maven 继承
    父项目<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"......
  • c#-03关于类和继承的基本知识
    一、类继承通过类继承可以定义一个新类,新类纳入一个已经声明的类进行扩展已经存在的类叫做基类,而通过继承出的类叫做派生类,派生类的组成为:本身声明中的成员基类的成......
  • 简单的继承练习——疑问:私有属性在类的方法内调用时,有必要使用get,set方法嘛?
    要求:创建一个Circle类,设置半径属性和返回面积的方法,在无参构造器中初始化半径值为1。创建一个Cylinder类,继承Circle类,设置属性高和返回体积的方法,在无参构造器中初始化......
  • 01继承
    1.基础回顾+面试1.1类中成分成员变量(Field:描述类和对象的属性信息的)成员方法(Methpd:描述类或者对象的行为信息的):包括实例方法,静态方法,抽象方法,gettersetter方法......
  • 继承和派生
    不同的类中有大量重复的代码和实现,为了优化引入继承和派生。继承和派生,本质是相同的,只是从不同的角度来描述。父亲“派生”出儿子,儿子“继承”自父亲。 除了“构造函......
  • JavaScript 类继承
    使用extends关键字。super() 方法用于调用父类的构造函数。已有的类称为基类(父类),新建的类称为派生类(子类)。通过在构造方法中调用 super() 方法,我们调用了父类的构......
  • 【Linux】多线程中fork与互斥锁---子进程会复制继承父进程里锁的状态
    摘自:https://blog.csdn.net/xiaoxiaoguailou/article/details/121617142问题提出:我们有这样一个问题:在一个多线程程序中创建子进程并且让子线程和子进程去获取一把全局变......
  • C++ 模板类继承
    template<classT>classA{protected:voidTest(){printf("%f",0.1f);}};template<classT>classB:publicA<T>{public:voidTest2()......