Java必备基础二——类和对象

一、类和对象的概述

类和对象是面向编程的核心。类用于描述客观世界中的某一类对象的共同特征;而对象是类的具体实例。了解一个完整的Java程序之前,先搞清几个名词。

1.什么是对象?

  • 官方解释:对象是把数据及其相关方法封装在一起构成的实体。数据是对象的属性(又称成员变量),方法是作用在数据上的操作,用来实现特定的功能。一个对象的属性值决定了对象的状态,对象的操作方法决定了对象的行为能力。
  • 把个体比作一个对象,个体身上的体重,身高,三观,成绩等等是这个对象的属性(即这个个体的成员变量),个体想要变得更加优秀,于是个体决定花大量的时间去学习(方法)以此提高自己的成绩(属性),即对象使用方法作用在数据上的操作,实现了成绩变好(功能)。

2.什么是类?

  • 官方解释:现实中的任何对象都是属于某个类的,类用于描述多个对象的共同特征,是一种抽象的数据类型,在Java中创建了一个类,就是创建了一个新的数据类型,由这种类型所定义的变量统称为引用变量,即类是引用类型。
  • 在程序中,类只定义一次,但可创建类的一个或多个对象。比如,互联网行业的公司是一个类,由这个类创建出诸如BAT这样的一些公司,这些个体(对象)又可以抽象成概念互联网的公司(类)。

3.什么是构造器?

  • 解释:构造器是一种特殊的方法,每个类都有构造器,构造器又叫构造方法,构造器用于构造该类的实例,Java语言通过new关键字来调用构造器完成对象的实例化,构造器的作用在于实例化对象,使编写的类转化为对象可用。
  • 构造器种类:默认构造方法,根据自定义构造方法
  • 构造方法的特性:
    1.构造方法的方法名必须与类名完全一致;
    2.构造方法不能有返回值,构造方法主要作用是初始化对象
    3.构造方法在实例化(new)对象时被调用
    4.默认构造方法没有参数,方法体为空
    5.一个类可以有多个构造方法
    6.如果类中没有定义构造方法,编译器会自动提供默认构造方法,如果类中 有自定义的构造方法,Java在编译时就不会自动加上默认构造方法

4.类和对象的联系

前面已经说到,类表示一个共性的抽象的引用类型(额外补充,引用类型与基本数据类型最大不同之处在于,引用类型需要内存的分配和使用,String也是一种常用的引用类型),对象表示一个独立的个体

  • 类是对象的模板,对象是类的实例
  • 类只用通过对象才可以使用,即类必须要“实例化”得到对象
  • 类不能直接使用,对象才能直接使用

二、类和对象的定义和使用

学习了诸多概念知识,接着结合代码来看。

1.如何创建类?

(1)定义一个类的简单语法
在这里插入代码片
[修饰符] class 类名{
      零个或多个变量(数据字段)
      零个或多个构造器
      零个或多个方法
}

举例:

/**
 * 定义人类
 */
class People {
 //数据字段
    int age;
    String name;
    
    People() {
        //默认的构造方法
    }

    //自定义的构造方法
    People(int a) {
        age = a;
    }
    
    //void声明函数无参数,无返回值
    void selfInfo(String string) {
        System.out.println("我的年纪是" + age);
        System.out.println("我的名字是" + name);
        System.out.println(string);
    }
}
(2)说明
  • 类前面的修饰符可以是public、final、abstract,也可以缺省(不加)
  • class是定义类的关键字
  • 类名要符合标识符的命名规则(大驼峰:单词首字母大写其余小写;数字、字母、_、$组成,数字不能在开头)
  • 类体部分可以定义多个成员变量,构造器用于构造该类的实例,Java语言通过new关键字调用构造器实例化类的一个或多个对象,格式如下
类名称 对象名称 = new 类名([实参列表];
  • 上述代码还不能使用,因只定义了类还未能创建和使用对象

2.如何创建与使用对象?

(1)定义对象的语法

需要用到上面的一个概念:实例化对象。
类是引用数据类型,类定义完后是无法直接使用的,要使用就要将类转化为对象,如何转化,需要先声明对象,再实例化对象:

类名称 对象名称;
对象名称 = new 类名([实参列表];
People p;									//声明
p= new People();							//实例化

等同于

类名称 对象名称 = new 类名([实参列表];
People p = new People();

引用对象成员变量的格式为:

对象名.属性;
p.name = "李红";

引用对象方法的格式为:

对象名.方法名([实参列表]);
p.seifInfo();

举例

public class ExamplePrac2 {

    public static void main(String[] args) {

        People p1 = new People(); 		//实例化对象1
        People p2 = new People();		//实例化对象2
        p1.age = 1;						//引用对象成员变量			
        p2.age = 2;
        p1.name = "李红";
        p2.name = "王明";
        p1.selfInfo();//引用对象方法	
        p2.selfInfo("");
    }
}

/**
 * 定义人类
 */
class People {
    int age;
    String name;

    People() {
        //默认的构造方法
    }

    //自定义的构造方法(即方法的重载 )
    People(int a) {
        age = a;
    }

    People(String n) {
        name = n;
    }
    
    //void声明函数无参数,无返回值
    void selfInfo(String string) {
        System.out.println("我的年纪是" + age);
        System.out.println("我的名字是" + name);
    }
}

(2)说明
  • 一个源程序Java可由多个class类组成,只能有一个修饰符为public的类,此时的文件名必须要与该类名一致(如果一个类中包含了main方法,那么只能是这个类被public修饰)
  • 解释引用类型为什么需要用new关键字实例化对象:
    前面已经谈到类是引用类型,引用类型需要内存的分配和使用,new的主 要功能就是分配内存空间、返回对象引用、调用构造函数
  • 从内存的角度分析为什么要实例化对象,首先,明确内存空间概念:
    1.堆内存:保存对象的属性内容
    2.栈内存:保存堆内存的地址 ,只有写在栈内存中数据才能保存成功。
    3.栈内存和堆内存两者关系:一个对象可指向一个堆内存,多个对象可指向一个堆内存,一个栈堆存不能有多个堆内存给之分配
    如:
    在这里插入图片描述
    未new对象时,内存分配方式:
    在这里插入图片描述

可以看出堆内存中写入的是空值,一般未new对象时,系统运行后会抛出空指针异常

Exception in thread "main" java.lang.NullPointerException
	at com.company.ExamplePrac2.main(ExamplePrac2.java:14)

用了new关键字后,系统会分配内存空间给栈
在这里插入图片描述

3.如何创建构造器

(1) 定义构造器的语法
类名{
    类名(自定义参数){
    }
}

举例

class People {
    int age;
    String name;

    People() {
        //默认的构造方法
    }

    //自定义的构造方法(即方法的重载 )
    People(int a) {
        age = a;
    }

    People(String n) {
        name = n;
    }
}
(2)说明
  • 如上详见什么是构造器
  • 构造方法可重载:重载是方法名称相同,自定义参数的类型可不同,参数个数可不同,参数个数相同下参数顺序不同
  • 与返回值,修饰符无关

完整代码

/**
 * @Author: 
 * @Time: 2021/6/17 14:31
 * @Description 创建与使用对象练习
 */
public class ExamplePrac2 {

    public static void main(String[] args) {

        People p1 = new People();
        People p2 = new People();
        p1.age = 1;
        p2.age = 2;
        p1.name = "李红";
        p2.name = "王明";
        p1.selfInfo("Java语言简单易学");
        p2.selfInfo("");
        People p3 = new People(1, "李红"); //调用带两个参数的方法创建对象p3
        p3.selfInfo("Hello Word");

    }
}

/**
 * 定义人类
 */
class People {
    int age;
    String name;

    People() {
        //默认的构造方法
    }

    //自定义的构造方法(即方法的重载 )
    People(int a) {
        age = a;
    }

    People(String n) {
        name = n;
    }

    People(String n, int a) {
        name = n;
        age = a;
    }

    People(int a, String n) {
        name = n;
        age = a;
    }

    //void声明函数无参数,无返回值
    void selfInfo(String string) {
        System.out.println("我的年纪是" + age);
        System.out.println("我的名字是" + name);
        System.out.println(string);
    }
}

输出结果:

我的年纪是1
我的名字是李红
Java语言简单易学
我的年纪是2
我的名字是王明

我的年纪是1
我的名字是李红
Hello Word

Process finished with exit code 0

三、总结

学习新东西为提高效率,可先对不懂的概念进行拆解分析,本文思路即先从对象、类、构造器三个概念开始,接着再用代码具体分析概念,最后总结自己的想法和说明重点。对于复杂化的概念也可尝试使用此思路去学习。

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值