【夯实Java基础】(二)掌握面向对象编程的正确姿势

简介: 【夯实Java基础】(二)掌握面向对象编程的正确姿势

文章目录


类与对象的关系

初始化 构造器

this 关键字

static 的含义

清理:终结处理和垃圾回收

自适应垃圾回收技术

堆、栈、方法区、常量池、静态区

面向对象

实用类

IO流

多线程


类与对象的关系


类是对象的概括,对象是类的具体体现


根据一类对象进行概括,将对象的特征概括为属性,将对象的行为概括为方法,将这一类对象用一个类表示 — 类是对象的概括/抽取


通过new关键字来创建这个对象,然后可以给对象中的属性赋值,也可以调用方法


初始化 构造器


在Java中,通过提供构造器,类的设计者可以确保每个对象都会得到初始化。创建对象时,如果其类具有构造器,Java就会在用户有能力操作对象之前自动调用相应的构造器,从而保证了初始化的进行。


构造器的名称必须与类名完全相同。不接受任何参数的构造器叫做无参构造,和其他方法一样。构造器也能带有形式参数,以便指定如何创建对象。


构造器有助于减少错误,并使代码更易于阅读。从概念上讲,“初始化”与“创建”是彼此独立的,但在Java中,“初始化”和“创建”捆绑在一起,两者不能分离。


构造器是一个特殊类型的方法,因为它没有返回值。


this 关键字


this关键字只能在方法内部使用,表示对“调用方法的那个对象”的引用。


但要注意的是,如果在方法内部调用同一个类的另一个方法,就不必使用this,直接调用就可以。


可能为一个类写了多个构造器,有时可能想在一个构造器中调用另一个构造器,以避免重复代码。可以用this关键字做到这一点。


static 的含义


static(静态)方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来倒是可以的。


而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。它很像全局方法。Java中禁止使用全局方法,但你在类中置入static方法就可以访问其他static方法和static域。


清理:终结处理和垃圾回收


在Java中,有垃圾回收器负责回收无用对象占据的内存资源。但也有特殊情况:假定你的对象(并非使用new)获得了一块“特殊”的内存区域,由于垃圾回收器只知道释放那些由new分配的内存,所以它不知道该如何释放该对象的这块“特殊”内存。


为了应对这种情况,Java允许在类中定义一个名为finalize()的方法。


它的工作原理“假定”是这样的:一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。


所以要是你打算用finalize(),就能在垃圾回收时刻做一些重要的清理工作,我们需要记住以下三点。


  1. 对象可能不被垃圾回收
  2. 垃圾回收并不等于“析构”
  3. 垃圾回收只与内存有关


从第三点,我们不难看出使用垃圾回收器的唯一原因是为了回收程序不再使用的内存。所以对于垃圾回收有关的任何行为来说(尤其是finalize()方法),它们必须同内存及其回收有关。


自适应垃圾回收技术


垃圾回收器并非基于引用计数计数,它的依据思想是:对任何活的对象,一定能最终追溯到其存活在栈空间或静态存储区之中的引用,这个引用链条可能会穿过数个对象层次,由此,如果从栈和静态存储区开始,遍历所有的引用,就能找到所有活的对象,对于发现的每个引用,必须追踪他所引用的对象,然后是此对象包含的所有引用,直到所形成的网络全部被访问为止


在上述方式下,采用自适应垃圾回收技术,至于如何处理找到的存活对象。取决于不同JVM实现。有一种做法叫


停止-复制


找到的活对象先暂停程序的运行,然后将所有的存活对象从当前堆复制到另一个堆,没有被复制的全部都是垃圾,当对象被复制到新的堆时,他们是一个挨着一个,所以新堆保持进奏排列,直接分配了新空间


但是复制回收器回造成内存浪费为了避免这种情况,JVM就会进行检查:要是没有新垃圾产生,就会转到另一种工作模式


标记-清扫


标记清扫同样是从栈和静态存储区出发,遍历所有的引用,找到所有存活的对象,每当他找到一个存活的对象,就会给对象设一个标记,只有全部标记工作完成的时候,清理才会开始,没有标记的对象将被释放,不会发生复制动作,所以剩下的堆空间是不连续的,垃圾回收器是希望得到连续的空间,就必须重新整理剩下的对象。标记清扫工作也必须在程序暂停的情况下进行


内存分配单位:“块”


如果对象较大,他会占用单独的块,每个块有相应的代数,来记录他是否存活,如果块在某处被引用,其代数回增加,垃圾回收器会定时进行完整的清理动作,大型对象不会被赋值(其代数会增加),内含小型对象的块则被复制并整理。


自适应 分代的 停止-复制 标记-清扫 垃圾回收器


整体工作流程:如果所有对象都很稳定,垃圾回收效率低则切换到标记-清扫方式,要是堆空间出现很多碎片就会切换回停止-复制方式,这就是自适应技术。


gc垃圾回收器:无引用对象,死栈、运行结束的内存回收、线程的内存回收等


堆、栈、方法区、常量池、静态区



image.png


面向对象


OOA 分析、OOD 设计、OOP 编程


封装:

- 狭义封装:属性封装(属性私有化,提供getter、setter或者有参构造)
- 广义封装:私有化方法、私有化构造(单例模式、工厂模式)、私有化类
- 目的:保护成员 同时提供统一的接口


继承:

extends/implements
前提:满足相互联系(is a)/(has a)
目的:提高代码重用性,减少代码量
接口:满足条件(has a)
目的:约定大于实现,面对修改关闭,面对约定放开


多态:


类型的多态:子类对象引用分类类型

(List list = new ArrayList();)
public Pet getPet(int num){
      if(num==1)
      return new Dog();
      if(num==2)
      return new Cat();
}



方法的多态:

重载、重写


实用类


String、StringBuffer、StringBuilder、Math、Random、Date、包装类

String 长度不可变、final char[] ;
String s = '' "+基本类型的变量
String s = "dfe"+"abc"; // String s = ''dfeabc";
s+="123"; // StringBuffer.append("123");
StringBuffer 线程安全 ,速度相对慢;
StringBuilder 单线程 ,不安全,速度相对快。


IO流


IO流

IO流分类:IO异常
 字节流:
    InputStream:         
    OutputStream:
 字符流:
    Reader:
    Writer


常用IO流和应用场景
   InputStream:
            FileInputStream:
              File对象(路径)
              创建FileInputStream对象fis的时候(file)
              fis.read()
              Object obj = null;
              while((obj=fis.read())!=null){sout(obj);}
            BufferedInputStream
            与正常的InputStream没有本质的区别,只是提供了缓冲区
            DataInputStream
            二进制,主要用来读取图片,音频等,速度最慢
            ObjectInputStream     
            需要传输的对象的类型必须要实现Serizlizable接口
    OutputStream:
    Reader:
      InputStreamReader
      转换流,主要用于转换字节流和字符流
      BufferReader
      一次读一行
      FileReader
    Writer
      flush();
    close;


多线程


几种实现方式:


  • 继承Thread类 :重写run()方法
  • 实现Runnable接口:重写run()方法
  • 实现Callable接口:重写run()方法 // 有返回值,可以获取线程id


目录
相关文章
|
2月前
|
Java
Java基础语法与面向对象
重载(Overload)指同一类中方法名相同、参数列表不同,与返回值无关;重写(Override)指子类重新实现父类方法,方法名和参数列表必须相同,返回类型兼容。重载发生在同类,重写发生在继承关系中。
138 1
|
2月前
|
存储 Java 关系型数据库
Java 项目实战基于面向对象思想的汽车租赁系统开发实例 汽车租赁系统 Java 面向对象项目实战
本文介绍基于Java面向对象编程的汽车租赁系统技术方案与应用实例,涵盖系统功能需求分析、类设计、数据库设计及具体代码实现,帮助开发者掌握Java在实际项目中的应用。
112 0
|
3月前
|
安全 Java 编译器
Java面向对象
本文深入讲解了Java面向对象编程(OOP)的四大特性:封装、继承、多态与抽象,以及方法的设计与使用。通过示例展示了如何用类和对象组织代码,提升程序的可维护性与扩展性。
|
4月前
|
存储 Java 测试技术
Java基础 - 面向对象
面向对象编程是Java的核心,包含封装、继承、多态三大特性。封装隐藏实现细节,提升代码可维护性与安全性;继承实现类间IS-A关系,支持代码复用;多态通过继承、重写与向上转型,实现运行时方法动态绑定,提升系统扩展性与灵活性。
|
6月前
|
人工智能 Java 编译器
Java:面向对象
本文介绍了Java编程中的核心概念,包括包的命名规范与自动导入机制、构造方法的特点与使用、`this`和`super`关键字的作用、继承的基本规则、访问权限的设置、封装的意义、多态的实现原理以及`static`关键字的用法。通过详细解析每个知识点,并结合代码示例,帮助读者深入理解Java面向对象编程的核心思想与实践技巧。内容适合初学者及进阶开发者学习参考。
164 0
|
8月前
|
缓存 安全 Java
java面试-基础语法与面向对象
本文介绍了 Java 编程中的几个核心概念。首先,详细区分了方法重载与重写的定义、发生阶段及规则;其次,分析了 `==` 与 `equals` 的区别,强调了基本类型和引用类型的比较方式;接着,对比了 `String`、`StringBuilder` 和 `StringBuffer` 的特性,包括线程安全性和性能差异;最后,讲解了 Java 异常机制,包括自定义异常的实现以及常见非检查异常的类型。这些内容对理解 Java 面向对象编程和实际开发问题解决具有重要意义。
|
Java 开发者
Java 面向对象编程
总之,Java 的面向对象编程为开发者提供了一种有效的编程范式,帮助他们构建出高质量、可维护的软件系统。理解和掌握面向对象的概念和原则是成为优秀 Java 开发者的重要基础。
328 63
|
10月前
|
Java
Java 面向对象编程的三大法宝:封装、继承与多态
本文介绍了Java面向对象编程中的三大核心概念:封装、继承和多态。
533 15
|
10月前
|
Java 数据安全/隐私保护 开发者
【潜意识Java】深入理解 Java 面向对象编程(OOP)
本文介绍了Java中的面向对象编程(OOP)核心概念,包括封装、继承、多态和抽象。封装通过访问控制保护数据,提高安全性;继承支持代码复用,减少冗余;多态实现灵活的行为调用;抽象则隐藏细节,简化接口设计。掌握这些概念有助于编写高效、灵活且易于维护的代码。文章通过实例详细讲解了每个概念在Java中的应用,并总结了它们的优势。
472 3
|
11月前
|
Java
java中面向过程和面向对象区别?
java中面向过程和面向对象区别?
130 1
下一篇
oss云网关配置