类与方法

标题:对象编程-类与方法上


面向对象三大特征

  1. 封装:将客观事物封装为抽象的类,并且类可以把自己的数据和方法只让可信的类或对象操作,对不可信的进行信息隐藏。内部操作对不可信外部而言不可见。(保护性)
  2. 继承:是指可以使用现有类的所有功能,并且在无须重复编写原有类的情况下对原有类进行功能上的扩展。(可重用)
  3. 多态(重要):一个类实例相同方法在不同情况下有不同的表现形式。多态机制是具有不同内部的对象可以共享外部相同接口。

名词扩展:

  • OOA:面向对象分析
  • OOD:面向对象设计
  • OOP:面向对象编程

类与对象的定义和使用

  • 类:指的是共性的概念,而对象是一个具体的,可以使用的事物,首先先要有类(类是生产对象的蓝图),而后才可以产生对象。对象所具有的所有行为与属性,一定是在类中进行了完整的定义。
  • 类的组成:

  • 方法(操作的行为)
  • 属性(操作的数据,每个对象应该具有的特征)

    java中类的定义语法
    calss 类名称{
    
    属性类型  属性名称1;
    
    属性类型  属性名称2;
    
     ...
    
    方法1(){};
    
    方法2(){};
    
     ...
    
     }
    
  • 范例:定义一个Person类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Person{
public String name;
public int age;
public Person(String name,int age){
this.name=name;
this.age=age;
}
public String getPersonInfo(){
return "姓名:"+this.name+",年龄:"+this.age;
}
}
public class Test{
public static void main(String[] args) {
Person per=new Person("Dyson",20);
System.out.println(per.getPersonInfo());
}
}
  • 类中的属性和方法不在由主方法直接调用,而需要通过对象来调用。

    对象声明语法:
    
    类名称 对象名称 = new 类名称();
    
    Person per1=new Person();
    
    Person per2=new Person(“Dyson”,20);
    

    类与对象内存分析

    new 关键字 - 在堆上开辟了新的空间

栈内存:存放的是局部变量(包含各种基本数据类型以及对象引用–对象的名称)

堆内存:保存真正对象(对象的属性数据)

Person per=new Person();

  • 对象(引用数据类型)必须在实例化后调用,否则会产生NullPointerException(运行时异常)
  • 垃圾空间:没有任何空间指向的堆内存空间
private实现封装处理(仅限于本类中访问)
让内部操作对外部不可见(在类的外部不能直接使用对象来操作属性)可以使用private对属性进行封装,称为类的私有属性。(主类和主方法称为客户端)
  • 范例:无封装程序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Person{
String name;
int age;
public void getPersonInfo{
System.out.println("姓名"+name+" 年龄"+age);
}
}
public class Test{
public static void main(String[] args){
Person person=new Person();
person.name="Dyson"
person.age=18;
person.getPersonInfo();
}
}

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
31
class 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();
}
}

类的设计原则:
  1. 类中的属性必须使用private封装
  2. 属性若要被外部访问,必须定义相应的getter与setter方法

构造方法

  • 任何对象都应该有其对应的类,类是对象的蓝图 2.是一个唯一的标记,引用一块堆内存 3.表示开辟新的堆内 存空间 4.构造方法

(a)Person (b)per1=(c)new(d)Person();

特点:

  1. 方法名称必须与类名称相同
  2. 构造方法没有返回值类型声明 (重要)
  3. 每个类必须至少存在一个构造方法(没有明确定定义的话,系统默认自动生成一个无参构造)
  4. 若类中定义的构造方法,则默认的无参构造不再生成。(先赋值,再传参)
构造方法无返回值,为什么没有void声明?

类的组成:属性,构造方法,普通方法

  1. 属性是在对象开辟堆内存时开辟的空间
  2. 构造方法是在使用new后调用的
  3. 普通方法是在空间开辟了,构造方法执行之后可以多次调用的
1
2
public void Person(){}//命名不标准的普通方法
public 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
31
class Person{
private String name;
private int age;
public Person(String n,int i){
name=n;
setAge(i);
}
public void serName(String n){
name=n;
}
public String getName(){
return name;
}
public void setAge(int i){
if(i>0&&i<=200)
}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("Dyson"18);
}
}
构造方法的重载:参数个数不同(参数类型已经被定义)
  • 范例:构造参数重载
1
2
3
4
5
6
7
public Person(){
System.out.println("==无参构造==");
}
public Person(String n){
name=n;
System.out.println("==有参构造==");
}

建议:有若干个构造方法,请按照参数个数升序或降序
进行类定义时遵循以下顺序:

  • 先定义属性->构造方法(构造方法按照个数大小排列)->普通方法

匿名对象

  • 范例:
1
new Person("Dyson"18).getPersonInfo();
  • 由于匿名对象不会有任何的栈空间所指向,所以使用一次后就成为垃圾空间。

this表示当前对象

  • 范例:this表示当前对象
1
2
3
4
5
6
class Person{
public void print(){
System.out.print(){
System.out.println("[PRINT]方法"+this);
}
}