类和对象

date: 2018-12-08

什么是对象

对象是一个具体的物体或事件,例如:某一部手机、某一个人……

那么如何描述一个对象呢

某一部手机:

  • 特征:品牌、版本、手机名、尺寸、外观、CPU、GPU……
  • 功能:打电话、联网、运行软件、拍照……

某个人:

  • 特征:姓名、身高、体重、性格、爱好……
  • 行为:讲话、走路、学习、吃饭……

通过以上的举例可以看出对一个对象的描述主要由两部分组成:

  • 特征(属性)
  • 行为(功能、用途)

那么什么是类呢

在生活中,类就是对某些具有相似特征、相似行为的对象的抽象定义。而程序中的类则是将生活中的类按照一定的规则翻译而来。

程序中的类也由两个部分组成:

  • 成员变量(属性):根据对象的特征定义
  • 成员函数(方法),分为两类:
    • 构造方法:用于类的实例化,仅调用一次
    • 普通方法:根据对象的行为(功能、用途)定义

类的格式

    访问修饰符 class 类名 {
        //定义属性
        访问修饰符   数据类型  属性名;
        //构造方法
        访问修饰符  构造方法名(数据类型  参数名,...){/*...*/}
        //普通方法
        访问修饰符  返回值数据类型  方法名(数据类型 参数名,...){
            return 返回值(返回值数据类型为void时不能有返回值,且该语句可以省略);
        }
    }

访问修饰符在类或抽象类中有四种:

  • public
  • protected
  • default(可以省略)
  • private

构造方法

特点:

  • 没有返回值类型
  • 名字与类名完全相同
  • 每个对象仅能调用一次构造方法

用途:

  • 实例化一个对象
  • 用于初始化成员属性

实例化对象和调用格式

实例化对象的关键字:new

  • 实例化格式:
    • 类名 对象名 = new 类名(参数值,……)
  • 调用属性、方法的格式:
    • 对象名.属性名
    • 对象名.方法名(参数值,……)

方法重载

有时候我们会遇到某些方法的功能相似的情况,如果每个方法我们都专门起一个名字,那么使用起来会造成许多不便,所以针对这种情况,我们可以选择使用方法重载。重载支持构造方法和普通方法。

重载的条件:

  • 方法名相同(构造方法的方法名肯定相同)
  • 方法的参数个数、类型、顺序至少有一个不同(tips:返回值类型不作为条件)

重载的方法在调用时,会根据给定的参数匹配相应的方法,不需要特别声明。

例:求出两个值之间的较大值:

//不重载
public int max_int(int a, int b) {return a > b ? a : b;}
public float max_float(float a, float b) {return a > b ? a : b;}

//重载
public int max(int a, int b) {return a > b ? a : b;}
public float max(float a, float b) {return a > b ? a : b;}

可以看出第一种方法在调用时要先区别传递的参数的类型,再选择相应的函数,会给工作带来一定的额外负担,而第二种方法你只需要保证max方法支持某种数据类型的比较即可。

对象:我要调用我自己的时候怎么办

在定义类的成员方法的过程中,我们总会需要用到当前调用该方法的对象,但是上文已经讲到调用类的方法需要通过对象名来调用,而在定义方法的时候我们显然不知道对象的名字是什么,这时候就需要用到一个关键字:this。这个关键字就表示当前对象。

Java中有一个就近原则,即当一个名字被多次使用的时候,程序会根据代码的位置匹配到最近的名字,这时候就可能产生歧义,需要用到this

this的使用方法:

  • this.属性名 调用属性
  • this.普通方法名(参数值,……) 调用普通方法
  • this(参数值,……) 调用构造方法

其中第三种方法出现在构造函数中:

public class Student {
    public String name = null;
    public int score = 0;

    public Student(String name) {
        this(name, 0);    //这个构造方法没有提供score的值,我们选择初始化其为0,并通过调用另一个构造函数来实现
    }

    public Student(String name, int score) {
        this.name = name;
        this.score = score;
    }
}

个人博客:https://wilfredshen.cn/

posted @ 2020-05-08 23:27  三尺青锋丶  阅读(150)  评论(0)    收藏  举报