当前位置: 首页 > article >正文

零基础Java第十期:类和对象(一)

目录

一、拜访对象村

1.1. 什么是面向对象 

1.2. 面向对象与面向过程 

 二、类定义和使用

2.1. 类的定义格式 

2.2. 类的定义练习

三、类的实例化

3.1. 什么是实例化 

3.2. 类和对象的说明

 四、this引用

4.1. 什么是this引用 

4.2. this引用的特性 


一、拜访对象村

       在之前的代码中,我们都是main()方法中执行,但这都是面向过程的。从这一起开始,博主将待大家离开过程化的编程世界,建立起自己的对象。注意:一旦进入对象村,你就再也不想回头。

1.1. 什么是面向对象 

       在对象村里面,一切皆为对象。面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。 

1.2. 面向对象与面向过程 

我们拿洗衣服来举例,洗衣粉、洗衣机、人就是对象;过程如下:

 二、类定义和使用

        类是用来对一个实体(对象)来进行描述的,主要描述该实体(对象)具有哪些属性(外观尺寸等),哪些功能(用来干啥),描述完成后计算机就可以识别了。到底类和对象有什么不同呢?其实,类不是对象,却是用来创建它们的模型。类是对象的蓝图,它会告诉虚拟机如何创建某种类型的对象。根据某类创建出的对象都会有自己的实例变量。我们可以使用狗类创建出年龄、性别、姓名。

2.1. 类的定义格式 

 语法规则:类名一般采用大驼峰,字段或成员属性定义在方法外部、类的内部。成员方法和成员变量可以细分为两种,静态与非静态的。public可有可无。

public class 类名{
     字段/成员属性;
     成员方法;

我们拿洗衣机举例,

public class WashMachine{
    public String brand;   // 品牌
    public String type;    // 型号
    public double weight;  // 重量
    public double length;  // 长
    public double width;  // 宽
    public double height;  // 高
    public String color;   // 颜色

2.2. 类的定义练习

(1)定义一个购物车类 

public class ShoppingCart {
    public String cartContents;//定义购物车内容

    public void addToCart(){
        System.out.println(cartContents+"把购买的物品添加进购物车");
    }
}

 (2)定义一个按钮类

public class Button {
    public String label;//定义标签
    public String color;//定义颜色

    public void SetColor(){
        System.out.println("The button is" + color);
    }

    public void setLabel(){
        System.out.println("The button is"+label);
    }
}

三、类的实例化

3.1. 什么是实例化 

       定义了一个类,就相当于在计算机中定义了一种新的类型,与int,double类似,只不过int和double是java语言自 带的内置类型,而类是用户自定义了一个新的类型,比如上述的:ShoppingCart类和Button类。用类类型创建对象的过程,称为类的实例化,在java中采用new关键字,配合类名来实例化对象。下面我们来进行一个电影类的实例化:

public class Movie {
    String title;//定义标题
    String genre;//定义题材
    int rating;//定义评级

    public void playIt(){
        System.out.println(title+""+genre+""+rating);
    }
}
public class MovieTestDrive {
    public static void main(String[] args) {
        Movie one =new Movie();
        one.title="Gone with the Stock";
        one.genre="Tragic";
        one.rating=-2;
        one.playIt();

        Movie two =new Movie();
        two.title ="Lost in Cubicle Space";
        two.genre ="Comedy";
        two.rating =5;
        two.playIt();
    }
}

 

那么类的实例化在栈和堆上是如何开辟内存空间的:

       one先在栈上开辟一块内存空间,栈上的地址指向堆里面,此时我们创立的属性title、genre、rating、就会在堆上进行赋值。

        对于类的成员变量来说,每一个成员变量都有一个默认值,引用类型为null,基本类型为对应的默认类型。 

3.2. 类和对象的说明

       到底类和对象两者之间有什么不同呢?首先,类不是对象,是用来创建它们的模型。类是对象的蓝图,它会告诉虚拟机如何创建某种类型的对象。根据某类创建出的对象都会有自己的实例变量 。

       对象可以执行的动作叫方法。在设计类时,我也会同时设计出操作对象数据的方法。举例来说,闹钟对象会有个变量来保存时间,且会有GetTime和SetTIme来保存该时间。

public class Alarm {
    public int AlarmTime;//定义时间
    public String AlarmMode;

    public void GetTime(){
        System.out.println("get the time");
    }
    public void SetTime(){
        System.out.println(" set the time");
    }
}

 四、this引用

4.1. 什么是this引用 

先看一个日期类的例子: 

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

     public void SetDate(int y,int m,int d){
         year=y;
         month=m;
         day=d;
     }

     public void PrintDate(){
         System.out.println(year+"年"+month+"月"+day+"日");
     }

    public static void main(String[] args) {
        Date date = new Date();
        date.SetDate(2005,3,13);
        date.PrintDate();
        System.out.println("=========");

        Date date1 =new Date();
        date1.SetDate(2024,10,25);
        date1.PrintDate();
    }
}

 

此时博主要给出两个问题去思考一下:

1、每个方法只有一个,那么该方法怎么知道给哪个成员变量赋值?

2、当修改SetDate之后,赋值失败

       我们先看第二个问题,当我们修改了之后,就会出了两个形参,相当于形参自己给自己赋值。可我们有时候无法避免命名相同,此时就可以通过this来解决。

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

       那么第一个问题呢?this表示当前对象的引用,在方法的内部还存在着一个隐藏的this,编译器自动接收,谁调用SetDate谁就会把引用传给this,它携带的信息就会包含我要修改的成员变量。

4.2. this引用的特性 

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

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

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


http://www.kler.cn/news/366036.html

相关文章:

  • Flutter鸿蒙next 状态管理高级使用:深入探讨 Provider
  • HivisionIDPhoto Docker部署以及Springboot接口对接(AI证件照制作)
  • 力扣题解(执行操作可获得的最大总奖励II)
  • frida脚本,自动化寻址JNI方法
  • java动态代理介绍
  • C#应用程序实现限制输入法
  • Mybatis mapper文件 resultType和resultMap的区别
  • 电脑重做系统后打游戏很卡
  • 循序渐进丨MogDB 与 PostgreSQL 对比测试IPv6
  • Flask-SocketIO 简单示例
  • unity游戏开发之塔防游戏
  • LinkAndroid v0.0.12 发布,手机连接助手,日志查看、投屏设置、多处问题修复
  • 光控资本:养老金融建设提速 高速铜缆市场空间广阔
  • 【工作技术栈】通用的旁路缓存一致性缺陷以及解决方式
  • ERR_PNPM_LINKING_FAILED Error: EPERM: operation not permitted, rename...
  • Scaffold-GS: Structured 3D Gaussians for View-Adaptive Rendering
  • 【python】OpenCV—findContours(4.2)
  • 【Go语言】
  • 简述特征降维的几种方式
  • IDEA中一个窗口打开多个项目-区别于eclipse
  • Netty-TCP服务端粘包、拆包问题(两种格式)
  • 使用Flask实现本机的模型部署
  • 【制造业&电子产品】电脑电子元件检测系统源码&数据集全套:改进yolo11-TADDH
  • 【贪心算法】(第十四篇)
  • 【前端学习路线】从入门到进阶(含学习资料链接和笔记)
  • 架构师备考专栏-导航页