ToB企服应用市场:ToB评测及商务社交产业平台

标题: java核心技能卷1 第五章:继续 [打印本页]

作者: 王國慶    时间: 2024-5-14 10:32
标题: java核心技能卷1 第五章:继续
学习重要的是出,而不是入,此前不停埋头向前学,忽视了复习的重要性。写一个博客作为自己的学习条记,也可作为以后查漏补缺的资料,温故而知新。

类,超类和子类

子类的构造函数

因为子类继续了父类的字段,实例化对象是需要初始化这些字段,但是子类可能不能直接访问这些字段(private)
办理方法
构造函数中的第一句使用super(),内部填写参数,对应父类的一个构造函数,这样会调用父类的构造函数来初始化父类的那部门字段。
假如不表现调用super(),那么会默认调用父类无参构造函数,这时间父类必须可以提供一个无参的构造函数
this和super

作为第一句出现:
this:在一个类的构造函数内的第一句调用,可以用来调用其他构造函数来初始化部门的字段
super:子类构造函数第一句调用,初始化父类字段
作为一个调用指示词
this:指示当前的对象,可以用来获得当前对象的字段和方法
super:获得父类的字段和方法
多态

指的是一个类型的对象可以引用(指向,指示)多种不同的类型(子类),这种特性称为多态
而在调用方法时可以根据实际指向的对象类型主动选择对应对象的方法,称为动态绑定
c++中的多态需要用virtual关键词,而java中默认的对象赋值行为就是多态的
假如父类对象中的方法是final的,则不允许Override,从而实现动态绑定
继续条理结构

继续同一个父类的不同子类彼此是独立的,并无直接关系
java不支持多继续

c++支持一个类同时继续多个父类,java不支持
继续原则

只有两个类满足 is-a ,才适合用继续。一个类是另一个类,只是更加特殊。
替换原则:is-a还指出:因为子类就是父类,以是任何需要父类的地方,都可以用子类替代,父类可以直接引用(指向)子类
父类可以通过引用子类,来调用对应的方法,实现不同的行为。
其中:
函数签名

函数签名(函数名和参数),返回值不是前面的一部门,只要函数名和参数一致,就判断是雷同方法
一个方法和另一个方法雷同,是说函数名和参数一致。
当子类中定义了一个和父类函数名和参数雷同的方法,就代表覆写了父类的方法,而返回值不一样千篇一律,只要现在的返回值类型和原本父类的类型兼容,也算是合法的方法重写。兼容指的是可以给原本类型赋值的类型,好比子类到父类的兼容
静态绑定和动态绑定

静态绑定:可以直接确定调用的是哪个对象的方法:private,final和static修饰的方法
private,子类中无法访问,以是调用一定是父类的
final:不允许重写的方法
static:属于一个类的方法,因此通过类和对象调用一定是对应类中的方法
动态绑定:调用一个方法是,调用实际指向的哪个对象的方法,假如子类中重写了,那么调用子类的方法逻辑,数据使用子类中定义的字段(相当于子类在调用),假如没有重写,那么调用父类的方法
假如不是private,final,static修饰的方法,都将采用动态绑定的方式,实际调用的方法是实际引用的哪个对象类型的方法
warning

重写父类的方法是,子类中的方法可见性不可以低于父类,只能宽松可见性,而不能设置更严格的可见性
阻止继续

使用final关键字修饰class(放在class前):代表不允许派生子类
使用final关键字修饰方法,代表子类不允许重写这个方法。
final修饰的类的所有方法主动称为final方法。但是不包括字段,因为字段加上final代表是const,不可变,和final用了同一个关键词,但是代表不同的含义

将类或方法声明为final的原因:不渴望子类来捣乱,这样一个类型的对象引用的一定是对应类型的对象,而不会发生多态,调用不一样行为的方法
逼迫类型转换

可以在继续条理结构内举行逼迫类型转换(对象引用变量的逼迫转换
父类转子类需要逼迫类型转换,假如其是父类引用到子类,那么将这个对象引用转为子类可以成功。因为子类赋值给父类,父类实际上指向的是子类对象,但是由于类型,它的能力被限制了,只能访问到父类定义的那部门,以是可以逼迫转换成功,恢复全部的能力。
但是假如父类自己指向的是父类,而直接转换为子类,就会报异常,是一个ClassCastException异常,因为父类实际上没有定义子类那部门成员,以是转换失败
instanceof:
受掩护访问

protected:一个包下可以访问,或是其他包的子类可以访问。
应当慎用掩护,或是干脆不用。
好比使用protected字段,其他类继续后使用,可以直接访问到类的具体细节,他们的实现就会依赖这个字段,假如你决定重写,那么其他人的代码可能会变得不可用
相比之下,protected修饰方法显得更有意义一些,只让那些很 熟悉父类实现的子类可以访问到这个方法,而其他的类不可以。(但是同一个包下的类照旧可以访问到,以是protected修饰符意义并不大,少用)
Object:所有类的父类

object是所有类的父类
java中,只有数值,字符和布尔类型不是对象,是属于根本类型,primitive type,而其他所有的都是对象,好比数组,无论是根本类型的数组照旧对象数组,都是Object类的子类
c++与之类似的概念是,所有指针都可以转换为void*指针,而没有一个所有类的基类

equals方法

Object的equals方法,比较两个对象的地址是否雷同,很简单,因此很多类都需要重写这个方法来实现比较的逻辑
其中:
其中,java语言规范要求实现的equals方法有以下性质
当属于同一个类的对象比较,这很自然。但当两个比较的对象不是同一个类时,会变得很贫困
Override注解

告诉编译器,这里的方法是在重写父类的方法,假如编译器发现其实是在定义新方法而不是重写, 就报错
hashcode方法

假如x.equals(y)为true,那么这两个对象调用hashcode方法返回的因该是雷同的int值。
hashcode:散列码,假如对象不同,那么hashcode值也根本不会雷同
hashcode返回一个int,可以是负数
默认Object类实现的hashcode基于地址算出,假如对象地址雷同,hashcode就雷同
String类重写了hashcode方法,因为equals根据字符串内容判断,假如字符串内容雷同那么雷同,这时间的hashcod也雷同,而不是根据地址判断
Object类提供了一个hash方法,可以接收多个参数,返回这些参数hashcode的组合,得到一个组合所有参数字段后的hashcode
根本数据类型的hashcode:通过其对应的包装类:Double,Integer等类的hashcode方法得到
toString方法

类方法中应该定义一个toString方法,打印对象的状态信息,帮助使用者明白对象状态
当调用println打印对象,就会调用这个类的toString方法,当对象通过+与一个字符串拼接时,java编译器也会主动调用toString方法获得对象的字符串描述
假如不重写, 默认会有一个toString方法,这里本机测试是:类名@hashcode
应该可以通过getClass.getName()方法获得对象的类名
许多类库中定义的类都有toString()方法,帮助我们获得和对象状态有关的信息
猛烈建议每个类定义一个toString,方便自己和使用者
ArrayList,泛型数组列表

一个可变大小的数组,其定义为泛型。
声明:
'''
  1. public class Hello {
  2.     public static void main(String[] args) {
  3.         ArrayList<Person> people=new ArrayList<>();
  4.         people.add(new Student());
  5.         people.add(new Employee());
  6.         for(var person:people)
  7.             System.out.println(person.getName());
  8.     }
  9. }
复制代码
'''
使用:
留意:
ArrayList类似于C++的vector,但是没有重载[],只能通过get(index)访问元素
其他题目
对象包装器与主动装箱

根本类型的数据需要转换为对象是,用到的是其对应的对象包装器类。
有Integer,Long,Double,Float,Short,Byte,Character,Boolean。对应不同的根本数据类型,其中,前面的六个继续了Number公共类。
这些包装器类的性质
主动装箱与拆箱

使用根本类型和使用包装类很一致,需要包装类的地方直接填入根本类型也可以,如ArrayList.add方法,可以直接填入ArrayList.add(7),这会主动改写为ArrayList.add(Integer.valueOf(7)),而把一个Integer对象赋值给一个int,会主动拆箱,变成int型。类似于调用了Integer.intValue().
大多数情况下,根本可以以为,根本类型和他们的包装类是一样的
一些例外:
一些留意点:
参数个数可变的方法

可以提供可变的参数数量给方法
使用:类型之后加上... ,表示可接受多个此类型的参数,需作为最后一个参数.
  1. public void hello(int i,String... strings){}
复制代码
这里传入多个String之后,会保存在strings[]数组中,用strings[]数组访问传入的数量可变的参数
#增补
当需要接受对象参数时,如Object[],假如传入根本数据类型,则会主动装箱为对应的包装类
只有实际的数据可以被包装,类型不会主动转换,如ArraryList不会主动变为ArraryList,而add加入参数时会把一个7主动包装为Integer.valueOf(7)
抽象类

将一些公共的字段和方法提取,作为父类,其中可以有一些方法不做实现,作为占位符,等待子类继续后实现。这种父类中不做具体实现的方法称为抽象方法,abstract方法,为了程序清晰,有抽象方法的类必须声明为抽象类,abstract class
密封类(mark,使用场景暂不清晰,项目场景下明白)

java15预览特性,java17最终确定
密封类可以控制哪些类可以继续它:保证自己控制继续体系,保持完整功能,而不被外部随意继续打乱
  1. public abstract sealed class JSONValue
  2.         permits JSONArrary,HSOONNumber
  3. {
  4. ...
  5. }
复制代码
这里sealed关键字表示密封类,permits表示允许继续的子类
允许继续的子类:必须是final,sealed或是non-sealed
non-sealed:第一个带连字符的java关键字
反射

暂时略,写java开发工具使用多,关注应用程序开发的使用较少
继续的设计技巧


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4