Skip to main content

Java 对象

面向对象#

面向对象程序设计 (Object Oriented Programming,OOP:Object Oriented Design,OOD)

  • 对象 对象是一种具体的概念,是 的一种具体表示方式,对象又叫做实例,生成一个对象的过程叫做实例化
  • 类 类由 数据(属性【Property 或者 Attribute】或者成员变量【Member Variable】)和 对数据的操作(方法,Method)组成,类是一种抽象概念

属性需要定义在类中,又叫做 成员变量;而定义在方法中的变量叫做 局部变量

// 类的定义修饰符 class 类的名称{    // 类的内容(包含了属性和返回)}
// 方法的定义修饰符 返回类型 返回名称([参数1,参数2,参数3...]){    // 返回体}
  • 成员变量与局部变量的区别

    • 无论时成员变量还是局部变量,使用前都需要声明
    • 对于局部变量来说,使用前必须要初始化
    • 对于成员变量来说,使用前可以不用初始化。
      • 如果没有初始化成员变量,那么每个类型的成员变量都会使用对应数据类型的默认值
      • 如果初始化了成员变量,那么这些值作为对应的成员变量的初始值
  • 构造方法:构造方法用于完成对象属性的初始化工作

    • 构造方法的名字必须与类名完全一致(包括大小写)
    • 构造方法没有返回值,连void也不能出现
    • 默认构造方法
      • 如果在定义一个类时,没有为类声明构造方法,那么Java编译器会自动为类添加一个没有参数且方法体为空的构造方法
      • 如果在定义一个类时,为类声明了构造方法,那么Java编译器不会再为类添加构造方法
  • new 关键字,生成对象时依次完成以下三件事

    1. 为对象开辟内存空间
    2. 调用内的构造方法
    3. 将生成的对象的地址返回

三大基本特征#

  • 封装(Encapsulation)
  • 继承(Inheritance)
  • 多态(Polymorphism)

封装#

数据与方法放在一个类中,就构成了封装

#

修饰符 class 类的名字{    // 类的内容(包含了属性与方法)}

方法#

修饰符 返回类型 方法名称([参数1,参数2,参数3……]){    // 方法体}
  • main() 方法是整个 Java 程序的入口点,如果内的定义中没有 main 方法,那么程序无法执行

  • 方法定义不能嵌套,也就说不能再一个方法中定义另外一个方法,方法只能定义在类中

  • 方法的定义决定方法是否有返回值

  • 方法调用需要通过对象来完成,方法调用形式是:

    对象变量.方法名([参数值1,参数值2,参数值3...]);
  • 如何产生对象?通过类来生产对象(显示调用类的 构造方法通常 使用 new 关键字来生产对象,特殊通过反射的反射)

    类名 变量名 = new 类名();

关于方法的注意事项:

  1. 在方法定义中,方法的返回类型与return后面的变量或常量类型保持一致
  2. 在方法调用时,给方法传递的参数需要与方法定义时的参数保持一致(参数个数一致,参数类型一致)
  3. 方法定义时的返回类型与接收方法返回值的变量类型保持一致
  4. 关键字 void 表示方法不返回值
  5. 如果方法不返回值,那么声明方法时使用 void 关键字,在方法定义中可以有两种情况实现不返回值
    • 不适用 return 语句
    • 使用 return ,但 return 后面没有任何值或者变量,return后面只有一个分号,表示退出方法,返回到方法的调用端。
构造方法#

构造方法用于完成对象属性的初始化工作,其特点

  • 构造方法的名字 必须 与类名完全一致(包括大小写)
  • 构造方法没有返回值,也没有 void 关键字
  • 如果在定义一个类的时候,没有声明构造方法,那么Java编译器会自动给类添加一个没有常数且方法体为空的构造方法(默认构造方法)
  • 如果在定义一个类的时候,为类声明了构造方法,那么Java编译器不会再添加构造方法了

new 关键字在生成对象时完成的三件事情

  1. 为对象开辟内存空间
  2. 调用类的构造方法
  3. 将生成的对象地址返回
方法重载#

方法重载(Overload):表示两个或多个方法名字相同,但方法参数不同

  • 参数个数不同
  • 参数类型不同

方法的返回值对重载没有任何影响

构造方法重载:只需要看参数即可,如果需要在一个构造方法中调用另一个构造方法,那么可以使用 this() 的方式调用

  • this() 中的括号中的参数表示目标构造方法的参数
  • this() 必须要作为构造方法的第一条语句

继承#

Java 是单继承,意味着一个类只能从另一个类继承(被继承的类叫做父类[基类,base class],继承的类叫做子类),Java 中继承使用 extends 关键字

  • 当生成子类对象时,Java 默认首先调用父类不带参数的构造方法,然后执行该构造方法,生成父类的对象。接下来再去调用子类的构造方法,生成子类的对象
  • super 关键字:super 表示父类的对象的引用
  • 如果子类使用 super() 显示调用父类的某个构造方法,那么再执行的时候会寻找 super() 所对应的构造方法而不会再寻找父类的不带参数的构造方法
  • super 也必须要作为构造方法的第一条执行语句,前面不能有其他可执行语句

特点#

  • 父类有的,子类也有
  • 父类没有,子类可以增加
  • 父类有的,子类可以改变
注意
  • 构造方法不能被继承
  • 方法和属性可以被继承
  • 子类的构造方法隐式地调用父类地不带参数地构造方法
  • 当父类没有不带参数地构造方法时,子类需要使用super来显示调用父类地构造方法,super指的是对父类地引用
  • 在定义一个类的时候,如果没有显示指定该类的父类,那么该类就会继承与java.lang.Object类(JDK 提供的一个类,Object类是Java中所有类的直接或间接父类)

方法重写#

方法重写(Override):表示子类与父类地方法返回类型一样,方法名称一样,参数一样,这样子类与父类构成了重写关系

方法重写与方法重载的关系#
  • 重载发生在同一个类内部的两个或多个方法(平行关系)
  • 重写发生在父类和子类之间(继承关系)

当两个方法形成重写时,可以在子类的方法中通过 super.method() 形式调用父类的 method() 方法,其中 super.method() 不必放在第一行语句,因此此时父类对象已经构造完毕,先调用父类的 method() 方法还是先调用子类的方法是根据程序的逻辑来决定

多态#

父类型的引用可以指向子类的对象(子类就是父类);或者接口类型的引用可以指向实现该接口的类的实例。关于接口与实现接口的类之间的强制类型转换方式与父类和子类之间的强制类型转换方式完全一致。多态是一种运行期的行为

People are often confused by other, non-object-oriented features of Java, like method overloading, which are sometimes presented as object-oriented. Don't be fooled: If it isn't late binding, it isn't polymorphism

在 Java 中,人们经常被非面向对象的特征所困扰,比如说,方法重载,有时它们被当作面向对象的特征,不被愚弄迷惑:如果不是懒绑定(程序运行时)[方法重载是早绑定(程序编译时)],它就不是多态。因此 方法重载决定不了多态,方法重写可以决定多态

Thinking in Java, 3 Edition, Unit 7:Polymorphism [Summary]

当使用多态方式调用方法时,先检查父类中是否有调用的方法,没有则会编译失败

两种类型转换#

  • 向上类型转换(upcast):子类型转换为父类型,对于向上类型转换不需要显示的指定
  • 向下类型转换(downcast):父类型转换为子类型,对于向下类型转换必须显示指定(必须要使用强制类型转换)