Java Learn(八)

抽象类、接口、内部类、Object类

抽象类

抽象方法的概念

  1. 抽象方法就是指不能具体实现的方法,我们叫抽象方法,使用abstract关键字修饰;
  2. 使用条件:必须要实现的方法,但是又不能具体实现的方法

语法格式

访问控制符 abstract 返回值类型 方法名称(形参列表);

如:

public abstract void cry(); —没有方法体

抽象类的概念

抽象类是指使用abstract关键字修饰的类,该类是不能实例化对象(不能new)的。

注意事项

  1. 抽象类中可以有成员变量、成员方法以及构造方法;
  2. 抽象类中可以有也可以没有抽象方法;
  3. 具有抽象方法的类必须有abstract关键字修饰,因此严格来说,抽象类是具有abstract关键字修饰并且有抽象方法的类。

实际意义

  1. 抽象类的实际意义不在于创建对象,而在于被继承,当一个雷继承抽象类后则必须要重写抽象类中的抽象方法(@Override),否则该类也得变成抽象类。
  2. 因此抽象类对子类具有强制性和规范性,叫做模板设计模式。

经验分享

  1. 在以后的开发中推荐使用多态的语法格式(父类引用指向子类对象),因为这种方式的父类的引用直接调用的所有方法一定是父类拥有的方法,若以后更换子类对象时,只需要将new后面的子类类型更换一下,其他代码不用修改就能立刻生效,因此提高了代码的可维护性和可扩展性。
  2. 该方式的缺点是:父类的引用不能直接调用子类独有的方法,若调用则需要强制类型转换。

接口

基本概念

  1. 接口就是一种比抽象了还抽象的类,主要体现在该类的所有方法都是抽象方法。
  2. 定义类的关键字是class,定义接口的关键字是interface。
  3. 继承类的关键字是extends,而实现接口的关键字是implements。
  4. 弥补java中不能实现多继承的功能。

注意事项

  1. 接口中的所有成员变量都必须由public static final 共同修饰,也就是常量。
  2. 接口中的所有成员方法都必须由public abstract 共同修饰,也就是抽象方法。

类和接口之间的关系

  1. 类和类之间采用继承的关系,使用extends关键字,支持单继承;
  2. 类和接口之间采用实现的关系,使用implements关键字,支持多实现;
  3. 接口和接口之间采用继承的关系,使用extends关键字,通常认为单继承;

抽象类和接口的主要区别

  1. 定义抽象类的关键字是class,而定义接口的关键字是intenface;
  2. 继承抽象类使用extends,而实现接口使用implements;
  3. 抽象类支持单继承,而接口支持多实现;
  4. 抽象类可以有构造方法,而接口中不可以有;
  5. 接口中只允许出现常量,而抽象类中可以有变量;
  6. 接口中只允许有抽象方法,而抽象类可以有非抽象方法;
  7. 接口中增加方法一定会影响实现类,而抽象类可以不影响;

内部类

基本概念

  1. 当一个类的定义放在另外一个类的类体重时,放在类体重的这个类叫做内部类,而内部类所在的这个类叫外部类。
  2. 类体中的内容:成员变量、成员方法、构造方法、static修饰的成员、构造块、静态语句块、内部类。

语法格式

class 类名{
  class 类名{
  内部类的类体;
  }
}

基本作用

当一个类存在的价值仅仅是为了某一个类单独服务时,就可以吧这个类定义为那个类的内部类,内部类的作用在于可以直接访问外部类的私有成员,而不再需要公有的get和set方法等。

基本分类

  1. 普通内部类:直接将一个类的定义放在另外一个类的内部;
  2. 静态内部类:使用static关键字修饰的内部类;
  3. 局部内部类:直接将类的定义放在一个方法体的内部(局部内部类的作用域仅限于当前方法体中);
  4. 匿名内部类:指没有名字的内部类,通常用于帮助接口/父类构造对象;

匿名内部类

语法格式

接口类型/父类类型 引用变量名 = new 接口/父类类型(){ 匿名内部类的类体 };

A ta = new A(){};

经验的分享

  1. 当接口类型的引用作为方法的形参时,实参的传递方式有两种:
    自定义类实现接口,然后创建实现类的对象作为实参传递;(需要多次使用该类是采用)
    直接使用匿名内部类的语法格式来得到接口类型的引用作为实参传递(只有一次需要调用时候采用);

java.lang.Object类

常用的包

java.lang —该包是java语言的核心包,该包中的所有内容由java虚拟机自动导入;

—如:String/System类等

java.util —该包是java语言的工具包,该包提供了大量的工具类和集合类等;

—如:Scanner/Random类等

java.io —该包是java语言的输入输出包,该包提供了大量的操作文件以及读写的类等;

—如:FileInputStream类等

java.net —该包是java语言的网络包,该包提供了大量的进行网络通行的类等;

—如:ServerSocket类等

等。。。。

Object类

基本概念

java.lang.Object类是所有类层次结构中所有类的根类;

常用的方法

Object()  — 以无参的形式构造对象;
boolean equals(Object obj)  —用于判断调用对象与方法名相等。

— 该方法默认比较两个对象的地址是否相等,与  ==  的效果相等。

— 若希望该方法去比较两个对象的内容,则需要进行方法的重写。

— 重写该方法胡,有必要重写 hashCode()方法。


int hashCode() — 用于返回调用对象的哈希码值(对象内存地址的编号)。

— 当equals()方法比较结果相等,则各自调用该方法( hashCode() )的结果必须相同。

— 当equals()方法比较结果不相等,则各自调用该方法的结果应该不相等。


String toString()  — 返回调用对象的字符串形式。

— 默认返回的内容:包名.类名@哈希码的16进制

— 当使用println()打印引用名称或者使用字符串凭借引用名称时,会自动调用该方法