欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java面向对象——类与对象

程序员文章站 2022-05-28 13:36:48
...

1. 类的定义

类是某一批对象的抽象,可以把抽象理解成某种概念。

类名需要每个单词的首字母大写

类的定义包含:构造方法(构造器)、成员变量、成员方法。类里个成员之间的定义顺序没有任何影响,各成员之间可以相互调用,但static修饰的成员不能访问没有static修饰的成员。

[修饰符] class 类名称{ 			//修饰符:private、protected、public、final、abstract
	零到多个构造器定义。。。
	零到多个成员变量。。。
	零到多个方法。。。
}

2. 对象的定义

创建对象的根本途径是构造方法(构造器),对象只有在实例化之后才能被使用,通过new关键字来调用某个类的构造器即可创建这个类的实例。当new一个对象时就会在内存空间中的堆区申请一片区域,用于存放于该对象有关的成员变量信息,这个过程叫做对象的创建/对象的构造/类的实例化。

【static】修饰的方法和属性,既可以通过类来调用,也可以通过实例来调用;没有使用static修饰的普通方法和属性,则只可通过实例来调用。

对象的定义在主方法中	类名 对象名 = new 类名();

Person p;			    //先定义一个Person类的引用(p的含义等于指针)
p = new Person【();		//用new关键字调用Person类的构造器,创建一个Person对象。
					   //后将创建的Person对象的地址给P。
					   
p.name = "liubin";		//调用p的name属性,直接为该属性赋值
p.say("java语言很简单,学习很容易");	//调用p的say方法,声明say方法时定义了一个形参。

3. 对象、引用和指针

Person p = new Person(); //创建了一个Person对象,一个p变量

类也是一种引用数据类型,因此person类型的引用变量p里存放的仅仅是一个引用,指向实际的person对象。

p被存放在栈内存中,用于记录【实例变量】在堆区中的内存地址信息。而真正的person对象属性数据则存放在堆内存中。以后使用该变量就可以代表记录的对象。

注意:

  1. 引用型的变量与C语言里的指针很像,他们都是存储一个地址值,通过这个地址来引用到实际对象,实际上,java里的引用就是C的指针,只是java语言把这个指针封装起来,避免开发者进行繁琐的指针操作。
  2. 当一个对象被创建成功之后,这个对象将保存在堆内存中,java程序不允许直接访问堆内存中的对象,只能通过该对象的引用操作该对象,也就是说,不管是数组,还是对象,都只能通过引用来访问他们。
  3. 堆内存里的对象可以有多个引用,即多个引用变量指向同一个对象。
  4. 如果堆内存中的对象没有任何变量指向该对象,那么程序将无法再访问该对象,这个对象也就变成了垃圾,java的垃圾回收机制将回收该对象,释放该对象所占的内存区。
    因此,如果希望通知垃圾回收机制回收某个对象,只需切断该对象的所有引用变量和它之间的关系即可。也就是把这些引用变量赋值为null。

4. 对象的this引用

this关键字总是指向调用该方法的对象,根据this出现位置的不同,this作为对象的默认引用有两种情形。

构造器中引用该构造器正在初始化的对象。

在方法中引用调用该方法的对象。

【static】:如果在static修饰的方法中使用this关键字,则这个关键字就无法指向合适的对象。所以static修饰的方法中不能使用this引用。

public Person grow(){
  	age++;
  	return this;
}
public static void main(String[] args){
  	Person p = new Person();
	p.show().show().show();				//即连续调用了三次grow()方法
}

5. 对象创建的过程

一、单个对象创建的过程

  1. main()方法是程序的入口,当创建对象时没有指定成员变量的初始值,则采用默认的初始化方式,当指定初始值时,则采用指定的数值进行初始化。

  2. 执行构造块可以修改成员变量的数值。

  3. 执行构造方法体可以再次更改成员变量的数值。

  4. 此时对象创建完毕,继续执行后续的代码。

二、子类对象创建的过程

  1. 首先加载父类的字节码文件,执行父类的静态语句块。
  2. 再加载子类的字节码文件,执行子类的静态语句块。
  3. 当创建子类对象时,需先构造子类对象中包含的父类对象,则执行父类的构造块和父类的构造方法体。
  4. 执行子类的构造块和子类的构造方法体。
  5. 此时子类对象构造完毕,继续执行后续的代码。