Java---类和对象第一节

news2024/12/27 10:31:26

目录

1.面向对象初步认识

1.1什么是面向对象

1.2面向对象和面向过程的区别

2.类的定义和使用

2.1简单认识类

2.2类的定义格式

2.3类的实例化

2.4类和对象的说明

3.this关键字

3.1访问本类成员变量

3.2调用构造方法初始化成员变量

3.3this引用的特性

4.对象的构造以及初始化

4.1就地初始化与默认初始化

4.2构造方法

4.2.1默认构造方法

4.2.2构造方法的特性:

4.2.3构造方法中,通过this调用其他构造方法


1.面向对象初步认识

1.1什么是面向对象

Java是一门纯面向对象的语言(Object Oriented Program,简称OOP),在面向对象的世界里,一切皆为对象。面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。用面向对象的思想来涉及程序,更符合人们对事物的认知,对于大型程序的设计、扩展以及维护都非常友好。

1.2面向对象和面向过程的区别

传统洗衣服:

传统洗衣服注重的是面向过程,也就是按照步骤一步一步实现,少一个步骤都不行

每一种衣服鞋子清洗的方式都不同,处理起来就比较麻烦

如果我们按这种方式去写代码,后期对代码的扩展和维护就比较麻烦

现代洗衣服:

现代洗衣服方式中总共有4个对象人,衣服,洗衣液,洗衣机

洗衣服的过程:人将衣服和洗衣液放进洗衣机,启动洗衣机

在整个洗衣服的过程中,人,衣服,洗衣液,洗衣机这4个对象交互完成了洗衣服这件事,而人并不需要关系衣服是怎么被搓干净和拧干净的

以面向对象方式来进行处理,就不关注洗衣服的过程,具体洗衣机是怎么来洗衣服,如何来甩干的,用户不用去关心,只需要将衣服放进洗衣机,倒入洗衣粉,启动开关即可,通过对象之间的交互来完成的。

注意:面向过程和面相对象并不是一门语言,而是解决问题的方法,没有那个好坏之分,都有其专门的应用场景。

2.类的定义和使用

2.1简单认识类

类是对一个实物(对象)的属性以及功能进行描述的

对比于现实生活中产品的说明书

在这个说明书里有产品的属性:产品名称,产品部件,型号等等

产品的功能:使用方法,安装,拆卸,清洁

2.2类的定义格式

java中定义一个类需要用到class关键字

class ClassName{  //ClassName为类名
    field;       // 字段(属性) 或者 成员变量
    method;      // 行为 或者 成员方法
}

类中包含的内容称为类的成员。属性主要是用来描述类的,称之为类的成员属性或者类成员变量。方法主要说明类 具有哪些功能,称为类的成员方法。

定义一个洗衣机的类

class Washer{
    public String name;  //名称
    public int size;     //大小
    public String model; //型号
    public String color; //颜色

public void function1(){     //洗衣功能
    System.out.println("洗衣功能");
}

public void function2(){     //脱水功能
    System.out.println("脱水功能");
}
}

在行业里,类名一般采用大驼峰的命名规则

2.3类的实例化

类相当于一份说明书,我们要完成某件事就需要一个这个类描述的实物来帮我们进行完成

当我们了解了这个类的功能和用途,我们就需要“买”这个类对应的产品,而“买”这个类对应的产品就叫类的实例化

用类类型创建对象的过程,称为类的实例化,在java中采用new关键字,配合类名来实例化对象。

举例:

创建一个洗衣机类的对象

类名 对象名=new 类名();
Washer washer=new Washer();

这样实例化一个对象,washer就相当于我们买回来的那个产品了

注意事项:

1.new 关键字用于创建一个对象的实例.

2.使用 . 来访问对象中的属性和方法.

3.同一个类可以创建对个实例

2.4类和对象的说明

1. 类只是一个模型一样的东西,用来对一个实体进行描述,限定了类有哪些成员.

2. 类是一种自定义的类型,可以用来定义变量.

3. 一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量

4. 做个比方,类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东 西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间

对比一下:

3.this关键字

3.1访问本类成员变量

class Student{
    private String name;
    private int age;
    private String id;
    public Student(String name,int age,String id){
        name=name;
        age=age;
        id=id;
    }
    public void show(){
        System.out.println("我是"+name+",今年"+age+"岁了,我的id是"+id);
    }
}

public class Test1 {
    public static void main(String[] args) {
        Student student=new Student("小明",18,"2024511");
        student.show();
    }
}

先来看看这段代码它的输出结果

我相信你的第一反应应该是:我是小明,今年18岁了,我的id是2024511;

输出结果是我是null,今年0岁了,我的id是null;

解释:

在这下面这段代码中

  public Student(String name,int age,String id){
        name=name;
        age=age;
        id=id;
    }

我们认为左边的name,age,id是成员变量,但实际上在这段代码中左边的name,age,id是局部变量,此时局部变量给局部变赋值,没有给成员变量赋值,成员变量的值没有改变,依然是默认值

然而当构造方法中的形参名和成员变量名不相同时,就不会出现以上情况

class Student{
    private String name;
    private int age;
    private String id;
    public Student(String n,int a,String i){
        name=n;
        age=a;
        id=i;
    }
    public void show(){
        System.out.println("我是"+name+",今年"+age+"岁了,我的id是"+id);
    }
}

public class Test1 {
    public static void main(String[] args) {
        Student student=new Student("小明",18,"2024511");
        student.show();
    }

输出结果是:我是小明,今年18岁了,我的id是2024511

想要解决形参名与成员变量名相同时给成员变量赋值的问题就需要使用this关键字,this关键字表示本类中的成员变量和成员方法

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

加上this就表示本类中的成员变量

在成员变量和局部变量重名时,优先使用局部变量,也就是就近原则。

3.2调用构造方法初始化成员变量

class Student{
    private String name;
    private int age;
    private String id;
    public Student(){
        this("haha",12,"202451101");
    }
    public Student(String name,int age,String id){
      this.name=name;
      this.age=age;
      this.id=id;
    }
    public void show(){
        System.out.println("我是"+name+",今年"+age+"岁了,我的id是"+id);
    }
}

在不带参数的构造方法中初始化成员变量,用this调用带三个参数的构造方法,直接在this后面的括号中填写对应的参数就行

在构造方法中使用this调用其他构造方法对成员变量进行初始化时this语句必须放在该构造方法的第一行

3.3this引用的特性

1. this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型

2. this只能在"成员方法"中使用

3. 在"成员方法"中,this只能引用当前对象,不能再引用其他对象

4. this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法 对象的引用传递给该成员方法,this负责来接收 在代码层面来简单演示--->注意:下图右侧中的Date类也是可以通过编译的

4.对象的构造以及初始化

4.1就地初始化与默认初始化

在Java方法内部定义一个局部变量时,必须要初始化,否则会编译失败。

   public static void main(String[] args) {
        int a;
        System.out.println(a);
    }
//运行结果:java: 可能尚未初始化变量a

所以在创建局部变量时需要在使用变量之前对变量进行初始化

但是在创建类时,对类进行实例化后调用成员变量时我们会发现,编译器没有报错,这是为什么呢?

class Date{
    private int year;
    private int month;
    private int day;
private String zodiac;
    public void setDate(int y, int m, int d) {
        year = y;
        month = m;
        day = d;
    }
    public void show(){
        System.out.println("year:"+year+" month:"+month+" day: "+day+" zodiac"+zodiac);
    }
}

public class Test01 {
    public static void main(String[] args) {
        Date date=new Date();
        date.show();
    }
}

这是因为我们在实例化对象时,编译器默认的给我成员变量赋值了

当然我们不需要默认初始化的值可以就地初始化,也就是创建类的时候就给成员变量赋值

class Date{
    private int year=2024;
    private int month=5;
    private int day=12;
}

4.2构造方法

构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。

4.2.1默认构造方法

class Date{
    private int year=2024;
    private int month=5;
    private int day=12;
    
    // 构造方法:
    // 名字与类名相同,没有返回值类型,设置为void也不行
    // 一般情况下使用public修饰
    // 在创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次
    public Date(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }

    public void show(){
        System.out.println("year:"+year+" month:"+month+" day: "+day);
    }
}

当我们实例化对象时下面这样写会报错

这是为什么呢,我们没写构造方法前是对的,反而写了就错了。难道我们写的代码有问题?

这是因为编译器有一个就穷不救急的性格,当我们没有构造方法时,他会提供一个默认的构造方法,当我们写了构造方法,他就不提供默认的构造方法了,如果想使用默认的构造方法就必须自己在类里面写一个

  public Date(){
        
    }

添加一个这样的类就行了,方法体什么都不写

4.2.2构造方法的特性:

1. 名字必须与类名相同

2. 没有返回值类型,设置为void也不行

3. 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次(相当于人的出生,每个人只能出生一次)

4. 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)

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

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

上述两个构造方法:名字相同,参数列表不同,因此构成了方法重载。

4.2.3构造方法中,通过this调用其他构造方法

在构造方法中,可以通过this调用其他构造方法来简化代码

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

    public Date(int year, int month) {
        this.year = year;
        this.month = month;
    }
    
    public Date(){
this(1900,2,12);
    }

在构造方法中使用this调用其他构造方法时,要注意在这个构造方法中方法的重载问题

public Date(){
        
}
    public Date(){
this(1900,2,12);
    }

比如这样,我们写的默认构造方法和this的构造方法形参一样,编译器就会报错

注意:

1.this在构造方法中必须是第一条语句

2.this调用其他构造方法时不能成环

public Date(){
   this(1900,1,1);
}
 
public Date(int year, int month, int day) {
   this();
}

无参构造器调用三个参数的构造器,而三个参数构造器有调用无参的构造器,形成构造器的递归调用
编译报错:Error:(19, 12) java: 递归构造器调用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1666813.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

国内有哪些知名的网络安全厂商?

首先就是360,这个我相信大家并不陌生了吧,你的电脑装过360么? 360在个人终端服务那是妥妥的扛把子,但是在企业服务里虽然有他们的身影却略显不足。 第二个就是深信服,网络安全的老牌大佬,业务覆盖了全球5…

什么是XXE漏洞,日常如何做好web安全,避免漏洞威胁

随着网络技术的不断发展,网站安全问题日益受到人们的关注。当前随着技术发展,网站存在一些常见的可能被攻击者利用的漏洞,而在众多网站安全漏洞中,XXE(XML External Entity)漏洞是一个不容忽视的问题。今天…

linux性能监控之slabtop

slabtop命令是以实时的方式显示内核slab缓冲区的细节信息&#xff0c;是linux自带的命令 [rootk8s-master ~]# slabtop --helpUsage:slabtop [options]Options:-d, --delay <secs> delay updates-o, --once only display once, then exit-s, --sort <char&…

【WEEK11】 【DAY6】员工管理系统第七部分【中文版】

2024.5.11 Saturday 接上文【WEEK11】 【DAY5】员工管理系统第六部分【中文版】 目录 10.8.删除及404处理10.8.1.修改list.html10.8.2.修改EmployeeController.java10.8.3.重启10.8.4. 404页面处理10.8.4.1.把404.html文件移入10.8.4.2.重启并运行 10.8.5.退出登录状态10.8.5.1…

51基于单片机的温室大棚系统设计

设计摘要&#xff1a; 本设计旨在基于51单片机和蓝牙技术&#xff0c;实现一个功能完善的温室大棚系统。该系统具备以下主要功能&#xff1a;首先&#xff0c;通过连接的显示屏能够实时地显示当前的温度和湿度信息&#xff0c;方便用户了解温室内的环境变化。其次&#xff0c;…

Codeforces Round 605 (Div. 3) A~D

本人水平不高&#xff0c;开这个专栏主要是督促自己补题&#xff0c;有些题对目前的我来说还比较难&#xff0c;还补不动&#xff0c;等以后能力上来了再补。。。 原题链接&#xff1a;Dashboard - Codeforces Round 605 (Div. 3) - Codeforces 目录 A. Three Friends B. Sn…

✨✨使用vue3打造一个el-form表单及高德地图的关联组件实例✨

✨1. 实现功能 &#x1f31f;表单内显示省市县以及详细地址 点击省市县输入框时&#xff0c;打开对应地图弹窗&#xff0c;进行位置选择选择位置回显入对应输入框表单内的省市县以及地址输入框同外嵌表单走相同的校验方式触发校验后点击reset实现清除校验与清空数据 &#x1f…

Web开发小知识点(二)

1.关于取余 我在Dart语言里&#xff08;flutter项目&#xff09; int checkNum (10 - 29) % 10; 那么checkNum等于1 但是在Vue项目里 const checkNum (10 - 29) % 10;却等于-9 语言的特性不同&#xff0c;导致结果也不同&#xff0c;如果要想和Dart保持一致&#xff0c;…

Task Office for Mac v9.0激活版:任务管理新境界

还在为繁琐的任务管理而烦恼吗&#xff1f;Task Office for Mac为您带来全新的任务管理体验。简洁明了的界面设计&#xff0c;让您轻松上手&#xff1b;强大的任务管理和项目管理功能&#xff0c;让您轻松掌握任务进度&#xff1b;多用户协作功能&#xff0c;让团队协作更加高效…

自定义实现 Java17+SpringBoot3+OpenAPI+Knife4j Starter

文章目录 前言正文1 创建starter项目1.1 依赖文件1.2 配置信息 2 自定义starer代码开发2.1 配置字段的定义2.2 自动配置类 3 验证starter3.1 测试项目的配置3.2 功能配置 application.yml3.3 测试代码3.3.1 实体类3.3.2 控制器13.3.2 控制器2 4 效果展示4.1 主页4.2 实体类列表…

day08-面向对象高级

1.代码块 1.1代码块引出 有时我们在使用构造方法时&#xff0c;除了进行属性的初始化外还需要使用一些其他的语句&#xff0c;以便更好的实现程序的功能&#xff0c;比如添加一些输出语句&#xff1b; 1.2 局部代码块 public void show(){System.out.println("show&quo…

Line Buffer概述

buffer在芯片物理上一般指的是SRAM&#xff0c;也可以指寄存器组。buffer的作用是用来在逻辑芯片上暂时存储数据&#xff0c;但不会是大量的数据。如果是大量数据一般会使用DRAM&#xff08;典型的指DDR&#xff09;作为存储芯片&#xff0c;用来存储大密度数据。line buffer可…

物流单打印机怎么调格式距离,佳易王物流托运单管理系统软件打印单据左边距调节教程

物流单打印机怎么调格式距离&#xff0c;佳易王物流托运单管理系统软件打印单据左边距调节教程 一、前言 以下软件操作教程以&#xff0c;佳易王物流单打印管理软件为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、佳易王物流单管理系统打印…

先进电机技术 —— 控制策略综述

一、先进电机控制策略综述 电机控制策略随着电力电子技术和微处理器技术的发展而日趋丰富和完善&#xff0c;各种先进的控制方法被广泛应用于直流电动机、交流电动机&#xff08;同步电机、感应电机&#xff09;等多种电机类型。下面是对几种主要先进电机控制策略的概述&#x…

ExcelVBA在选择区域(有合并)中删除清除空行

【问题】 关于删除空行&#xff0c;以前是用函数来完成工作的&#xff0c; 今天有人提出问题&#xff0c;传来这个文件&#xff0c; 现有数据&#xff0c;1w多行&#xff0c;其中有部分列有不同合并单元格&#xff0c;跨行也不一样。如果要进行筛选删除空行&#xff0c;有一定的…

工程师工具箱系列(1)MapStruct

文章目录 工程师工具箱系列&#xff08;1&#xff09;MapStruct芸芸众生初窥门径引入POM依赖创建转换器与方法进行使用IDEA好基友 游刃有余示例说明避免编写重复转换器实现复杂灵活转换 温故知新 工程师工具箱系列&#xff08;1&#xff09;MapStruct 芸芸众生 在Java项目开发…

2024年深圳市教师招聘报名流程(建议电脑)

2024年深圳市教师招聘报名流程&#xff08;建议电脑&#xff09; #深圳教师招聘 #深圳教招 #深圳教师招聘考试 #教师招聘报名照片处理 #深圳教师招聘笔试

法语语式与时态总结,柯桥零基础学法语

常用语式 法语中的常用语式分为&#xff1a;直陈式、条件式、虚拟式、命令式、不定式与分词式。 直陈式&#xff08;lindicatif&#xff09;初学法语时首先就要学直陈式&#xff0c;也是最常用的语式&#xff0c;表示确实发生的动作。 条件式&#xff08;le conditionnel&am…

动态规划----股票买卖问题(详解)

目录 一.买卖股票的最佳时机&#xff1a; 二.买卖股票的最佳时机含冷冻期&#xff1a; 三.买卖股票的最佳时期含⼿续费&#xff1a; 四.买卖股票的最佳时机III: 五.买卖股票的最佳时机IV: 买卖股票的最佳时机问题介绍&#xff1a;动态规划买卖股票的最佳时机是一个经典的…

LeetCode 题目 119:杨辉三角 II

作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任字节跳动数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python&#xff0c;欢迎探讨交流 欢迎加入社区&#xff1a;码上找工作 作者专栏每日更新&#xff1a; LeetCode解锁1000题…