本章学习目标

  • 了解面向过程编程思想与面向对象编程思想的区别

  • 重点掌握类与对象的概念

  • 重点掌握类的属性(成员变量)和方法

  • 了解匿名对象


面向过程编程思想与面向对象编程思想区别

所谓面向过程编程与面向对象编程都是一种编程范式,通俗地说就是编程过程中遇到问题提供统一的解决方案。

  • 面向过程在解决问题的时候,会分析出解决问题的步骤,然后用函数一步步的将这些步骤实现,依次调用函数。

  • 面向对象在解决问题的时候,会将问题拆散成一个个对象,建立对象的目的不是为了完成某个步骤,而是为了描述某个事物在整个解决问题的步骤中的行为。

总结:面向过程编程与面向对象编程的区别来自于思考问题方式的不同

对象和类

什么是对象

对象就是看得见摸得着的东西,万物皆对象

如何认识对象

任何一个对象都有其特征和功能,我们也是通过对象的特征和功能认识对象

什么是类

我们把具有某些相同特征和功能的对象归纳为类,类是对对象的抽象和描述,不是具体指某个对象或东西,类是看不见摸不着的,比如人类、狗、男人等。

类的作用

类的作用是作为模板或图纸用于建造同一类对象,比如想要修建一栋大厦,不可能不画设计图,一上来就开干。

如何定义类
public class 类名 {
      属性(特征);
      方法(功能);
}
  • public:是 Java 的一个访问修饰符,表明定义的类是公有类。访问修饰符的作用是用于控制类、属性和方法的访问权限,关于访问修饰符的更详细内容,后面我会单独讲解。这里需要记住的是,一个 Java 源文件只能包含一个公有类且文件名必须和公有类的类名相同。

  • class:用于定义类的 Java 关键字

  • 类名:同变量名或方法名一样,必须是一个有效的标识符;类名按照 Java 编码规范,要求首字母大写

类的属性和方法

类的属性

类的属性其实就是类描述对象的特征,在 Java 语言中也叫成员变量,之所以叫成员变量是因为它是类的一个成员,而且它本身也是一个变量。

需要注意的是,类的成员变量与方法的局部变量是有区别的,方法的局部变量是在方法中声明的变量,而类的成员变量是类中方法外声明的变量,所以它们二者的作用范围和生命周期是不同的,使用是要注意差异。

public  class Car {
       public String type ="sports car";//车型   
       public int wheel = 16; //车轮  
       public int window = 6 ; //
       public int door = 2; //
       public int engine = 1; //引擎    
} 

以上代码声明了 5 个属性或成员变量,而且分别进行了初始化;当然也可以不初始化,Java 语言会提供默认值。

类的方法
public class Car {
      public void start ( ) {
                    System.out.println("发动汽车");
       }
       public void refuel ( int volume ) {
          System.out.println(" 汽车加油:"+ volume + "升");
      }
} 

声明类的方法似于和我们之前声明的方法差不多,唯一不同的地方是少了一个 static 关键字。static 关键字到底是干嘛用的呢,这个还是要在等到后面详细讲解。

构造器

构造器概念

构造器(或构造方法)是类中用于实例化 Java 对象的一个特殊方法,该方法要求方法名必须和类名相同,且方法不具有任何返回类型

public 类名 {
     ... 
}
默认构造器

默认构造器就是没有参数的构造器,有显式和隐式之分

  • 显示默认构造器:指在类中声明的无参数构造器

  • 隐式默认构造器:指由 Java 言语自动提供的无参数构造器

public class Car   {
   // 显式默认构造器
   public Car () {
       …
   }
}

任何一个类必须要有一个构造器,否则就无法实例化对象,所以即使我们没有为类声明显示默认构造器,Java 言语也会提供隐式默认构造器。

当我们为类声明了显示默认构造器,实例化对象时就会使用显示默认构造器,而不会使用隐式默认构造器。

构造器重载

在 Java 语言中,普通方法可以重载,构造器虽然是特殊方法,但也支持重载。

我们先回顾一下,方法重载必须满足 4 个条件:

  • 方法名必须相同

  • 方法的返回值类型可以不同

  • 方法的参数列表必须不同(参数类型、个数或顺序必须有一个不同)

  • 方法的访问修饰符可以不同

public class Car {
       public int door;
  …
  //显式构造器
  public car ( ) {
    System.out.println("这是显式默认构造器");
  }
​
  //构造器重载
  public Car (int doorNum) {
    door = doorNum;  
  }
}

以上代码重载构造器,为类添加了一个构造器。

实例化对象

实例化对象就是使用类去创建对象的过程,好比通过图纸修建大厦的过程。

类名 对象名 = new 构造器;
  • new:是 Java 关键字,用于实例化对象(在内存堆区开辟空间保存对象)

  • 构造器:通过调用类的某个构造器才能实现实例化对象

  • 对象名:可以使用对象名来间接调用对象(保存对象的引用)

Car car = new Car();    //调用显式默认构造器实例化对象
Car car2 = new Car (2);//调用重载构造器实例化对象
对象的使用

Java 对象的使用就是访问(或调用)对象的属性和方法

  • 对象名.属性

  • 对象名.方法

Car car = new Car();
car.door;
car.start();
对象的销毁

对象的销毁就是释放对象占用的内存空间,Java 语言 采用的是 GC 垃圾回收机制,它可以自动回收不再使用的对象,Java 程序员就只需要关注对象的实例化,而不用关注对象的销毁。

GC 回收的对象已经释放掉其占用的内存空间,就不能再使用,否则就会导致运行时错误(或程序崩溃)。

匿名对象

我们知道一般实例化一个对象的格式,如下:

Car car = new Car();

其中,变量名 car 就是 new Car() 这个对象的名字。car 是引用类型的变量,它的值存放的是对象的引用(或地址),通过 car 这个变量我们就可以间接使用对象。

那所谓 Java 匿名对象,简单理解就是对象没有名字嘛。那怎样的对象会没有名字呢?如下:

new Car();

那这种匿名对象如何使用呢?所谓使用就是指调用对象的属性和方法。如下:

new Car().door;
new Car().start();

这两行代码有两个 new 关键字,说明实例化了两个对象,并不是一个哦。

由于这两个对象没有名字,所以这两行代码执行完以后,我们就无法再使用它们了,然后它们将会被 GC(Java 垃圾回收机制)当作垃圾回收掉。

所以,匿名对象只能被调用一次

那匿名对象有什么用处呢?

  • 当对象对方法或属性仅进行一次调用的时候,使用匿名对象可以少写一些代码,代码看起来更简洁。

//匿名对象调用方法
new Car().start();
//非匿名对象调用方法
Car car = new Car(); 
car.start(); 

看到了吧,使用匿名对象只需要一行代码,而非匿名对象需要两行代码。

  • 匿名对象可以作为参数传递给方法

//给汽车添加一个重启方法
public void restart(Car car) {  // 汽车熄火了,需要传入另一辆汽车帮忙点火重新启动
     //...
}

Car car = new Car();
car.restart(new Car());  //匿名对象作为参数使用