标题:对象编程-类与方法上
面向对象三大特征
- 封装:将客观事物封装为抽象的类,并且类可以把自己的数据和方法只让可信的类或对象操作,对不可信的进行信息隐藏。内部操作对不可信外部而言不可见。(保护性)
- 继承:是指可以使用现有类的所有功能,并且在无须重复编写原有类的情况下对原有类进行功能上的扩展。(可重用)
- 多态(重要):一个类实例相同方法在不同情况下有不同的表现形式。多态机制是具有不同内部的对象可以共享外部相同接口。
名词扩展:
- OOA:面向对象分析
- OOD:面向对象设计
- OOP:面向对象编程
类与对象的定义和使用
- 类:指的是共性的概念,而对象是一个具体的,可以使用的事物,首先先要有类(类是生产对象的蓝图),而后才可以产生对象。对象所具有的所有行为与属性,一定是在类中进行了完整的定义。
类的组成:
- 方法(操作的行为)
属性(操作的数据,每个对象应该具有的特征)
java中类的定义语法
calss 类名称{ 属性类型 属性名称1; 属性类型 属性名称2; ... 方法1(){}; 方法2(){}; ... }
- 范例:定义一个Person类
1 | class Person{ |
类中的属性和方法不在由主方法直接调用,而需要通过对象来调用。
对象声明语法: 类名称 对象名称 = new 类名称(); Person per1=new Person(); Person per2=new Person(“Dyson”,20);
类与对象内存分析
new 关键字 - 在堆上开辟了新的空间
栈内存:存放的是局部变量(包含各种基本数据类型以及对象引用–对象的名称)
堆内存:保存真正对象(对象的属性数据)
Person per=new Person();
- 对象(引用数据类型)必须在实例化后调用,否则会产生NullPointerException(运行时异常)
- 垃圾空间:没有任何空间指向的堆内存空间
private实现封装处理(仅限于本类中访问)
让内部操作对外部不可见(在类的外部不能直接使用对象来操作属性)可以使用private对属性进行封装,称为类的私有属性。(主类和主方法称为客户端)
- 范例:无封装程序
1 | class Person{ |
Java规范:1.所有私有属性要想访问与设置内容,提供对应getter与setter方法
setter方法: 进行属性内容设置与更改
getter方法: 取得属性内容
范例:扩展Person类的内容1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31class Person{
private String name;
private int age;
public void setName(String n){
name=n;
}
public String getName(){
return name;
}
public void setAge(int i){
if(i>0&&i<=200){
age=i;
}else{
age=0;
}
}
public int getAge(){
return age;
}
public void getPersonInfo(){
System.out.println("姓名:"+name+" 年龄:"+age);
}
}
public class Test{
public static void main(String[] args){
Person person=new Person();
person.setName("Dyson");
person.setAge("18");
person.getPersonInfo();
}
}
类的设计原则:
- 类中的属性必须使用private封装
- 属性若要被外部访问,必须定义相应的getter与setter方法
构造方法
- 任何对象都应该有其对应的类,类是对象的蓝图 2.是一个唯一的标记,引用一块堆内存 3.表示开辟新的堆内 存空间 4.构造方法
(a)Person (b)per1=(c)new(d)Person();
特点:
- 方法名称必须与类名称相同
- 构造方法没有返回值类型声明 (重要)
- 每个类必须至少存在一个构造方法(没有明确定定义的话,系统默认自动生成一个无参构造)
- 若类中定义的构造方法,则默认的无参构造不再生成。(先赋值,再传参)
构造方法无返回值,为什么没有void声明?
类的组成:属性,构造方法,普通方法
- 属性是在对象开辟堆内存时开辟的空间
- 构造方法是在使用new后调用的
- 普通方法是在空间开辟了,构造方法执行之后可以多次调用的
1 | public void Person(){}//命名不标准的普通方法 |
编译器是根据程序结构来区分普通方法与构造方法,因此构造方法前没有返回值类型声明
- 范例:使用构造方法设置对象属性
1 | class Person{ |
构造方法的重载:参数个数不同(参数类型已经被定义)
- 范例:构造参数重载
1 | public Person(){ |
建议:有若干个构造方法,请按照参数个数升序或降序
进行类定义时遵循以下顺序:
- 先定义属性->构造方法(构造方法按照个数大小排列)->普通方法
匿名对象
- 范例:
1 | new Person("Dyson",18).getPersonInfo(); |
- 由于匿名对象不会有任何的栈空间所指向,所以使用一次后就成为垃圾空间。
this表示当前对象
- 范例:this表示当前对象
1 | class Person{ |