本章学习目标
-
了解面向过程编程思想与面向对象编程思想的区别
-
重点掌握类与对象的概念
-
重点掌握类的属性(成员变量)和方法
-
了解匿名对象
面向过程编程思想与面向对象编程思想区别
所谓面向过程编程与面向对象编程都是一种编程范式,通俗地说就是编程过程中遇到问题提供统一的解决方案。
-
面向过程在解决问题的时候,会分析出解决问题的步骤,然后用函数一步步的将这些步骤实现,依次调用函数。
-
面向对象在解决问题的时候,会将问题拆散成一个个对象,建立对象的目的不是为了完成某个步骤,而是为了描述某个事物在整个解决问题的步骤中的行为。
总结:面向过程编程与面向对象编程的区别来自于思考问题方式的不同
对象和类
什么是对象
对象就是看得见摸得着的东西,万物皆对象
如何认识对象
任何一个对象都有其特征和功能,我们也是通过对象的特征和功能认识对象
什么是类
我们把具有某些相同特征和功能的对象归纳为类,类是对对象的抽象和描述,不是具体指某个对象或东西,类是看不见摸不着的,比如人类、狗、男人等。
类的作用
类的作用是作为模板或图纸用于建造同一类对象,比如想要修建一栋大厦,不可能不画设计图,一上来就开干。
如何定义类
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()); //匿名对象作为参数使用