Bootstrap

【java】面向对象编程——类与对象的封装

Java比C更方便的地方在于Java是面向对象的。面向对象的特征:
1、封装 ; 2、继承 ; 3、多态;
以下对面向对象的封装特征进行简述:

一、类与对象的定义与使用

类是指共性的概念,对象是一个具体的、可以使用的事物。
首先产生类,而后才可以产生对象。

类的组成:
	1. 方法(操作的行为)
	2. 属性(变量,描述每个对象的具体特点)
类的定义:
class 类名称 {    
	属性1;    
	属性2;  
	属性n...;    
	构造方法(){}    
	方法1(){}    
	方法2(){}    
	方法n(){}...
 }
对象的定义:
类名称 对象名称 = new 类名称();

注:
1、引用数据类型在类中作为属性创建对象时默认值是null。
2、类中的属性定义为private时,不能通过外部来访问。

对象内存分析:

我们可以简单的将Java中的内存分为两部分:堆内存和栈内存。
栈内存中一般存放基本数据类型、对象引用(堆内存的地址)。
堆内存中一般存放数据(对象的属性信息)。

下面通过如下代码对内存进行分析:

class Person{    
	String name;    
	int age;    
} 
public class Test{    
	public static void main(String[] args) {        
		Person per = new Person();        
		per.name = "张三" ;        
		per.age = 18 ; 
	}
}

只要出现了new,就表明在堆上创建并开辟了一个类的对象引用这部分内存。
所以main方法中的第一行代码表明在堆上分配了内存并且产生了Person类的对象per引用这部分内存。图如下:
在这里插入图片描述
第二、三行语句通过per设置堆中属性值,如下图:
在这里插入图片描述
注:
1、通过对象设置堆中属性值。
2、对象必须实例化后再使用。

引用传递分析:

(过程同数组中引用传递分析)


二、封装和构造方法

private对属性进行了封装,要访问私有属性,按照Java的设计原则必须提供以下两种方法:

setter方法:主要用于进行属性内容的设置与修改
getter方法:主要用于属性内容的取得

如果属性的数据类型是boolean,建议使用isXXX格式来起名。
类的设计原则:

  1. 编写类时,类中的所有属性必须使用private封装。
  2. 属性若要被外部访问,必须定义setter、getter方法。
构造方法:

构造方法就是使用关键字new实例化新对象时来进行调用的操作方法。对于构造方法的定义,也需要遵循以下原则:

  1. 方法名称必须与类名称相同
  2. 构造方法没有返回值类型声明
  3. 每一个类中一定至少存在一个构造方法(没有明确定义,则系统自动生成一个无参构造)

思考题:构造方法无返回值,为什么没有void声明?
原因如下:

  1. 属性是在对象开辟堆内存时开辟的空间
  2. 构造方法是在使用new后调用的
  3. 普通方法是在空间开辟了、构造方法执行之后可以多次调用的

因此,编译器是根据程序结构来区分普通方法与构造方法的,所以在构造方法前没有返回值类型声明。

构造参数重载

多个构造方法,按照参数的升序或降序。

匿名对象

一个对象没有起名字,这个对象叫匿名对象。
由于匿名对象不会有任何的栈空间所指向,所以使用一次后就成为垃圾空间。


三、this关键字

调用本类属性

只要在类中方法访问类中属性,一定要加this关键字。

调用本类方法
  1. 调用普通方法:this.方法名称(参数)
  2. 调用构造方法:this(参数)

在java中,支持构造参数相互调用。
使用this调用构造方法时请注意:

  1. this调用构造方法的语句必须在构造方法首行
  2. 使用this调用构造方法时,请留有出口
  3. 构造方法中通过this调用本类的构造方法要放到构造方法的第一行代码
this表示当前对象

只要对象调用了本类中的方法,这个this就表示当前执行的对象。
访问当前对象的属性的时候,要加上this。


四、static关键字

static可以修饰成员变量、方法、代码块、内部类。

static类属性

static创建的属性,成为类属性,保存在全局数据区的内存之中,所有对象都可以进行该数据区的访问。(一个对象把它改了之后,其余的对象显示的也是改过之后的属性)访问时通过类名直接使用,不建议使用this。
结论:

  1. 访问static属性(类属性)应使用类名称.属性名
  2. 所有的非static属性(实例变量)必须在对象实例化后使用,而static属性(类属性)不受对象实例化控制。
static类方法(静态方法)

使用static定义的方法,直接通过类名称访问。
说明:

  1. 所有的static方法不允许调用非static定义的属性或方法。(如果要调用,可以在该方法中通过创建一个对象来调用)
  2. 所有的非static方法允许访问static方法或属性。

使用static定义方法只有一个目的:
某些方法不希望受到对象的控制,即可以在没有实例化对象的时候执行(广泛 存在于工具类中)。
main方法也是一个普通的静态方法,可以自己调用自己,可以被调用。
main方法为什么要定义成静态的?
如果定义成动态的,在使用时要有一个对象才能调用,定义成静态的,可以在没有对象的时候执行。


;