Java面向对象编程基础

对象与类

面向对象程序设计概述

  1. 面向对象程序设计(OOP)与传统结构化程序设计的区别:前者先考虑如何操作数据(算法),再考虑数据的组织(数据结构)。后者相反,先定义数据,再考虑对数据的操作。

    image

  2. 由类构造对象的过程称为创建类的实例(instance)。一个对象包括两个部分,数据称为实例字段(instance field),操作数据的过程称作方法(method)。实例字段值的集合就是类的当前状态(status),调用方法可以改变对象的状态。

  3. 可以通过继承来创建新的类,新类具有被扩展类的所有属性和方法。Java中的所有类都源于超类Object。

  4. 对象的三个特性
    image

  5. 类间关系
    image
    image

定义和使用类

  1. Java中已经创建好了许多类,如Math,Date等等,这些类可以直接使用。

  2. 使用对象前,首先要构造对象,构造对象通过构造器(constructor,或称构造函数)完成。
    image

  3. 通过在构造器前加上new操作符创建一个对象。new Date()

  4. 对象和对象变量的区别
    Date today=new Date()
    image

    Java中所有的对象都存储在堆中,若想获得对象的完整副本,应该使用clone方法。

  5. 在一个文件中,只能有一个public类,但可以有任意个非公共类。文件名应该与public类名相同。

  6. Java10中,当可以通过变量的初始值推导类型时可以使用var声明局部变量。
    var a=new Date()

  7. 隐式参数通过关键词this指示

  8. C++中在类内定义方法,该方法会自动成为内联(inline)方法。而在Java中方法必须定义在类内,但是不表示它们是内联方法,是否将某个方法设置为内联方法由Java虚拟机决定。

  9. 对数据的访问与修改可以通过get和set方法实现,这样的好处是保证了类的封装性。
    image

  10. 注意get方法不应该返回可变对象引用,例如:
    image

    该get方法返回了Date对象引用,可以通过该引用调用set方法修改Date对象的值。这违背了get方法的初衷。若要返回引用对象,应该先进行clone:
    image

  11. 类方法可以访问所属类的所有对象的数据。例如:
    image
    equals方法访问了other的私有字段。

  12. final修饰的实例字段必须在构造对象时初始化。

  13. static修饰的实例字段叫静态字段,一个类只有一个静态字段,所有对象共享该字段。

  14. static修饰的方法是静态方法,静态方法只能访问静态变量。

  15. Java中参数都是按值传递的,没有按引用传递。

  16. 方法名相同,参数不同的方法叫做方法重载,方法名和参数列表叫做方法的签名,返回类型不是方法签名的一部分。

  17. Java中,如果在构造器中没有显式的为字段设置值,那么就会自动的赋默认值。(局部变量若没有初始化,将会编译错误)

  18. 当没有为类编写任何构造器时,编译器会默认生成一个无参构造器。但是只要编写了任意一个构造器,系统就不会自动生成,需要自己编写无参构造器。

  19. 可以直接在类定义中为字段赋值:

    class A{
    	private String name="";
    }
    

    将在执行类的构造器之前完成赋值操作。

  20. 在构造器的开头可以通过this调用另一个构造器方法,在C++中这是不允许的。

  21. 初始化块,在类声明中,可以编写任意多个代码块,只要构造这个类的对象,这些代码块就会被执行。
    image

    首先运行初始化块,然后才会运行构造器的主体部分。

  22. 调用构造器的步骤
    image

  23. 静态代码块

    static{
    
    }
    

    在类第一次加载时(不需要创建实例对象),会执行静态代码块。

  24. Java中没有析构函数,因为Java中的内存回收由垃圾回收器自动清理。

  25. 一个类可以使用所属包中的所有类,以及其他包中的公共类。import 包名.*可以导入该包下的所有类。* 只能导入一个包,而不能用import java.*但如以java为前缀的所有包。

  26. import static java.lang.System.*可以导入静态方法和静态字段。导入后可以直接使用方法名调用方法,或者变量名访问变量。

  27. image

  28. 编译器在编译源文件时不检查目录结构。例如假设某个源文件开头有package com.mycompany,即使这个源文件不在 com/mycompany 下,也可以进行编译,如果他不依赖其他包就不会出现编译错误,但是无法运行,因为如果包与目录不匹配,虚拟机就找不到类。(因为编译后的class文件放在源文件目录下,然而运行时,通过java com.mycompany调用,但是这个目录下并没有编译后的class文件,因此编译器找不到类。)

  29. public修饰的部分,可以被任何类使用,private修饰的部分只能被定义他们的类使用,如果没有指定private和public,这个部分可以被同一个包中的所有方法访问。

  30. 类文件可以存储在JAR(Java归档)文件中。在一个JAR文件中,可以包含多个类文件和子目录,JAR文件使用ZIP格式压缩。

  31. Java中的类若想被别的程序共享,可以放在三个位置:

    1. 将该类文件放在一个目录中
    2. 将JAR文件放在一个目录中
    3. 当前目录

    想要使用类就要设置类路径,类路径包括:

    1. 基目录
    2. 当前目录
    3. JAR文件目录

    由于总是会搜索Java API的类,因此不用将这个类显示的包含在类路径中。

    image

    当虚拟机想要搜寻某个类文件,比如com.sjw.A类的类文件,他首先查看Java API类中是否有这个类,显然没有,因此他会转而在类路径中查找:

    1. 基地址/com/sjw/A.class
    2. 当前目录/com/sjw/A.class
    3. JAR/com/sjw/A.class

    而编译器查找文件要比虚拟机复杂的多,如果引用了一个类,而没有指定这个类的包,它会查看所有的import指令,确定其中是否包含这个类。
    image

  32. 创建JAR包
    image
    image

posted @ 2022-09-10 15:40  sjwsjwsjwsjw1234  阅读(49)  评论(0)    收藏  举报