写在开头:从今天开始我们就进入到了Java面向对象的学习了,该部分是Java学习的重点同时也是难点。对该部分的理解深度直接将影响我们对Java的理解和使用。由于该部分内容较多,所以分为四个部分学习:一、类和对象的理解和使用;二、java内存底层的初步了解;三、面向对象的三大特征:继承、封装、多态;四、一些特殊的类:接口、字符串类、内部类等等。本文是对 面向对象(一):类和对象 做一个总结和归纳。同样的,其中也会穿插示例(包括源代码和运行结果)加深大家的理解。还是那句话:假传万卷书,真传一案例。让我们 生死看淡,不服就干!
PS:本文是个人学习笔记,用于个人复习。文章内容引用尚学堂java300集教学。
类和对象
Ⅰ 面向过程和面向对象的区别
Ⅱ 类的概念和定义
Ⅲ 对象
Ⅳ 类的管理
Ⅰ 面向过程和面向对象的区别
区别:面向过程是执行者思维,解决简单问题可以使用面向过程;面向对象是设计者思维,解决复杂,需要协作的问题可以使用面向对象。
联系:面向过程和面向对象是相辅相成的,都是解决问题的方式。宏观上,通过面向对象进行整体设计;微观上,执行和数据处理,仍是面向过程。
Ⅱ 类的概念和定义
-
类和对象的概念
类可以看作一类对象的模板,对象可以看成该类的一个具体实例;
类是用于描述同一类型的对象的一个抽象概念,类种定义了这一类对象所应具有的共同的属性、方法 -
类的定义
(1) 类定义格式[修饰符] class 类名{ 属性; 方法; 构造方法; }
(2)属性field
属性用于定义该类或该类对象包含的数据或者说静态特征。属性作用范围是整个类体。在定义成员变量时可以对其初始化,如果不对其初始化,java使用默认的值对其初始化。
属性定义格式:[修饰符] 属性类型 属性名 = [默认值]
数据类型 默认值 整型 0 浮点型 0.0 字符型 ‘\u0000’ 布尔型 false 所有引用类型 null (3)方法method
方法用于定义该类或该类实例的行为特征和功能实现。方法是类和对象行为特征的抽象。
方法定义格式:[修饰符] 方法返回值的类型 方法名(形参列表){ 语句块 }
(4)构造方法constructor
构造方法用于对象的初始化。构造器是一个创建对象时被自动调用的特殊方法,目的是对象的初始化。构造器的名称应与类的名称一致。Java通过new关键字来调用构造器,从而返回该类的实例,是一种特殊的方法。
构造方法声明格式:[修饰符] 类名(形参列表){ 语句块 }
构造方法的四个要点:
- 构造方法虽然有返回值,但是不能定义返回值类型(返回值的类型肯定是本类),不能在构造方法里使用return返回某个值
- 构造方法通过new关键字调用
- 如果我们没有定义构造方法,则编译器会自动定义一个无参的构造函数。如果定义则编译器不会自动添加
- 构造方法的方法名必须和类名一致构造方法的重载:构造方法也是方法,只不过有特殊的作用而已。与普通方法一样,构造方法也可以重载。
Ⅲ 对象
对象和类的关系:前面我们说过:类可以看作一类对象的模板,对象可以看成该类的一个具体实例。我们也可以通过一个类比来更加形象地理解这个关系。我们可以把对象比作一张汽车图纸,上边详细记载了一俩汽车所具备的部件和能进行的操作;而对象就是根据这张图纸制造出的一辆辆真实的汽车实例。
对象的声明周期:
- 创建对象(四步)
+ 分配对象空间,并将对象成员变量初始化为0或空
+ 执行属性值的显示初始化
+ 执行构造方法
+ 返回对象的地址给相关的变量
- 使用
+ 通过变量引用操作对象
- 回收
+ 对象没有被变量使用,则默认为是“垃圾”。会被垃圾回收器回收
Ⅳ 类的管理
-
package包机制
我们通过 package 实现对类的管理,package 的使用有两个要点:
(1) 通常是类的第一句非注释性语句。
(2) 包名:域名倒着写即可,再加上模块名,便于内部管理类。注意事项:
- 写项目时都要加包,不要使用默认包。
- com.gao 和 com.gao.car,这两个包没有包含关系,是两个完全独立的包。只是逻辑 上看起来后者是前者的一部分。JDK中的主要包
Java中的常用包 说明 java.lang 包含了一些Java语言的核心类,如String、Math、Integer、System和Thread,提供常用的功能 java.awt 包含了构成抽象窗口工具集( abstract window toolkits )的多个类,这些类被用来构建和管理应用程序的图形用户界面(GUI) java.net 包含执行与网络相关的操作的类 java.io 包含能提供多种输入/输出功能的类 java.util 包含一些实用工具类,如定义系统特性、使用与日期日历相关的函数 -
import导入
如果我们要使用其他包的类,需要使用 import 导入,从而可以在本类中直接通过类名 来调用,否则就需要书写类的完整包名和类名。import 后,便于编写代码,提高可维护性。注意要点:
- Java 会默认导入 java.lang 包下所有的类,因此这些类我们可以直接使用。
- 如果导入两个同名的类,只能用包名+类名来显示调用相关类:java.util.Date date = new java.util.Date();
示例:创建一个学生类,并定义三个属性:学号(id),姓名(sname),年龄(age);和一个方法:打印学生信息studentInformation( )。
package Student; //包名
//每一个源文件必须有且仅有一个public class,并且类名和文件名保持一致!
public class Student {
//属性
int id; //学号
String sname; //姓名
int age; //年龄
//无参构造方法
public Student(){
}
//有参构造方法(方法名和类名保持一致)
public Student(int _id, String _sname, int _age){
id = _id;
sname = _sname;
age = _age;
//我们对有参构造方法进行重载,使其只对学号与姓名进行赋值
public Student(int _id, String _sname){
id = _id;
sname = _sname;
}
//方法(打印学生信息)
void studentInformation(){
System.out.println("Student ID: " + id );
System.out.println("Name: " + sname );
System.out.println("Age: " + age);
//main方法
public static void main(String[] args) {
Student s1 = new Student(9527,"张三", 23); //创建一个学生类的实例s1
s1.studentInformation(); //调用学生类对象s1的方法studentInformation(),打印学生信息
System.out.println("================="); //分割线
Student s2 = new Student(2333,"李四"); //创建一个学生类的实例s2
s2.studentInformation();
}
我们创建了学生类Student,并且定义了三个属性:学号(id),姓名(sname),年龄(age);一个方法:打印学生信息studentInformation( )。
我们声明了一个有参构造方法,使得其能通过传入实参对类对象的三个属性进行初始化;紧接着我们重载了这个构造方法,让它只对学号和姓名进行初始化。
在main函数中,我们通过new关键字创建了两个Student类的实例s1和s2,由于传入的参数不同,这s1与s2调用的构造函数也不同。如果我们不传入任何实参,那么就会调用无参构造方法,系统会赋予成员变量默认值。接下来我们调用了s1和s2的方法,打印出了s1与s2的学生信息。
可以看到,s1和s2都打印了三个属性的信息。特别的,这里s2的age属性数值为0,这是因为s2在构建时调用了重载后的构造函数,仅对id与sname进行了初始化,age则是系统默认值。