<返回更多

Java 面向对象进阶内容

2022-03-03    马士兵马小小
加入收藏

目录

== 和 equals 方法

== 代表比较双方是否相同。

Object类中定义有: public boolean equals(Object obj) 方法,提供定义“ 对象内容相等 ”的逻辑

Object 的 equals 方法默认就是比较两个对象的 hashcode,是同一个对象的引用时返回 true 否则返回 false。可以根据自己的要求重写equals方法。

封装

需要让用户知道的才暴露出来,不需要让用户知道的全部隐藏起来,这就是封装。即封装就是把对象的属性和操作结合为一个独立的整体,并尽可能隐藏对象的内部实现细节。

编程中封装的具体优点:

多态

多态指的是 同一个方法调用 ,由于对 象不同 可能会有 不同的行为 。现实生活中,同一个方法,具体实现会完全不同。 比如:同样是调用人“吃饭”的方法,中国人用筷子吃饭,英国人用刀叉吃饭,印度人用手吃饭。

多态的要点:

抽象类和抽象方法

抽象方法

使用 abstract 修饰的方法, 没有方法体,只有声明 。定义的是一种“规范”,就是告诉 子类 必须要给抽象方法提供具体的 实现。

抽象类

包含抽象方法的类就是抽象类。通过 abstract 方法定义规范,然后要求子类必须定义具体实现。通过抽象类,我们就可以做到 严格限制子类的设计 ,使子类之间更加通用。

抽象类的使用要点

  1. 有抽象方法的类只能定义成抽象类
  2. 抽象类不能实例化,即不能用new来实例化抽象类。
  3. 抽象类可以包含属性、方法、构造方法。但是构造方法不能用来new实例, 只能用来被子类调用。
  4. 抽象类只能用来被继承。
  5. 抽象方法必须被子类实现

接口

为什么需要接口? 接口和抽象类的区别?

接口使用

[访问修饰符]  interface 接口名   [extends  父接口1,父接口2…]  {
常量定义;  
方法定义;
}

内部类

内部类的作用:

  1. 内部类提供了更好的封装。 只能让外部类直接访问 ,不允许同一个包中的其他类直接访问。
  2. 内部类可以 直接访问外部类的私有属性 ,内部类被当成其外部类的成员。 但 外部类不能访问内部类 的内部属性。
  3. 接口只是解决了多重继承的部分问题,而内部类使得多重继承的解决方案变得更加完整。

内部类的使用场合:

  1. 由于内部类提供了更好的封装特性,并且可以很方便的访问外部类的属性。所以,在 只为外部类提供服务 的情况下可以优先考虑使用内部类。
  2. 使用内部类间接实现多继承:每个内部类都能独立地继承一个类或者实现某些接口,所以无论外部类是否已经继承了某个类或者实现了某些接口,对于内部类没有任何影响。

String

String 类对象代表不可变的Unicode字符序列,因此我们可以将String对象称为“不可变对象”。 那什么叫做“不可变对象”呢? 指的是对象内部的成员变量的值无法再改变。

字符串常量拼接时的优化

在遇到 字符串常量 之间的拼接时,编译器会做出优化,即在 编译期间 就会完成字符串的拼接。

String s1 = "hello" + " world";
String s2 = "hello world";
System.out.println(s1 == s2);  // true

String s3 = "hello";
String s4 = " world";
//编译的时候不知道变量中存储的是什么,所以没办法在编译的时候优化
String s5 = s3 + s4;
System.out.println(s2 == s5);  //false

String Pool

字符串常量池( String Pool )保存着所有 字符串字面量 ,这些字面量在 编译时期 就确定。使用String的 intern() 方法在 运行过程 中将字符串添加到常量池中。

当一个字符串调用 intern() 方法时,若 String Pool 中已存在字符串和该字符串值相等(通过 equals() 方法判断),则返回String Pool 中字符串的引用;否则,就在S P 中添加一个新字符串并返回其引用。

String s1 = new String("aaa");
String s2 = new String("aaa");
sout(s1 == s2); // false

String s3 = s1.intern();
String s4 = s2.intern();
sout(s3 == s4);  // true

若以字面量形式创建字符串,会自动将字符串放入String Pool。

String s5 = "bbb";
String s6 = "bbb";
sout(s5 == s6);  // true
OutOfMemoryError

StringBuffer、StringBuilder

StringBuffer和StringBuilder 非常类似,均代表 可变的字符序列 (无final修饰的 char value[] )。 这两个类都是抽象类AbstractStringBuilder的子类,方法几乎一模一样。

区别:

  1. StringBuffer JDK1.0版本提供的类, 线程安全,做线程同步检查( synchronized ) , 效率较低。
  2. StringBuilder JDK1.5版本提供的类,线程不安全,不做线程同步检查,因此效率较高。 建议采用该类。

自动装箱/拆箱

自动装箱和拆箱就是将 基本数据类型 和 包装类 之间进行自动的互相转换。

包装类的缓存

整型、char类型所对应的包装类,在自动装箱时,对于-128~127之间的值会进行缓存处理,其目的是提高效率。

缓存原理:

异常机制

JAVA是采用面向对象的方式来处理异常的。处理过程:

  1. 抛出异常:在执行一个方法时,如果发生异常,则这个方法生成代表该异常的一个对象,停止当前执行路径,并把异常对象提交给JRE。
  2. 捕获异常:JRE得到该异常后,寻找相应的代码来处理该异常。JRE在方法的调用栈中查找,从生成异常的方法开始回溯,直到找到相应的异常处理代码为止。

Java 异常类层次结构:

Java 面向对象进阶内容

 

捕获异常

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>