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格式来起名。
类的设计原则:
- 编写类时,类中的所有属性必须使用private封装。
- 属性若要被外部访问,必须定义setter、getter方法。
构造方法:
构造方法就是使用关键字new实例化新对象时来进行调用的操作方法。对于构造方法的定义,也需要遵循以下原则:
- 方法名称必须与类名称相同
- 构造方法没有返回值类型声明
- 每一个类中一定至少存在一个构造方法(没有明确定义,则系统自动生成一个无参构造)
思考题:构造方法无返回值,为什么没有void声明?
原因如下:
- 属性是在对象开辟堆内存时开辟的空间
- 构造方法是在使用new后调用的
- 普通方法是在空间开辟了、构造方法执行之后可以多次调用的
因此,编译器是根据程序结构来区分普通方法与构造方法的,所以在构造方法前没有返回值类型声明。
构造参数重载
多个构造方法,按照参数的升序或降序。
匿名对象
一个对象没有起名字,这个对象叫匿名对象。
由于匿名对象不会有任何的栈空间所指向,所以使用一次后就成为垃圾空间。
三、this关键字
调用本类属性
只要在类中方法访问类中属性,一定要加this关键字。
调用本类方法
- 调用普通方法:this.方法名称(参数)
- 调用构造方法:this(参数)
在java中,支持构造参数相互调用。
使用this调用构造方法时请注意:
- this调用构造方法的语句必须在构造方法首行
- 使用this调用构造方法时,请留有出口
- 构造方法中通过this调用本类的构造方法要放到构造方法的第一行代码
this表示当前对象
只要对象调用了本类中的方法,这个this就表示当前执行的对象。
访问当前对象的属性的时候,要加上this。
四、static关键字
static可以修饰成员变量、方法、代码块、内部类。
static类属性
static创建的属性,成为类属性,保存在全局数据区的内存之中,所有对象都可以进行该数据区的访问。(一个对象把它改了之后,其余的对象显示的也是改过之后的属性)访问时通过类名直接使用,不建议使用this。
结论:
- 访问static属性(类属性)应使用类名称.属性名
- 所有的非static属性(实例变量)必须在对象实例化后使用,而static属性(类属性)不受对象实例化控制。
static类方法(静态方法)
使用static定义的方法,直接通过类名称访问。
说明:
- 所有的static方法不允许调用非static定义的属性或方法。(如果要调用,可以在该方法中通过创建一个对象来调用)
- 所有的非static方法允许访问static方法或属性。
使用static定义方法只有一个目的:
某些方法不希望受到对象的控制,即可以在没有实例化对象的时候执行(广泛 存在于工具类中)。
main方法也是一个普通的静态方法,可以自己调用自己,可以被调用。
main方法为什么要定义成静态的?
如果定义成动态的,在使用时要有一个对象才能调用,定义成静态的,可以在没有对象的时候执行。