第一节:Java类和对象之面向对象定义实例化this引用和对象的构造

Posted 快乐江湖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第一节:Java类和对象之面向对象定义实例化this引用和对象的构造相关的知识,希望对你有一定的参考价值。

文章目录

一:面向对象与面向过程

关于这个话题我真的不想再多说了(说的实在太多了),虽然面向对象的定义很简短,但是要真正理解它却是很困难、抽象的,你需要多写代码,都做项目才能真正体会到。相关内容都在软件工程这门课中阐述,专栏链接如下,大家可以自行学习。当然,即便一知半解也是没有关系的,它不影响后面我们的学习,只是因为Java作为一门纯面向对象语言,了解了解还是挺有必要的

二:Java类的定义

  • 一个java文件建议就定义一个类
  • public所修饰的类其类名必须和文件名一致
  • main方法所在类一般使用public修饰

(1)什么是类

:面向对象方法学中类是对一组有相同数据和相同操作的对象的定义,是对象的模板,其包含的方法和数据描述一组对象的共同行为和属性。类是在对象之上的抽象,对象则是类的具体化,是类的实例

例如人(Human)就是一个类,所有人都会具有一些相同的属性和行为

  • 属性:姓名、年龄等
  • 行为:睡觉、吃饭等

(2)类定义格式

在Java中,定义一个类的格式如下,注意

  • class:是定义类的关键字
  • ClassName:是类名,采用“大驼峰”式命名方法,命名要见名思义
  • :类主体
class ClassName
	//属性(成员变量)
	//行为(成员方法)

如下定义一个“洗衣机”类,用于描述洗衣机

class WashMachine
    //成员变量
    public String brand;//品牌
    public String type;//型号
    public String weight;//重量
    public String length;//长
    public String width;//宽
    public String height;//高
    public String color;//颜色
    
    //成员方法
    public void WashCloths()
        //洗衣服功能
    
    public void DryCloths()
        //脱水功能
    
    public void SetTime()
        //定时功能
    

三:Java类实例化

实例化:和int、double一样,类只是一种类型,它并不占用空间,就像一个房屋图纸一样,它并不是真实存在的房屋。使用类创建对象的过程称之为实例化,Java会借助关键字new来实例化对象

  • 使用.可以访问对象中的属性和方法
  • 同一个类可以创建多个实例

例如下面“狗”类可以实例化出不同的对象,这些对象在属性或行为上会有不同

class PetDog 
    public String name;//名字
    public String color;//颜色

    public void barks() 
        System.out.println(name + ":旺旺旺");
    

    public void wag() 
        System.out.println(name + ":摇尾巴");
    



public class TestDemo 
    public static void main(String[] args) 
        PetDog dogHuang = new PetDog();
        PetDog dogHei = new PetDog();
        dogHuang.name = "阿黄";
        dogHuang.color = "黄色";
        dogHei.name = "阿黑";
        dogHei.color = "黄色";
        dogHuang.barks();
        dogHuang.wag();
        dogHei.barks();
        dogHei.wag();
    

四:this引用

(1)两个问题

如下是一个日期类Date()

  • setDate()方法:用于设置年月日
  • showDate()方法:用于显示年月日
public class Date 
    public int _year;
    public int _month;
    public int _day;

    public void setDate(int year, int month, int day)
        _year = year;
        _month = month;
        _day = day;
    
    public void showDate()
        System.out.println(_year + " " + _month + " " + _day);
    
    public static void main(String[] args) 
        Date d1 = new Date();
        Date d2 = new Date();
        Date d3 = new Date();

        d1.setDate(2012, 12, 12);
        d2.setDate(2022, 11, 1);
        d3.setDate(2018, 2, 27);

        d1.showDate();
        d2.showDate();
        d3.showDate();
    

上面写法存在如下两个问题

①:如果形参和成员变量同名该怎么办,到底谁在给谁赋值

  • 修改后,形参是局部变量,其优先级会高于成员变量,所以你看到变量均为形参
    public void setDate(int _year, int _month, int _day)
        _year = _year;
        _month = _month;
        _day = _day;
    

②:成员方法中并没有关于对象的说明,但是方法在调用时却正确无误地打印了该对象的数据

  • 换句话说:面向对象方法学规定,属性是对象私有的,但是方法是公有的,只有一份,供所有对象使用。因此在这样的情况下问题就在于公用的成员方法是如何区分不同的对象的变量的
  • 如果你还觉得不好理解可以这样想:成员方法本质仍是方法,是方法它就有地址,也就说除了使用对象去调用方法外,我还可以使用地址直接去调用,那么在这种情况下这个方法它是怎么知道谁调用的自己

(2)this引用

this引用:该引用会指向当前对象,对于成员方法中所有关于成员变量的操作,都会通过this引用访问,它是自动传入的,无需用户干预

如下当形参和成员变量相同时,需要显式的写出this进行区分

public class Date 
    public int year;
    public int month;
    public int day;

    public void setDate(int year, int month, int day)
        this.year = year;
        this.month = month;
        this.day = day;
    
    public void showDate()
        System.out.println(this.year + " " + this.month + " " + this.day);
    
    public static void main(String[] args) 
        Date d1 = new Date();
        Date d2 = new Date();
        Date d3 = new Date();

        d1.setDate(2012, 12, 12);
        d2.setDate(2022, 11, 1);
        d3.setDate(2018, 2, 27);

        d1.showDate();
        d2.showDate();
        d3.showDate();
    

可以通过调试发现这个传递的过程

五:对象的构造

前面的学习中,为了方便讲述,我们会使用这样的“构造”方式,但是它存在一些问题

  • 创建好对象之后还需要使用方法进行赋值,显得很麻烦
  • 下面类中局部变量为什么没有给初值也能正确编译
public static void main(String[] args) 
	Date d = new Date();
	d.printDate();
	d.setDate(2021,6,9);
	d.printDate();


(1)构造方法

构造方法:这是每个类中都会存在的一个特殊的成员方法,它有如下特点

  • 方法名和类名一致
  • 没有返回值(不能写成void)
  • 对象在创建时编译器自动调用
  • 整个对象的生命周期内只会调用一次

如下

public class Date 
    public int year;
    public int month;
    public int day;

    //构造方法
    public Date(int year, int month, int day)
        this.year = year;
        this.month = month;
        this.day = day;
        System.out.println("构造方法被调用");
    
    public void showDate()
        System.out.println(this.year + " " + this.month + " " + this.day);
    
    public static void main(String[] args) 
        Date d = new Date(2022, 7, 6);
        d.showDate();
    

(2)构造方法重要特性

  • 除了前面说到的几个特点,构造方法还具有如下重要特性

①:构造方法支持重载

public class Date 
    public int year;
    public int month;
    public int day;

    //无参构造方法
    public Date()
        this.year = 2000;
        this.month = 1;
        this.day = 1;
        System.out.println("无参构造方法被调用");

    

    //带有参数的构造方法
    public Date(int year, int month, int day)
        this.year = year;
        this.month = month;
        this.day = day;
        System.out.println("带有参数的构造方法被调用");
    
    public void showDate()
        System.out.println(this.year + " " + this.month + " " + this.day);
    
    public static void main(String[] args) 
        //带有参数的
        Date d1 = new Date(2022, 7, 6);
        d1.showDate();

        //无参
        Date d2 = new Date();
        d2.showDate();
    

②:如果你没有显式的给出构造函数,那么编译器就会默认生成一份,而且是无参的

  • 一旦用户定义,编译器不再生成
  • 在这个默认构造函数中,像这种基本类型int就会被赋值为默认值0
public class Date 
    public int year;
    public int month;
    public int day;

    public void showDate()
        System.out.println(this.year + " " + this.month + " " + this.day);
    
    public static void main(String[] args) 
        Date d1 = new Date();
        d1.showDate();
    

③:在构造方法中,可以使用this()调用其他构造方法,但要注意

  • this()语句必须在构造方法中必须为第一条语句
  • 不能形成环形调用
public class Date 
    public int year;
    public int month;
    public int day;

    //无参构造
    public Date() 
        this(1999, 1, 1);//会调用带有三个参数的
    

    public Date(int year, int month, int day) 
        this.year = year;
        this.month = month;
        this.day = day;
    

    public void showDate()
        System.out.println(this.year + " " + this.month + " " + this.day);
    
    public static void main(String[] args) 
        Date d1 = new Date();
        d1.showDate();
    

以上是关于第一节:Java类和对象之面向对象定义实例化this引用和对象的构造的主要内容,如果未能解决你的问题,请参考以下文章

java基础-类和对象详解

python之面向对象

类和对象(上)

类和对象(上)

067Java面向对象之不实例化对象报错

21面向对象