详解类和对象

1.面向对象是什么?

1.1 面向对象程序设计(Object Oriented Programming,OOP),是一种以对象为核心的新的编程思想,在它之前还有一种以过程为中心的编程思想叫面向过程的程序设计(Procedure-Oriented Programming,POP)
1.2 面向对象的三大特性:

封装、继承、多态。

1.3 面向对象和面向过程的区别:

1.面向过程:就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现。
例如:求班级学生平均分,做法是:

  • 第一步:计算班级总分
  • 第二步:计算平均分
  • 第三步:输出平均分

2.面向对象:先分析有什么对象,对象有什么属性(数据)和方法(操作)
例如:求班级学生平均分,做法是:

  • 分析有什么对象:有班级对象,还有学生对象
  • 学生对象有什么属性:姓名,分数;没有方法
  • 班级有什么属性:多名学生;方法:计算平均分

这其中的对象、属性、方法分别是什么呢?

2.对象简介

2.1 什么是对象?

  • 万事万物皆对象
  • 生活中的对象:李逵,林冲,我的办公桌,他的电脑
  • 程序中的对象:登录按钮,我今天的第一个订单,我的账号
  • 对象强调的是一个具体的个体

2.2 对象是由什么构成的?

  • 对象由状态行为构成。
  • 对象的状态是指对象的数据,对象的状态由变量表示,也叫对象的属性。(学生名字,年龄,身高,性别等。)
  • 对象的行为是指对象的功能,对象的行为由方法表示。(学生做作业,走路、吃饭、唱歌等行为。)

2.3 对象是怎么创建的

  • 对象是由类实例化时创建的,因此创建对象必须先定义类。
  • 类是对象的模板,类中定义了什么属性和方法,由这个类实例化的对象就有什么属性和方法。
  • 类是一次性定义,对象可以多次创建。

3.类简介

3.1 什么是类

1.类是具有相同的状态和相同的行为的一组对象的集合。
2.类与对象的关系:
  • 类是对某一类事物的描述,是抽象的、概念上的定义;对象是实际存在的该类事物的个体,因而也称实例(Instance)。类和对象就如同概念和实物之间的关系一样,类就好比是一个模板,而对象就是该模板下的一个实例。
  • 比如动物就是一个类,而动物中中特指的猫、狗、鸡、鸭等就是对动物这个类的具体化就叫对象。
  • 类和对象不是不变的,而是在不同环境下有不同的代表。又比如用猫来说,在这儿猫又是一个类了,而我家的那只猫或是加菲猫等才是对象。
  • 总言之就是一个概念上和一个具体的个体之间的关系。

3.2 类的定义

语法:
public class 类名 {
    //可编写0至n个属性
    数据类型 变量名1;
    数据类型 变量名2;
    
    //可编写0至n个方法
    修饰符 返回值类型 方法名(参数){
        执行语句;
    }
}
注意:
  • public类的类名必须和类所在文件的文件名一致
  • 如果不是public类,那么类名与类所在的文件名可以不一致
  • 一个类中必须得有一个public类,且只能有一个
  • 类名的命名规范是:帕斯卡命名法
示例
public class Student {
    //类的属性(类的状态)
    String name; 
    int score;
    String no;
    //类的方法(类的行为)
    public void play(){
        System.out.printf("我的名字是%s,我的成绩是%d,我的学号是%s",name,score,no);
    }
}

4.实例化对象

4.1.概念

通过类创建对象的过程称为类的实例化。实例化的结果是产生了一个实例,实例也叫对象。

4.2.语法

new就是实例化的意思,new也是分配内存的意思

类名 对象名 = new 类名();
4.3.示例
Student s1 =new Student();  //s1就是一个对象
Student s2 =new Student(); //s2也是一个对象
4.4.对象的内存分配

5.使用对象

5.1 对象调用属性和方法是使用成员运算符.来完成的
5.2 对象调用属性
        Student s1 =new Student();
        s1.name="张三";
        s1.score=78;
        s1.no="123456";

        Student s2 =new Student();
        s2.name="李四";
        s2.score=98;
        s2.no="123455";
5.2 对象调用方法
    public class Test {
    public static void main(String[] args) {
        Student s1 =new Student();
        s1.name="张三";
        s1.score=78;
        s1.no="123456";
        s1.play();

        Student s2 =new Student();
        s2.name="李四";
        s2.score=98;
        s2.no="123455";
        s2.play();
    }
}

运行结果:
注:

一般一个类写一个文件,如我的学生类是一个文件,测试类是一个文件。

通过刚刚的例子会发现每实例化一个对象时都需要通过多象名去调用相应的属性后再去赋值比较麻烦,那有没有简化一点的方法呢?

6.构造方法

6.1.什么是构造方法呢?

1.构造方法,是一种特殊的方法,它是一个与类同名的方法。对象的创建就是通过构造方法来完成,其功能主要是完成对象的初始化。当类实例化一个对象时会自动调用构造方法。

2.构造方法也叫构造函数,或者叫构造器

3.定义
  1. 构造方法的方法名必须与类名相同
  2. 构造方法没有返回值,也不写void
4.实例
class Student {
    //构造方法
    Student(){

    }
}

6.2构造方法的作用

构造方法的作用:为对象的属性初始化。
public class Test {
    public static void main(String[] args) {
        Student s1 =new Student("张三",99,"123456");
        s1.play();

        Student s2 =new Student("李四",89,"123455");
        s2.play();
    }
}
结果:
其实上面的例子中如果我们不使用对象相应的属性赋值也可以。
public class Test {
    public static void main(String[] args) {
        Student s1 =new Student();
        s1.play();

        Student s2 =new Student();
        s2.play();
    }
}

此时的结果:



那么这些默认值是哪儿来的呢?其实在运行时系统会自动帮我们补上一个默认构造函数。

6.3默认构造函数:

一个类如果没有显示的定义构造函数,那么这个类默认具有无参的构造函数。
默认构造函数为对象的属性赋默认值。
示例

public class Student {
    String name;
    int score;
    String no;
    //类的方法(类的行为)
    public void play(){
        System.out.printf("我的名字是%s,我的成绩是%d,我的学号是%s",name,score,no);
        System.out.println();
    }
    
}
public class Test {
    public static void main(String[] args) {
        Student s1 =new Student();
        s1.play();

        Student s2 =new Student();
        s2.play();
    }
}

结果:
  • 因为本例中没有定义构造函数,系统会自动添加一个默认构造函数,默认构造函数是无参的,会为所有的属性赋默认值,因此name是null,score是0,no是null。
注:一旦类中写了构造函数,那么就没有构造函数。

例如

import java.util.Arrays;

public class Student {
    String name;
    int score;
    String no;
    //类的方法(类的行为)
    public void play(){
        System.out.printf("我的名字是%s,我的成绩是%d,我的学号是%s",name,score,no);
        System.out.println();
    }

    public Student(String name, int score, String no) {   //带三个参数的构造函数
        this.name = name;
        this.score = score;
        this.no = no;
    }
}
public class Test {
    public static void main(String[] args) {
        Student s1 =new Student("张三",99,"123456");
        s1.play();

        Student s2 =new Student("李四",89,"123455");
        s2.play();
    }
}
结果:
但此时新的问题又出现了:我只输出姓名和成绩,不输出学号,但是play()方法里又必须得输出学号,此时咋办呢?

7.方法重载(overload)

7.1概念

  • 方法重载是指在一个中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的个数。调用重载方法时,Java编译器能通过检查调用的方法的参数类型和个数选择一个恰当的方法。
  • 方法重载通常用于创建完成一组任务相似但参数的类型或参数的个数或参数的顺序不同的方法。
  • Java的方法重载,就是在类中可以创建多个方法,它们可以有相同的名字,但必须具有不同的参数,即或者是参数的个数不同,或者是参数的类型不同。
  • 调用方法时通过传递给它们的不同个数和类型的参数,以及传入参数的顺序来决定具体使用哪个方法。

7.2定义:

在同一个类中方法名相同,参数不同,与返回值类型无关

7.3运用:

1.就拿构造函数赋初始值问题来说明。
实例
public class Student {
    String name;
    int score;
    String no;
    //类的方法(类的行为)
    public void play(){
        System.out.printf("我的名字是%s,我的成绩是%d,我的学号是%s",name,score,no);
        System.out.println();
    }

    public Student() {  //1.无参构造函数  注意:不是默认构造函数,此时已经没有默认构造函数了
    }

    public Student(String name) {  //2.带一个参数的构造函数
        this.name = name;
    }

    public Student(String name, int score) {  //3.带两个参数的构造函数
        this.name = name;
        this.score = score;
    } 
    public Student(String name, int score, String no) {   //4.带3个参数的构造函数
        this.name = name;
        this.score = score;
        this.no = no;
    }

里面的1、2、3、4就是方法重载的运用,想要需要给几个数据赋初始值就调用带几个参数的构造方法。

public class Test {
    public static void main(String[] args) {
        Student s1 =new Student();  //啥都不知道就调用无参构造方法
        s1.play();

        Student s2 =new Student("张三");  //需要给1个赋初始值就调用带1个参数的构造方法
        s2.play();

        Student s3 =new Student("张三",90);  //需要给2个赋初始值就调用带2个参数的构造方法
        s3.play();

        Student s4 =new Student("张三",90,"123456");  //需要给3个赋初始值就调用带3个参数的构造方法
        s4.play();
    }
}
结果
2 6.3中结尾的问题
示例
public class Student {
    //类的方法(类的行为)
             //重载1
    public void play(String name){
        System.out.printf("我的名字是%s",name);
        System.out.println();
    }
           //重载2
    public void play(String name,int score){
        System.out.printf("我的名字是%s,我的成绩是%d",name,score);
        System.out.println();
    }
            //重载3
    public void play(String name,int score,String no){
        System.out.printf("我的名字是%s,我的成绩是%d,我的学号是%s",name,score,no);
        System.out.println();
    }
}
public class Test {
    public static void main(String[] args) {
        Student s1 =new Student();
        s1.play("张三");
        s1.play("张三",90);
        s1.play("张三",90,"123456");
    }
}
结果
image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容