您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > JAVA

Java 面向对象进阶内容

时间:2022-03-03 10:50:19  来源:  作者:马士兵马小小

目录

== 和 equals 方法

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

  • 比较基本类型,表示 值相同
  • 比较引用类型,表示 地址相等 即为同一对象

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

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

封装

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

编程中封装的具体优点:

  • 提高代码的安全性。
  • 提高代码的复用性。
  • “高内聚”:封装细节,便于修改内部代码,提高可维护性
  • “低耦合”:简化外部调用,便于调用者使用,便于扩展和协作。

多态

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

多态的要点:

  • 多态是方法的多态,不是属性的多态( 多态与属性无关 )。
  • 多态的存在要有3个必要条件: 继承,方法重写,父类引用指向子类对象。
  • 父类引用指向子类对象后,用该父类引用调用子类 重写 的方法,此时多态就出现了。

抽象类和抽象方法

抽象方法

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

抽象类

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

抽象类的使用要点

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

接口

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

  • 接口就是比“抽象类”还“抽象”的“抽象类”,可以更加规范的对子类进行约束。全面地专业地实现了: 规范和具体实现的分离。
  • 抽象类还提供某些具体实现, 接口不提供任何实现 ,接口中所有方法都是抽象方法。接口是 完全面向规范的 ,规定了一批类具有的公共方法规范。
  • 接口和实现类不是父子关系,是实现规则的关系。比如:定义一个接口Runnable,Car实现它就能在地上跑,TrAIn实现它也能在地上跑,飞机实现它也能在地上跑。就是说,如果它是交通工具,就一定能跑,但是一定要实现Runnable接口。

接口使用

[访问修饰符]  interface 接口名   [extends  父接口1,父接口2…]  {
常量定义;  
方法定义;
}
  • 访问修饰符:public 或默认
  • extends:可多继承
  • 常量:接口中的属性只能是常量,总是:public static final 修饰 or 省略
  • 方法:接口中的方法只能是:public abstract or 省略
  • JDK1.7之前,接口中只能包含静态常量、抽象方法, 不能有普通属性、构造方法、普通方法。
  • JDK1.8后,接口中包含普通的静态方法

内部类

内部类的作用:

  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版本提供的类,线程不安全,不做线程同步检查,因此效率较高。 建议采用该类。

自动装箱/拆箱

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

  • 自动装箱:基本类型的数据处于需要对象的环境中时, 会自动转为“对象”。
  • Integer i = 100; // 相当于 Integer i = Integer.valueOf(100);
  • 自动拆箱:每当需要一个值时,对象会自动转成基本数据类型,没必要再去显式调用 intValue()、doubleValue() 等转型方法
  • Integer i = 100; int j = i; // 自动拆箱 // 相当于 int j = i.intValue();

包装类的缓存

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

缓存原理:

  • 若数据在 -128~127 区间,则在类加载时就已经为该区间的每个数值创建了对象,并将这256个对象放在 cache 数组中
  • 每当自动装箱过程发生时 (或者手动调用 valueOf() 时),就会 先判断数据是否在该区间 ,如果在则直接获取数组中对应的包装类对象的引用, 如果不在该区间,则会通过new调用包装类的构造方法来创建对象。

异常机制

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

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

Java 异常类层次结构:

Java 面向对象进阶内容

 

  • Error 是程序无法处理的错误,表示运行应用程序中较严重问题。
  • Exception 是程序本身能够处理的异常。Exception类是所有异常类的父类,分为:
    • RuntimeException 运行时异常
    • 如被 0 除、数组下标越界、空指针(访问空对象成员)等
    • CheckedException 已检查异常
    • 所有不是RuntimeException的异常,统称为Checked Exception.

捕获异常

  • try-catch-finally
  •  
    • 如果异常类之间有继承关系,越是顶层的类,越放在下面;或者直接把多余的catch省略掉,即先捕获子类异常再捕获父类异常
    • 即使try和catch块中存在return语句,finally语句也会执行。是在执行完finally语句后再通过return退出。
    • finally语句块只有一种情况是不会执行的,那就是在执行finally之前遇到了 System.exit(0) 结束程序运行。
  • throws
  • 如果一个方法中可能产生某种异常,但是并 不能确定如何处理这种异常 ,则应根据异常规范在方法的首部声明该方法可能抛出的异常。
  • public static void readFile(String fileName) throws FileNotFoundException,IOException {...}
  • 方法重写中声明异常原则: 子类重写父类方法时,如果父类方法有声明异常,那么子类声明的异常范围不能超过父类声明的范围 。


Tags:Java   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Oracle正式发布Java 22
Oracle 正式发布 Java 22,这是备受欢迎的编程语言和开发平台推出的全新版本。Java 22 (Oracle JDK 22) 在性能、稳定性和安全性方面进行了数千种改进,包括对Java 语言、其API...【详细内容】
2024-03-21  Search: Java  点击:(12)  评论:(0)  加入收藏
Java 8 内存管理原理解析及内存故障排查实践
本文介绍Java8虚拟机的内存区域划分、内存垃圾回收工作原理解析、虚拟机内存分配配置,以及各垃圾收集器优缺点及场景应用、实践内存故障场景排查诊断,方便读者面临内存故障时...【详细内容】
2024-03-20  Search: Java  点击:(17)  评论:(0)  加入收藏
Java 在 2023 年仍然流行的 25 个原因
译者 | 刘汪洋审校 | 重楼学习 Java 的过程中,我意识到在 90 年代末 OOP 正值鼎盛时期,Java 作为能够真正实现这些概念的语言显得尤为突出(尽管我此前学过 C++,但相比 Java 影响...【详细内容】
2024-01-10  Search: Java  点击:(81)  评论:(0)  加入收藏
如何提高 Java 代码的可重用性
译者 | 刘汪洋审校 | 重楼对于软件开发者而言,编写可重用的代码是一项基本而重要的技能。每位工程师都应掌握如何尽可能地提高代码的复用性。当前,一些开发人员可能会认为微服...【详细内容】
2024-01-03  Search: Java  点击:(69)  评论:(0)  加入收藏
Java 21 神仙特性:虚拟线程使用指南
虚拟线程是由 Java 21 版本中实现的一种轻量级线程。它由 JVM 进行创建以及管理。虚拟线程和传统线程(我们称之为平台线程)之间的主要区别在于,我们可以轻松地在一个 Java 程序...【详细内容】
2023-12-28  Search: Java  点击:(111)  评论:(0)  加入收藏
三分钟理解 Java 虚拟线程
虚拟线程是 Java 语言中实现的一种轻量级线程,在 Java 项目中可以减少编写、维护和调试高吞吐量并发应用程序的工作量。有关虚拟线程的背景介绍,大家可以参阅 JEP 444。https:...【详细内容】
2023-12-27  Search: Java  点击:(164)  评论:(0)  加入收藏
Java Lambda 表达式各种用法,你都会了吗
Lambda表达式是 Java 8 中引入的最有影响力的功能之一。它们通过允许简洁而优雅地创建匿名函数来实现 Java 中的函数式编程。在这篇博文中,我们将探讨编写 lambda 表达式的各...【详细内容】
2023-12-25  Search: Java  点击:(101)  评论:(0)  加入收藏
别再乱用了,Java 21 将弃用、删除这些功能!
尽管Java 是我使用过的向后兼容程度最高的语言和环境之一,但始终存在功能弃用甚至删除的可能性。Java 21 将弃用两个功能,这就是我们今天要讨论的内容。1 为什么要弃用功能?弃...【详细内容】
2023-12-25  Search: Java  点击:(145)  评论:(0)  加入收藏
java 一次性处理百万数据,用了它,内存再也不会溢出了
背景最近在用一个同事写的后台管理导出数据进行数据分析,然后发现前端一直卡起,后来到服务器上查询日志,发现内存溢出了。分析出来原因:原来是表数据量过大超过百万,然后导致查出...【详细内容】
2023-12-15  Search: Java  点击:(96)  评论:(0)  加入收藏
Java 异步编程本应更简单才对
在过去的好多年里,多线程和异步一直作为 Java 技术里的高级部分,在技术序列中,一个语言分为入门部分、进阶部分和高级部分,所以,异步是作为其中的高级技术部分存在的。关于异步和...【详细内容】
2023-12-12  Search: Java  点击:(192)  评论:(0)  加入收藏
▌简易百科推荐
Java 8 内存管理原理解析及内存故障排查实践
本文介绍Java8虚拟机的内存区域划分、内存垃圾回收工作原理解析、虚拟机内存分配配置,以及各垃圾收集器优缺点及场景应用、实践内存故障场景排查诊断,方便读者面临内存故障时...【详细内容】
2024-03-20  vivo互联网技术    Tags:Java 8   点击:(17)  评论:(0)  加入收藏
如何编写高性能的Java代码
作者 | 波哥审校 | 重楼在当今软件开发领域,编写高性能的Java代码是至关重要的。Java作为一种流行的编程语言,拥有强大的生态系统和丰富的工具链,但是要写出性能优异的Java代码...【详细内容】
2024-03-20    51CTO  Tags:Java代码   点击:(25)  评论:(0)  加入收藏
在Java应用程序中释放峰值性能:配置文件引导优化(PGO)概述
译者 | 李睿审校 | 重楼在Java开发领域,优化应用程序的性能是开发人员的持续追求。配置文件引导优化(Profile-Guided Optimization,PGO)是一种功能强大的技术,能够显著地提高Ja...【详细内容】
2024-03-18    51CTO  Tags:Java   点击:(29)  评论:(0)  加入收藏
Java生产环境下性能监控与调优详解
堆是 JVM 内存中最大的一块内存空间,该内存被所有线程共享,几乎所有对象和数组都被分配到了堆内存中。堆被划分为新生代和老年代,新生代又被进一步划分为 Eden 和 Survivor 区,...【详细内容】
2024-02-04  大雷家吃饭    Tags:Java   点击:(60)  评论:(0)  加入收藏
在项目中如何避免和解决Java内存泄漏问题
在Java中,内存泄漏通常指的是程序中存在一些不再使用的对象或数据结构仍然保持对内存的引用,从而导致这些对象无法被垃圾回收器回收,最终导致内存占用不断增加,进而影响程序的性...【详细内容】
2024-02-01  编程技术汇  今日头条  Tags:Java   点击:(76)  评论:(0)  加入收藏
Java中的缓存技术及其使用场景
Java中的缓存技术是一种优化手段,用于提高应用程序的性能和响应速度。缓存技术通过将计算结果或者经常访问的数据存储在快速访问的存储介质中,以便下次需要时可以更快地获取。...【详细内容】
2024-01-30  编程技术汇    Tags:Java   点击:(75)  评论:(0)  加入收藏
JDK17 与 JDK11 特性差异浅谈
从 JDK11 到 JDK17 ,Java 的发展经历了一系列重要的里程碑。其中最重要的是 JDK17 的发布,这是一个长期支持(LTS)版本,它将获得长期的更新和支持,有助于保持程序的稳定性和可靠性...【详细内容】
2024-01-26  政采云技术  51CTO  Tags:JDK17   点击:(95)  评论:(0)  加入收藏
Java并发编程高阶技术
随着计算机硬件的发展,多核处理器的普及和内存容量的增加,利用多线程实现异步并发成为提升程序性能的重要途径。在Java中,多线程的使用能够更好地发挥硬件资源,提高程序的响应...【详细内容】
2024-01-19  大雷家吃饭    Tags:Java   点击:(111)  评论:(0)  加入收藏
这篇文章彻底让你了解Java与RPA
前段时间更新系统的时候,发现多了一个名为Power Automate的应用,打开了解后发现是一个自动化应用,根据其描述,可以自动执行所有日常任务,说的还是比较夸张,简单用了下,对于office、...【详细内容】
2024-01-17  Java技术指北  微信公众号  Tags:Java   点击:(102)  评论:(0)  加入收藏
Java 在 2023 年仍然流行的 25 个原因
译者 | 刘汪洋审校 | 重楼学习 Java 的过程中,我意识到在 90 年代末 OOP 正值鼎盛时期,Java 作为能够真正实现这些概念的语言显得尤为突出(尽管我此前学过 C++,但相比 Java 影响...【详细内容】
2024-01-10  刘汪洋  51CTO  Tags:Java   点击:(81)  评论:(0)  加入收藏
站内最新
站内热门
站内头条