图灵日记之java奇妙历险记--类和对象

news2024/11/17 8:42:29

目录

  • 类的定义和使用
    • 类的定义格式
  • 类的实例化
    • 类和对象的说明
  • this引用
    • this引用的特性
  • 对象的构造及初始化
    • 就地初始化
    • 构造方法
  • 封装
      • 导入包中的类
      • 自定义包
    • static成员
      • static修饰成员变量
      • static修饰成员方法
    • 代码块
      • 代码块概念及分类
      • 构造代码块
      • 静态代码块
    • 匿名对象

类的定义和使用

类的定义格式

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

class为定义类的关键字,ClassName为类的名字,{}中为类的主体。

class future {
    public int time;

    public void decreaseTime() {
        
    }
}

类名注意采用大驼峰定义
成员前写法统一为public
此处写的方法不带 static 关键字

注意事项:
1. 一般一个文件当中只定义一个类,方便后期维护
2. main方法所在的类一般要使用public修饰(注意:Eclipse默认会在public修饰的类中找main方法)

class future {
    public int _time;
    public static void main(String[] args) {
        System.out.println("1");
    }
    public void decreaseTime() {
    }
}

此处的类未被public修饰,依旧可以使用main方法
3. public修饰的类必须要和文件名相同
4. 不要轻易去修改public修饰的类的名称

类的实例化

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

    public static void main(String[] args) {
        future date1 = new future();
        future date2 = new future();
    }

在这里插入图片描述
(地址随便给的)

当你创建一个类的实例时,实际上是在内存中分配了一块空间来存储这个实例,并返回一个指向该内存空间的引用。这个引用指示了对象在内存中的位置,而不是对象本身的内容。通过这个引用,你可以访问和操作对象的属性和方法。

new 关键字用于创建一个对象的实例.
使用 . 来访问对象中的属性和方法.
同一个类可以创建多个实例.

类和对象的说明

类只是一种模板.类似于建筑图纸,实例化就是把图纸建造成高楼大厦
类是一种自定义类型,类可以实例化出多个对象,类似图纸可以修建很多大厦,实例化的对象占用实际的物理空间,存储成员变量,此处是普通成员变量,类的实例化会分配内存空间来存储对象的实例变量,并提供指向方法的引用,但静态成员变量和静态方法不会在实例化过程中分配新的空间

this引用

public class test {
    public static void main(String[] args) {
        stu a = new stu();
        stu b = new stu();
        a.InitStu(1,"ab",1);
        b.InitStu(2,"cd" ,2);
    }
}
class stu {
    public int age;
    public String name;
    public int index;
    public void InitStu(int age, String name, int index) {
    }
}

方法在类中是通过引用存在的,一个类创建的不同对象在调用同一个方法,而方法如何区分不同对象?

有宝子就很奇怪地会指出
加粗样式
调用函数之前不是会有对象吗,这里还要再次重申一遍,方法在类中是以引用的形式存在的,方法不像成员变量,方法进行的是一种重复操作,没必要每次实例化对象还要额外开辟空间,只需要开辟一次,之后调用之时去调用引用来进行方法调用,那么对于同一个方法,编译器该如何区分呢?这里就要提到this引用了

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
对象a和b都有自己的引用,在函数调用时,系统会默认把this引用一起传给方法.方法被调用时,this关键字将会引用调用该方法的对象,即a或b,来区分不同对象。

class stu {
    public int age;
    public String name;
    public int index;
    public void InitStu(int age, String name, int index) {
        age = age;
        name = name;
        index = index;
    }
}

对stu类里的InitStu方法进行如上操作,但是由于局部变量优先的原则,方法内的变量不会优先识别方法之外的变量,而是优先方法内的局部变量,方法内找不到才会到类中寻找,如上代码可以得出,方法里修改的是形参,未对类里的成员变量进行修改
在这里插入图片描述
在这里插入图片描述

如果要对成语变量进行修改,使用this引用来指明,如下
在这里插入图片描述

this引用的特性

1. this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型
2. this只能在"成员方法"中使用
3. 在"成员方法"中,this只能引用当前对象,不能再引用其他对象
4. this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法,对象的引用传递给该成员方法,this负责来接收

对象的构造及初始化

    public static void main(String[] args) {
        int a;
        System.out.println(a);
    }

局部变量未初始化,打印会报错,但是如果是成员变量则不一样,成员变量未初始化在进行打印时不会报错,因为类的对象在申请空间之后依旧设置好了初始化值,如下
数据类型 默认值
byte 0
char ‘\u0000’
short 0
int 0
long 0L
boolean false
float 0.0f
double 0.0
reference null

        stu a = new stu();
        System.out.println(a.index);
        System.out.println(a.age);
        System.out.println(a.name);

在这里插入图片描述

就地初始化

在声明成员变量时,就直接给出了初始值

class stu {
    public int age = 1;
    public String name = null;
    public int index = 1;
    public void InitStu(int age, String name, int index) {
        this.age = age;
        this.name = name;
        this.index = index;
    }
}

在这里插入图片描述

构造方法

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

对象的产生一是需要为对象分配内存,二是调用合适的构造方法,而刚才类里没有构造方法为什么对象会产生,那是因为系统在发现类里没有构造方法的情况下会自动生成一个构造方法,如下

    public class Animal {
        /*public Animal() {
        
        }系统默认生成这样的构造函数来进行调用*/
        String name;
        int age;
    }

但是在你依旧有构造方法的时候,系统就不会生成默认构造方法,防止冲突,如下代码就会报错,因为不会生成默认构造方法

class Animal {
    public Animal(String name, int age) {
        this.age = age;
        this.name = name;
    }
    public String name;
    public int age;
}

public class test {
    public static void main(String[] args) {
        Animal pig = new Animal();
        System.out.println(pig.age);
        System.out.println(pig.name);
    }
}

你还可以在你定义的构造方法调用另一个自己的构造方法

class Animal {
    public Animal(String name, int age) {
        this.age = age;
        this.name = name;
    }
    public Animal() {
        this("pig",1);
    }
    public String name;
    public int age;
}

但是需要注意在public Animal() 中this(“pig”,1)只能当第一条语句,后面可以添加其他语句
不能成环

    public Animal(String name, int age) {
        this();
    }
    public Animal() {
        this("pig",1);
    }

递归套娃的感觉,反正成环就哒唛

封装

面向对象程序三大特性:封装、继承、多态

public class things {
//这里把成员变量给密封在类里,外界无法访问
    private String name;
    private int year;
    private String color;

    public things() {

    }
    public things(String name, int year, String color) {
        this.name = name;
        this.year = year;
        this.color = color;
    }
    public void show() {
        System.out.println(this.color);
        System.out.println(this.year);
        System.out.println(this.name);
    }
}
public class test02 {
    public static void main(String[] args) {
        things book = new things("book",1,"red");
        book.show();
    }
}

封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行 交互
注意:这里的接口包括方法,也包括之后学的接口

在面向对象体系中,提出了一个软件包的概念,即:为了更好的管理类,把多个类收集在一起成为一组,称为软件包。

包是对类,接口等的封装机制的体现,是一种对类或者接口等的很好的组织方式
在同一工程允许存在相同名称的类,只要处在不同的包中即可

导入包中的类

可以使用java.util.Arrays导入java.util包中的Arrays类

    public static void main(String[] args) {
        int[] arr = {1,2,3};
        System.out.println(java.util.Arrays.toString(arr));

    }

这样的写法比较麻烦,可以使用import语句导入包

import java.util.Arrays;
public class test03 {
    public static void main(String[] args) {
        int[] arr = {1,2,3};
        System.out.println(Arrays.toString(arr));
    }
}

导入包时也可以使用import java.util.;.;
*是通配符,表示所有的意思,就是导入ijava.util所有的类
建议使用显式的指定要导入的类名,否则会出现冲突

使用import static导入包中静态的方法和字段

在这里插入图片描述
静态方法

    public static void main(String[] args) {
        int[] arr = {2,33,3};
        sort(arr);//可以直接写方法
        for (int x:arr) {
            System.out.println(x+" ");
        }
    }

自定义包

基本规则

  • 在文件的最上方加一个package语句指定该代码在哪个包中
  • 包名需要尽量指定成唯一的名字,通常会用公司的域名颠倒形式
  • 包名要和代码路径相匹配
  • 如果一个类没有package语句,则该类被放到一个默认包
    在这里插入图片描述
    (子类要等到后面再展开)
    先提一下default,他就是不加任何访问限定符的状态
    在这里插入图片描述
    上图创建一个A包,包里有B和C包,B包里有testB类,C包里有testC类
    在这里插入图片描述
public class testC {
    int tem;//不加访问修饰限定符
    public int tem1;
}

在这里插入图片描述
在另一个包B里实例化testC这个类,对象名叫a,上图可以看出我们可以访问tem1,但是default也就是不加访问限定符的情况下,无法访问tem这个变量

static成员

public class person {
    public int time;
    public String name;
}

定义person这个类,变量time对于每个person都一样的(前提),但是如果你每次实例化一个对象都要开辟空间给变量time,本来一个就够了,但是你每次都要开辟空间,就会造成空间浪费
如果time属性对于所有的person对象都是相同的,那么将其设置为static是合适的。这样,这个属性就不会与每个person对象实例关联,而是与类本身关联。这样,无论创建多少个person对象,都只会有一个time属性,所有对象都会共享这个属性

public class person {
    public static int time;
    public String name;
}

static修饰成员变量

静态成员变量在方法区中存储 ,被static修饰的只能是成员变量,不能是局部变量

static修饰的成员变量,称为静态成员变量,静态成员变量最大的特性:不属于某个具体的对象,是所有对象所共享的

  1. 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中
  2. 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
  3. 类变量存储在方法区当中
  4. 生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁)

static修饰成员方法

Java中,被static修饰的成员方法称为静态成员方法,是类的方法,不是某个对象所特有的。静态成员一般是通过静态方法来访问的。

【静态方法特性】

  1. 不属于某个具体的对象,是类方法
  2. 可以通过对象调用,也可以通过类名.静态方法名(…)方式调用,更推荐使用后者
  3. 不能在静态方法中访问任何非静态成员变量
  4. 静态方法中不能调用任何非静态方法,因为非静态方法有this参数,在静态方法中调用时候无法传递this引用

代码块

代码块概念及分类

使用{}定义一段代码称为代码段.根据代码块定义的位置以及关键字,又可分为以下四种

  • 普通代码块(少见)
  • 构造块
  • 静态块
  • 同步代码块(期待后续)

构造代码块

构造块:定义在类中的代码块(不加修饰符)。也叫:实例代码块。构造代码块一般用于初始化实例成员变量。

静态代码块

使用static定义的代码块称为静态代码块。一般用于初始化静态成员变量
注意事项
静态代码块不管生成多少个对象,其只会执行一次
静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的
如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行(合并)
实例代码块只有在创建对象时才会执行

public class test {
    public static void main(String[] args) {
        person tem1 = new person();
        System.out.println("================");
        person tem2 = new person();

    }
}
class person {
    public static int time;
    public String name;
    person() {
        System.out.println("构造方法");
        person.time = 1;
        this.name = "张三";
    }

    public void show() {
        System.out.println(this.name);
        System.out.println(person.time);
    }
    //静态代码块
    static {
        System.out.println("静态代码块");
    }
    //构造代码块
    {
        System.out.println("构造代码块");
    }
}

在这里插入图片描述

匿名对象

举个栗子:

public class test {
    public static void main(String[] args) {
        String tem;
        System.out.println(tem);
    }
}

思维有些混淆的宝子会说不是有默认值吗,我们再说一下,是类里的成员变量在未初始化的时候会有默认值,tem是局部变量,需要初始化

类里的成员变量:
当你在类中声明一个变量,这个变量是类的成员变量。如果这些变量没有被初始化,它们会有默认值。例如,对于引用类型(如String),默认值是null。对于数值类型,默认值是相应的默认值(例如,int的默认值是0)。
局部变量:
局部变量是在方法内部声明的变量。它们只在方法的作用域内存在,并且没有默认值。在声明之后必须显式地初始化它们,否则编译器会报错。

public class test {
    String tem;
    public static void main(String[] args) {
        System.out.println(tem);//依旧报错
    }
}

有宝子又要说:这也不行啊,上面的代码main方法被static修饰,是个类方法,他的调用不依赖于对象,但是tem这个成员变量属于类,不能直接调用,因为静态的里面不能访问非静态的,如果你非要调用就给一个对象即可

public class test {
    String tem;
    public static void main(String[] args) {
        test a = new test();
        System.out.println(a.tem);
    }
}
public class test {
    String tem;
    public static void main(String[] args) {
        System.out.println(new test().tem);//匿名对象的方式
    }
}

匿名对象的缺点:
只能使用一次,不能重复使用

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

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

相关文章

Python入门学习篇(十)——函数定义函数传参方式

1 相关定义和概念 1.1 函数的理解 一段被封装的可以重复调用的代码。 1.2 函数定义语法结构 def 函数名(形参1,形参2):要封装的逻辑代码 # 注意:函数可以有返回值也可以没有返回值,没有返回值的结果是None1.3 函数调用的语法结构 函数名(形参1,形参2)1.4 简单实例 1.4.1 …

不浪费时间,昂首资本1分钟如何快速学习MT4价差

不要浪费时间在手工计算上,昂首资本解释一下如何快速学习MT4价差,。 想要在MT4中输入交易时,需要在交易窗口中设置未来交易的参数。在同一个窗口中,可以看到卖价和买价。如果在上面的例子中比较这两个价格,就会发现两…

如何查看NX UI对话框内的控件(使用UIFW侦查)

一、概述 在NX二次开发中有很多命令从界面上看起开相似,但实质确不同,个人人为一是出于对软件产权的保护,增加二次开发的难度,二是由于NX在不断地发展和版本交替中为了保留老用户的操作习惯,故意用新控件做成老控件的…

LeetCode刷题--- N 皇后

个人主页:元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 http://t.csdnimg.cn/6AbpV 数据结构与算法 ​​​​​​http://t.csdnimg.cn/hKh2l 前言:这个专栏主要讲述递归…

模式识别与机器学习-特征选择和提取

模式识别与机器学习-特征选择和提取 特征选择一些距离测度公式独立特征的选择准则一般特征的散布矩阵准则 离散K-L变换 谨以此博客作为复习期间的记录。 常见分类问题的流程,数据预处理和特征选择提取时机器学习环节中最重要的两个流程。这两个环节直接决定了最终性…

数模学习02-Matlab基础知识入门

先把matlab下载好。然后你就会发现电脑有少了几十个GB。服啦~ 修改字体 字体真的是太小了,其实我无论是使用什么编辑器我一般都会先改字体,字体在开始中有一个预设,可以修改字体,这样眼睛看着也会舒服一点 命令行窗口的使用 这…

亚马逊美国站ASTM F2613儿童折叠椅和凳子强制性安全标准

ASTM F2613折叠椅和凳子安全标准 美国消费品安全委员会(CPSC)发布的ASTM F2613儿童折叠椅和凳子的强制性安全标准,已于2020年7月6日生效,并被纳入联邦法规《16 CFR 1232儿童折叠椅和凳子安全标准》。 亚马逊要求在美国站上架的儿…

GaussDB元命令使用指导

所谓元命令就是在gsql里输入的任何以不带引号的反斜杠开头的命令。本课程通过实际使用gsql实践,介绍GaussDB数据库gsql所提供的元命令。 本课程仅展示基础的元命令使用。 一、操作步骤 步骤1 使用gsql连接到GaussDB实例。 gsql工具使用-d参数指定目标数据库名…

何时为 SEO 创建本地化文件夹和页面

您可以为新网站创建主题支柱页面吗? 您网站的使用年限与您如何构建内容和文件夹无关紧要。在重建已有 10 年历史的域或启动新 URL 时,可以做到这一点。 您应该始终构建您的网站,以便它帮助最终用户了解网站的层次结构,并显示该部…

详解Vue3中的插槽(slot)

本文主要介绍Vue3中的插槽(slot)。 目录 一、在普通写法中使用插槽(slot)作用域插槽默认插槽 二、在setup写法中使用插槽:注意事项 在Vue3中,插槽(slot)是一种用于在父组件中向子组件…

【2】Docker Compose编排

Docker Compose 使用 Docker 帮助我们解决服务的打包安装的问题,随着而来的问题就是服务过多的带来如下问题: 多次使用 Dockerfile、Build、Image 命令或者 DockerHub 拉取 Image;需要创建多个 Container,多次编写启动命令&…

Python——yolov8识别车牌2.0

目录 一、前言 二、关于项目UI 2.1、修改界面内容的文本 2.2、修改界面的图标和图片 三、项目修改地方 四、其他配置问题 一、前言 因为后续有许多兄弟说摄像头卡顿,我在之前那个MATS上面改一下就可以了,MAST项目:基于YOLOv8的多端车流检…

51 单片机基础

一、51 单片机 开发环境配置,vscodeSDCC 编辑器、编译器 最常用的集成开发环境 keil c51 1、vscode SDCC 开发环境搭建 vscode 插件( 或者 PlatformIO IDE) EIDE 的使用:详细自学 PlatformIO IDE:详细自学 vsc…

C#高级 02异步编程

基础知识 1.什么是异步任务 包含了异步任务的各种状态的一个引用类型 1)正在运行、完成、结果、报错等 2)另有ValueTask值类型版本对于异步任务的抽象 1)开启异步任务后,当前线程并不会阻塞,而是可以去做其他事情 2)异步任务(默认&#xff…

HTTP是怎么泄露账户密码的?

近几年,互联网发生着翻天覆地的变化,尤其是我们一直习以为常的HTTP协议,在逐渐的被HTTPS协议所取代,在浏览器、搜索引擎、CA机构、大型互联网企业的共同促进下,互联网迎来了“HTTPS加密时代”,HTTPS将在未来的几年内全面取代HTTP成为传输协议的主流。 那么HTTPS和HTTP的区别在…

2023年总结:反复纠结与成长的一年

前言 这是我第五年写年度总结: 《2022年总结:道阻且长,行则将至》 《2021年总结:前路有光,初心莫忘》 《2020年总结,所有努力只为一份期待》 《2019年总结,平凡的我仍在平凡的生活》 现在…

LeetCode206反转链表(java实现)

今天带来的题目解析是leetcode206,反转链表,我们来看下题目描述 如何实现链表的反转呢?我在这里提供的思路是双指针的思路。 具体的思路如下: 假设我们的原链表如下 首先定义一个指针pre,用于指向head之前的位置&am…

RHCE9学习指南 第7章 服务管理

刚装好Windows系统时,需要进行一些优化,如下图所示。 右键单击所得菜单,可以看到一些按钮包括重启、停止、启动该服务。这些管理的是这个服务的当前状态。 双击服务名,在启动类型中设置的是系统启动时,这个服务要不要…

【elk-day01】es和kibana搭建及验证---Mac-Docker

Mac系统使用Docker下载搭建和验证eskibana Docker下载安装es安装es验证kibana安装kibana验证 Docker下载安装 Docker Desktop官网安装下载地址 说明一下为什么要安装desktop版本的docker,因为docker作为工具使用,我们需要的是开箱即用,没有必…

基于Python的城市热门美食数据可视化分析系统

温馨提示:文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 本项目利用网络爬虫技术从XX点评APP采集北京市的餐饮商铺数据,利用数据挖掘技术对北京美食的分布、受欢迎程度、评价、评论、位置等情况进行了深入分析,方便了解城市美食店…