注册 登录
Java基础教程

第一章: 开启Java学习之旅

第二章: 掌握计算机基础知识

第三章: 掌握命令行基础知识

第四章: 我的第一个Java程序

第五章: Java编程必备基础

第六章: Java编程的核心:控制结构

第七章: Java面向对象基础

第八章: Java面向对象进阶

第九章: Java字符串类型

第十章: Java数组与数据结构

第十一章: Java高级数据结构

第十二章: Java并发编程基础

首页 > Java基础教程 > 第七章: Java面向对象基础 > 7.4节: 对象属性,对象方法,构造函数

7.4节: 对象属性,对象方法,构造函数

薯条老师 2021-11-29 10:29:38 158667 0

编辑 收藏

广州番禺Python, Java小班周末班培训

第四期线下Java, Python小班周末班已经开课了,培训的课程有Python爬虫,Python后端开发,Python办公自动化,Python大数据分析, Java中高级工程师培训。授课详情请点击:http://chipscoco.com/?cate=6    

7.4.1 对象属性

7.3.3节讲到了类属性,类属性表示这种数据类型共有的特征。本节要讲的对象属性是指类实例的属性,类实例属性只属于当前对象,举个简单的例子,每个人在银行里都有存款,但每个人的存款数目都不一样,即使一样,别人的存款也不是你的,它只属于该存款账户的所有者。在讲解如何对类进行实例化获得对象之前,读者需要先掌握如何定义对象属性。定义对象属性的基本语法:

[modifier] [modifier] dataType property;

第一个modifier表示访问控制符,以下为修饰对象属性的访问控制符:

访问控制符

描述

public

其它所有类都可以访问该属性

protected

只能被类自身,该类的子类,以及同一个包中的其它类访问

private

只能被类自身访问

在定义对象属性时同样可以不加访问控制符,则此时的对象属性只能被自身以及同一个包中的类访问。语法中的第二个modifier表示变量的修饰符,同样可以使用final等修饰符来修饰对象属性。property表示属性名,对象属性同类属性一样,通常采用小驼峰命名法。

在定义对象属性时,如需表达只读的语义,也应该使用final来进行修饰。

对象属性也叫做实例属性,在定义对象属性时不能加上static修饰符,否则该属性会变成类属性。现在打开HelloJava项目,在HelloJava.java中定义一个Person类,并为该类添加名为deposit的对象属性:

class Person{
    /*
     (1) 定义的deposit为对象属性,因为没有用static进行修饰
     (2) java会为根据对象属性的类型来设置默认值,如果是整型,则值默认为0
     */
    int deposit;
}
 
 
public class HelloJava{
    public  static void main(String[] args) {
        // 执行下面的代码时会报错,因为对象实例只能通过对象来访问
        System.out.println(Person.deposit);
    }
 
}
读者需注意的是,对象属性只能通过对象来访问,不能通过类来访问,否则会报错。

7.4.2 对象方法

对象方法属于当前的对象。定义对象方法的基本语法:

[modifier] returnType methodName(parameterType parameter1[,parameterType parameter2...]) {

    return value;

}

定义对象方法与定义类方法在语法形式上并没有太大区别,只不过在定义对象方法时不需要使用static进行修饰,否则会变成类方法。现在为person类添加一个名为consume的对象方法:

class Person{
    /*
     (1) 定义的deposit为对象属性,因为没有用static进行修饰
     (2) java会为根据对象属性的类型来设置默认值,如果是整型,则值默认为0
     */
    int deposit;
 
    // consume是一个对象方法
    public void consume(int money){
        // this是java中的关键字,表示当前的对象
        if (this.deposit >= money){
            // 存款大于等于消费的金额,才能取款消费
            this.deposit -=money;
        }
    }
}
 
 
public class HelloJava{
    public  static void main(String[] args) {
        // 执行下面的代码时会报错,因为对象实例只能通过对象来访问
        // System.out.println(Person.deposit);
    }
 
}

7.4.3 this引用

Java在对类进行实例化时,会先为对象及其属性分配内存空间,在内存分配的过程中,会为对象属性赋一个默认值。这里的默认值通常是零值,比如整型的0,浮点型的0.0。在7.4.2节的代码实例中使用了this关键字,this在Java中是一个引用,指向当前对象,所以可以通过this来访问对象属性。内存分配结束以后,Java会调用类的构造函数来为对象进行初始化。

7.4.4 构造函数

Java类中的构造函数用来为对象进行初始化操作,以下为类构造函数第一的基本语法

[modifier] ClassName(parameterType parameter1[,parameterType parameter2...]) {

    ;

}

modifier表示访问控制符,构造函数的访问控制符同类属性访问控制符,不再赘述。ClassName表示类名,构造函数的函数名必须与类名相同。parameter1,parameter2等为构造函数的形参,parameterType为参数的类型。在Java中,可以同时定义多个构造函数,每个构造函数的参数类型和数目不能相同。

在Java中,可以定义多个函数名相同,但参数类型和个数不相同的函数,这种函数定义方式被称为重载(overloading)。在第八章的教程中,会对函数重载进行详细讲解。

读者需注意的是,Java的构造函数虽然也是函数,但它是没有返回值的,构造函数一般用来为对象进行初始化。如果没有显式定义构造函数,那么Java会自动添加一个无参的构造函数。

在Java中,无参的构造函数即为默认的构造函数。

代码实例-为Person类添加构造函数:

class Person{
    /*
     (1) 定义的deposit为对象属性,因为没有用static进行修饰
     (2) java会为根据对象属性的类型来设置默认值,如果是整型,则值默认为0
     */
    int deposit;
 
    // consume是一个对象方法
    public void consume(int money){
        // this是java中的关键字,表示当前的对象
        if (this.deposit >= money){
            // 存款大于等于消费的金额,才能取款
            this.deposit -= money;
        }
    }
    
    // 构造函数的函数名须与类名同名
    public Person(int deposit){
        // 通过this来访问对象属性deposit
        this.deposit = deposit;
    }
}
 
 
public class HelloJava{
    public  static void main(String[] args) {
        // 执行下面的代码时会报错,因为对象实例只能通过对象来访问
        // System.out.println(Person.deposit);
    }
 
}

在上文代码实例中为Person类添加了构造函数,在构造函数内部将参数deposit的值赋值给对象属性deposit。在定义对象属性时,也可以直接在构造函数外部为属性赋值:

class Person{
 
    // 定义对象属性时,直接赋值    
    int deposit = 1000;
    
    
    // consume是一个对象方法
    public void consume(int money){
        // this是java中的关键字,表示当前的对象
        if (this.deposit >= money){
            // 存款大于等于消费的金额,才能取款
            this.deposit -= money;
        }
    }
}

java在执行过程中会将构造函数外部的对象属性赋值,隐式地添加至构造函数中,也就是说,上文代码中的int deposit=1000,其实是在构造函数内部执行的。

7.4.5 new一个对象

在7.4.4节我们了解到了构造函数的作用,构造函数用来为对象进行初始化。那么在Java中,该怎么获得实例化后的对象呢?在Java中可通过new关键字来创建一个实例对象。使用new操作符来创建对象的语法结构:

ClassName instance = new ClassName(argument1, artument2,...);

ClassName表示类名,instance表示实例名,argument1,argument2等为实参。这里的实参与构造函数中的形参一一对应。获得了对象以后,同样可以通过成员操作符来访问对象属性和对象方法。现在结合以上的代码来写一个完整的实例,在代码实例中为Person类添加消费和获取存款余额的对象方法:

class Person{
    // 定义类属性count来统计对象的数目
    public static int count = 0;
    // 将对象属性deposit设置为私有
    private int deposit;
 
    // 构造函数
    public Person(int deposit){
        this.deposit = deposit;
        // 每次实例化对象时就给count加1,以统计对象的数目
        count +=1;
    }
 
    // 定义consume方法来模拟消费
    public void consume(int money){
        // 存款大于等于消费的金额,才能取款
        if (this.deposit >= money){
            this.deposit -=money;
        }
    }
 
    // 定义get_deposit方法来获取存款
    public int get_deposit(){
        return this.deposit;
    }
 
}
 
public class HelloJava{
    public  static void main(String[] args) {
        // 通过new来实例化一个Person对象,实参1000对应的是形参deposit
        Person kitty = new Person(1000);
        // 消费100块钱。consume方法是公有的,可以在HelloJava类中访问
        kitty.consume(100);
        // get_deposit方法也是公有的,可以在HelloJava类中访问
        System.out.println(kitty.get_deposit());
        
        // deposit属性是私有的,不能在HelloJava类中的访问
        // System.out.println(kitty.deposit);
 
        // 再实例化一个对象
        Person lohan = new Person(10000);
        // 类属性为所有对象共有,可通过lohan对象来访问类属性count
        System.out.println(lohan.count);
    }
 
}

读者请注意,类属性表示这种数据类型共有的特征,为所有对象共享,所以在上文代码实例中可通过对象名加成员操作符来访问类属性。类方法也为所有对象共享,同样可通过实例对象来访问。读者在学习面向对象时,需搞清楚类方法,类属性,对象方法,对象属性的语义,写出语义清晰的代码。

7.4.6 课后习题

(1) 简述你对构造函数的理解。

(2) 类属性和对象属性的区别是什么?在什么情况下应该使用类方法,在什么情况下应该使用对象方法?

(3) 定义一个Cat类,为其设计相应的类属性,对象属性,类方法,对象方法。

(4) 在Java中如何获得实例对象?简述类实例化的过程。

7.4.7 高薪就业班


欢迎 发表评论:

请登录

忘记密码我要注册

注册账号

已有账号?请登录