【夯实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


目录
相关文章
|
4月前
|
Java 开发者
在Java面向对象编程的广阔海洋中,多态犹如一股深邃的潜流,它推动着代码从单一走向多元,从僵化迈向灵活。
在Java面向对象编程的广阔海洋中,多态犹如一股深邃的潜流,它推动着代码从单一走向多元,从僵化迈向灵活。
42 7
|
4月前
|
Java 开发者
那些年,我们一同踏入Java编程的大门,多态,这个充满魔法的名字,曾无数次点亮我们探索面向对象编程的热情。
那些年,我们一同踏入Java编程的大门,多态,这个充满魔法的名字,曾无数次点亮我们探索面向对象编程的热情。
49 5
|
4月前
|
Java 程序员
Java中的继承和多态:理解面向对象编程的核心概念
【8月更文挑战第22天】在Java的世界中,继承和多态不仅仅是编程技巧,它们是构建可维护、可扩展软件架构的基石。通过本文,我们将深入探讨这两个概念,并揭示它们如何共同作用于面向对象编程(OOP)的实践之中。你将了解继承如何简化代码重用,以及多态如何为程序提供灵活性和扩展性。让我们启程,探索Java语言中这些强大特性的秘密。
|
2月前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
80 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
28天前
|
Java 关系型数据库 数据库
面向对象设计原则在Java中的实现与案例分析
【10月更文挑战第25天】本文通过Java语言的具体实现和案例分析,详细介绍了面向对象设计的五大核心原则:单一职责原则、开闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则帮助开发者构建更加灵活、可维护和可扩展的系统,不仅适用于Java,也适用于其他面向对象编程语言。
18 2
|
3月前
|
Java 编译器
封装,继承,多态【Java面向对象知识回顾①】
本文回顾了Java面向对象编程的三大特性:封装、继承和多态。封装通过将数据和方法结合在类中并隐藏实现细节来保护对象状态,继承允许新类扩展现有类的功能,而多态则允许对象在不同情况下表现出不同的行为,这些特性共同提高了代码的复用性、扩展性和灵活性。
封装,继承,多态【Java面向对象知识回顾①】
|
3月前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
3月前
|
Java
java中面向过程和面向对象区别?
java中面向过程和面向对象区别?
35 4
|
3月前
|
Java
接口和抽象类【Java面向对象知识回顾②】
本文讨论了Java中抽象类和接口的概念与区别。抽象类是不能被实例化的类,可以包含抽象和非抽象方法,常用作其他类的基类。接口是一种纯抽象类型,只包含抽象方法和常量,不能被实例化,且实现接口的类必须实现接口中定义的所有方法。文章还比较了抽象类和接口在实现方式、方法类型、成员变量、构造方法和访问修饰符等方面的不同,并探讨了它们的使用场景。
接口和抽象类【Java面向对象知识回顾②】
|
2月前
|
存储 Java 程序员
Java基础-面向对象
Java基础-面向对象
17 0