JAVA SE 类和对象

news2024/11/24 3:16:21

类和对象

  • 类定义和使用
    • 类的定义格式
  • 类的实例化
    • 什么是实例化
  • this 引用
    • this引用的特性
  • 对象的构造及初始化
    • 如何初始化对象
    • 构造方法
      • 概念
      • 特性
    • 在这里插入图片描述 **注意**:
  • 封装
    • 封装的概念
    • 封装扩展之包
      • 导入包中的类
      • 自定义包
      • 包的访问权限控制举例
  • static成员
    • static修饰成员变量
    • static修饰成员方法
    • static成员变量初始化
  • 代码块
    • 普通代码块
    • 构造代码块
    • 静态代码块
    • 注意:

类定义和使用

面向对象程序设计关注的是对象,而对象是现实生活中的实体,比如:洗衣机。但是计算机并不认识洗衣机,需要我们告诉它什么是洗衣机。
在这里插入图片描述上图右侧就是对洗衣机简单的描述,该过程称为对洗衣机对象(实体)进行抽象(对一个复杂事物的重新认识),但是这些简单的抽象结果计算机也不能识别,开发人员可以采用某种面向对象的变成语言来进行描述,比如:Java语言。

类的定义格式

在java中定义类时需要用到class关键字,具体语法如下:

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

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

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

class WashMachine{
	public String brand;
	public String type;
	public double weight;

  public void washClothes(){
  	System.out.println("洗衣服");
  }

  public void dryClothes(){
     System.out.println("脱水");
  }
}

注意:

    1. 类名采用大驼峰定义。
    2. main方法所在的类一般要用public修饰
    3. public修饰的类必须要和文件名相同
    4. 不要轻易修改public修饰的类的名称,如果要修改,通过Refactor->Rename

在这里插入图片描述

类的实例化

什么是实例化

定义了一个类,就相当于在计算机中定义了一种新的类型,与int、double类似,只不过int和double是java语言自带的内置类型,而类是用户自定义了一种新的类型,比如刚刚的洗衣机WashMachine类。有了自定义的类型以后,就可以使用这些类来定义实例(或者称为对象)。
用类类型创建对象的过程,称为类的实例化,在java中采用new关键字,配合类名来实例化对象。

public class Dog {
    public String name;
    public String color;

    public void bark(){
        System.out.println("旺旺旺");
    }

    public void wag(){
        System.out.println("摇尾巴");
    }

    public static void main(String args[]){
        Dog dog1=new Dog();
        dog1.name="大黄";
        dog1.color="黄";
        dog1.bark();
        dog1.wag();

        Dog dog2=new Dog();
        dog2.name="大黑";
        dog2.color="黑";
        dog2.bark();
        dog2.wag();
    }
}

在这里插入图片描述
注意:

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

this 引用

this引用指向当前对象(调用某成员方法的对象),以免因成员变量和形参名相同,造成误解。

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

    public void printDate(){
        System.out.println(this.year+"-"+month+"-"+day);
    }

    public static void main(String args[]){
        Date d=new Date();
        d.setDay(2020,9,15);
        d.printDate();
    }
}

this引用的特性

1.this的类型:对应类类型引用,即那个对象调用就是哪个对象的引用类型
2.this只能在“成员方法”中使用
3.在“成员方法”中,this只能引用当前对象,不能再引用其他对象
4.this是“成员方法”第一个隐藏的参数,写不写都无所谓,编译器帮你传递了。

对象的构造及初始化

如何初始化对象

java内部定义一个局部变量时,必须要初始化,否则会编译失败。
在这里插入图片描述

要让上述代码通过编译,只需要在正式使用之前,给a设置一个初始值即可。如果是对象:
在这里插入图片描述
我们发现,可以正常运行,但只有通过调用setDay方法才能将具体的日期设置到对象中。

我们就此发现两个问题:

1.每次对象创建好后调用SetDate方法设置具体日期,比较麻烦,那对象该如何初始化?
2.局部变量必须要初始化才能使用,为什么字段声明之后没有给值依然可以使用?

构造方法

概念

构造方法(也称为构造器)是一个特殊的成员方法,名字必须和类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。
在这里插入图片描述注意:构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间。

特性

1.名字必须与类名相同
2.没有返回值类型,设置为void也不行
3.创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次(相当于人的出生,每个人只能出生一次)。
4.构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)。
5.如果用户没有显式定义,编译器会生成一份默认的构造方法,生成的某人构造方法一定是无参的。

注意:一旦用户定义了构造方法,编译器就不会再生成了,所谓“救急不救贫”。
在这里插入图片描述

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

在这里插入图片描述
注意

  1. this(……)必须是构造方法中第一条语句
  2. 不能形成环
    在这里插入图片描述7.绝大多数情况下,使用public来修饰,特殊场景下会被private修饰。

封装

封装的概念

面向对象程序三大特性:封装、继承、多态。类和对象阶段,主要研究的就是封装特性。

封装扩展之包

为了更好的管理类,把多个类收集在一起成为一组,称为软件包。也就是位于同一个文件夹下的类。包是对类、接口等的封装机制的体现,是一种对类或接口等的很好的组织方式,比如:一个包中的类不想被其他包中的类使用。包还有一个重要的作用:在同一个工程中允许存在相同名称的类,只要处在不同的包中即可。

导入包中的类

Java中已经提供了很多现成的类供我们使用,例如Date类:可以使用java.util.Date 导入java.util这个包中的Date类。

public class test {
    public static void main(String[] args){
        java.util.Date date=new java.util.Date();
        //获得一个毫秒级别的时间戳
        System.out.println(date.getTime());
    }
}

但是这种写法比较麻烦,可以使用import语句导入包

import java.util.Date;

public class test {
    public static void main(String[] args){
        Date date=new java.util.Date();
        //获得一个毫秒级别的时间戳
        System.out.println(date.getTime());
    }
}

如果需要使用java.util中的其他类,可以使用import java.util. *

import java.util.*;

public class test {
    public static void main(String[] args){
        Date date=new java.util.Date();
        //获得一个毫秒级别的时间戳
        System.out.println(date.getTime());
    }
}

但是我们更建议显式的指定要导入的类名,否则还是容易出现冲突的情况。如以下案例:
在这里插入图片描述可以使用import static导入包中静态的方法和字段。

import static java.lang.Math.*;
public class test {
    public static void main(String[] args){
        double x=30;
        double y=40;
        double result = sqrt(pow(x,2)+pow(y,2));
        System.out.println(result);
    }
}

自定义包

基本规则:

  • 1.在文件的最上方加上一个package语句指定该代码在哪个包中。
    2.包名需要尽量指定成唯一的名字,通常会用公司的域名的颠倒形式,例如com.alibaba.demo1
    3.建包方法
    在这里插入图片描述

包的访问权限控制举例

Computer类位于com.bit.demo1包中,TestComputer位于com.bit.demo2包中:

package com.bit.demo1;

public class Computer {
    private String cpu;
    private String memory;
    public String screen;
    String brand;
    
    public Computer(String brand,String cpu,String memory,String screen){
        this.brand=brand;
        this.cpu=cpu;
        this.memory=memory;
        this.screen=screen;
    }
    
    public void Boot(){
        System.out.println("开机");
    }
    
    public void PowerOff(){
        System.out.println("关机");
    }
    
    public void SurfInternet(){
        System.out.println("上网");
    }
}
package com.bit.demo2;
import com.bit.demo1.Computer;
import jdk.swing.interop.SwingInterOpUtils;

public class TestComputer {
    public static void main(String[] args){
        Computer p=new Computer("HW","I7","8G","13*14");
        System.out.println(p.screen);
        //System.out.println(p.cpu);
        //System.out.println(p.brand);
        //cpu 和brand都是私有的,不允许被其他包中的类访问
    }
}

static成员

static修饰成员变量

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

  • 1.既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
    2.类变量存储在方法区当中
    3.生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁)

static修饰成员方法

一般类中的数据成员都设置为private,而成员方法设置为public。被static修饰的成员方法称为静态成员方法,是类的方法,不是某个对象所特有的。静态成员一般是通过静态方法来访问的。
在这里插入图片描述
在这里插入图片描述
静态方法特性:

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

static成员变量初始化

静态成员变量一般不会放在构造方法中来初始化,构造方法中初始化的是与对象相关的实例属性。
静态成员变量的初始化分为两种:就地初始化静态代码块初始化
就地初始化指定是在定义类的时候,直接给出静态成员变量的初始值。

代码块

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

  • 普通代码块

  • 构造块

  • 静态块

  • 同步代码块

普通代码块

在这里插入图片描述

构造代码块

构造代码块一般用于初始化实例成员变量
在这里插入图片描述

静态代码块

一般用于初始化静态成员变量,静态代码块不管生成多少个对象,只会执行一次。

注意:

执行的先后顺序为:
①字段(成员变量)
②静态代码块
③实例代码块
④构造方法
这个执行顺序和他们3个的前后定义顺序没有关系,但如果都是同一类代码块,则执行顺序为定义顺序

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

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

相关文章

MOZHE SQL手工注入漏洞测试(MySQL数据库)

主界面URL没有参数,无法判断是否有注入点 点击公告 【浏览器不便于查看返回包可以用burp】 测试URL 参数后加上单引号,报错,说明存在注入点 http://124.70.64.48:40021/new_list.php?id1 获取表列数 order by 4 返回200 order by 5 …

鸿蒙应用框架开发【N-Body模拟程序】

N-Body模拟程序 介绍 在本示例中,使用ArkTS编程语言开发了业界编程语言基准测试项目[Benchmarks Game]中的[N体问题模拟程序],实现类木星体轨道计算。 本示例用到了ohos.taskpool和ohos.worker 接口。示例中的程序可以用于AOT(Ahead Of Time)等性能测…

计科录取75人!常州大学计算机考研考情分析!

常州大学(Changzhou University),简称“常大”,位于江苏省常州市,是江苏省人民政府与中国石油天然气集团有限公司、中国石油化工集团有限公司及中国海洋石油集团有限公司共建的省属全日制本科院校,为全国深…

⼤模型在⽹络安全⽅⾯的应⽤汇总

引⾔ ⼤语⾔模型(Large Language Models, LLMs)的横空出世,为传统计算机科学的各个细分领域带来了颠覆性的变⾰。这种变⾰的浪潮同样席卷了⽹络安全领域,引发了⼀系列深刻的变化和影响。GPT-4、Gemini、Llama 2 等⼤模型以其卓越的…

7月22日学习笔记 文件共享服务nfs,SAMBA文件共享与DNS域名服务

任务背景 由于业务驱动,为了提⾼⽤户的访问效率,现需要将原有web服务器上的静态资源 ⽂件分离出来,单独保存到⼀台⽂件服务器上。 任务要求 1. ⼀台应⽤服务器web-server部署apache,静态⽹⻚资源存放在另外⼀台NFS服 务器上 …

深入理解计算机系统 CSAPP 家庭作业11.7

静态内容是指在不同请求中访问到的数据都相同的静态文件。例如:图片、视频、网站中的文件(html、css、js)、软件安装包、apk文件、压缩包文件等。 /** get_filetype - derive file type from file name*/ void get_filetype(char *filename,…

12_TypeScript 模块 以及 模块化封装DB 库

TypeScript 模块 1、模块中暴露方法12、模块中暴露方法23、模块中暴露方法34、封装[上一节的db 库](https://blog.csdn.net/qq_46143850/article/details/140664100)5、TypeScript 命名空间 模块的概念(官方): 关于术语的一点说明&#xff1a…

Linux网络-wget命令

作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注我,我尽量把自己会的都分享给大家,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 Linux服务器作为一个常用的网络服务器,主要的作用就是向客户端提供网络…

【工具推荐】强大的JS渗透测试工具:URLFinder

一、下载地址 https://github.com/pingc0y/URLFinder 二、工具原理 从表现中JS中提取URL或者敏感数据,一款用于快速提取检测页面中JS与URL的工具。功能类似于JSFinder,但JSFinder好久没更新了。 三、工具介绍 1、下载解压出来包含下面两个文件 2、直…

内网渗透—内网穿透工具NgrokFRPNPSSPP

前言 主要介绍一下常见的隧道搭建工具,以此来达到一个内网穿透的目的。简单说一下实验滴环境吧,kali作为攻击机,winserver2016作为目标靶机。 kali 192.168.145.171 winserver2016 10.236.44.127 显然它们处于两个不同的局域网&#xff0c…

SQLException:Operation not allowed after ResultSet closed

运行代码时出现的错误: 这是在运行简单的JDBC访问数据库时出现的问题,原因是在ResultSet方法中添加了close()关闭方法,如图: ResultSet 是通过 query 方法获得的,并且在 try-catch 块中没有显式地关闭它。这实际上是 一个常见的…

ServletContainerInitializer接口详解

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhlServletContainerInitializer概述 ServletContainerInitializer是Servlet 3.0规范中引入的一个接口,它的主要目的是允许开发者在Servlet容器(如Tomcat、Jetty等)启动时执行一些自定义的初始化代…

池化层pytorch最大池化练习

神经网络构建 class Tudui(nn.Module):def __init__(self):super(Tudui, self).__init__()self.maxpool1 MaxPool2d(kernel_size3, ceil_modeFalse)def forward(self, input):output self.maxpool1(input)return output Tensorboard 处理 writer SummaryWriter("./l…

Linux系统上安装Redis

百度网盘: 通过网盘分享的文件:redis_linux 链接: https://pan.baidu.com/s/1ZcECygWA15pQWCuiVdjCtg?pwd8888 提取码: 8888 1.把安装包拖拽到/ruanjian/redis/文件夹中(自己选择) 2.进入压缩包所在文件夹,解压压缩…

生信技能54 - WisecondorX多线程并行分析CNV

WisecondorX分析CNV,默认单样本分析,batch_analysis参数设置为True可启动多样本并行分析。 WisecondorX基本使用方法以及npz文件转换和reference构建参考文章: 生信技能53 - wiseconrdoX自动化批量npz转换和reference构建 github: https://github.com/CenterForMedicalGe…

微服务:解决复杂业务的妙方

1 微服务介绍 1)什么是微服务 ​ 微服务(Microservices)是一种软件架构风格,它将一个大型应用程序拆分成许多较小的、松散耦合的、独立运行的服务。这些服务通常围绕特定功能或业务领域组织,可以独立开发、部署、扩展和更新。微…

【网络安全学习】 SQL注入01:基础知识

💻 1. 什么是SQL注入 SQL注入是一种针对Web程序中数据库层的安全漏洞的攻击方式。它利用了程序对用户输入数据合法性的判断或过滤不严,允许攻击者在设计不良的程序中添加额外的SQL语句,从而执行计划外的命令或访问未授权的数据。攻击者可以通…

[Unity] ShaderGraph实现不同贴图素材的同一材质球复用

无意间发现的ShaderGraph小技巧, 可以实现同一个ShaderGraph,同一个Material材质球, 但使用不同的Texture贴图,而Sprite显示不会相互覆盖。 具体实现方法如下: 声明Texture2D时,把名字命名成&#xff1a…

超燃!纯AI生成《泰坦尼克号》大片!浙大阿里发布MovieDreamer:超长电影生成“梦工厂“

论文链接:https://arxiv.org/pdf/2407.16655 项目主页:https://aim-uofa.github.io/MovieDreamer/ github链接:https://github.com/aim-uofa/MovieDreamer 亮点直击 MovieDreamer,一个新颖的分层框架,将自回归模型与扩…

人工智能算法工程师(中级)课程19-模型的量化与部署之模型部署和存储方式与代码详解

大家好,我是微学AI,今天给大家介绍一下人工智能算法工程师(中级)课程19-模型的量化与部署之模型部署和存储方式与代码详解本文全面介绍了神经网络模型在实际应用中的部署与存储策略,重点覆盖了两大主流框架:LibTorch和TensorRT。L…