【Java】类和对象之超级详细的总结!!!

文章目录

  • 前言
  • 1. 什么是面向对象?
    • 1.2面向过程和面向对象
  • 2.类的定义和使用
    • 2.1什么是类?
    • 2.2类的定义格式
    • 2.3类的实例化
      • 2.3.1什么是实例化
      • 2.3.2类和对象的说明
  • 3.this引用
    • 3.1为什么会有this
    • 3.2this的含义与性质
    • 3.3this的特性
  • 4.构造方法
    • 4.1构造方法的概念
    • 4.2构造方法的性质
    • 4.3成员变量初始化
      • 4.3.1默认初始化
      • 4.3.2就地初始化
    • 4.4构造方法快速创建
  • 5.封装
    • 5.1封装的概念
    • 5.2封装如何实现
  • 6.封装扩展之包
    • 6.1什么是包
    • 6.2怎么打开包(导入包的类)
    • 6.3自定义包
  • 7.static成员
    • 7.1再谈学生类
    • 7.2static修饰成员变量
    • 7.3static修饰成员方法
    • 7.4static成员变量初始化
  • 8.代码块
    • 8.1代码块概念及分类
    • 8.2普通代码块
    • 8.3 构造代码块
    • 8.4静态代码块
  • 结语


前言

咬咬牙学了一段时间Java慢慢掌握基础知识,今天我们来学习熟悉又陌生的类和对象的相关内容。我们会了解static和public究竟是什么,意义是什么等等,会对Java的基本逻辑有更深刻的了解,还能让我们更加熟练多变的使用Java语言。话不多说,让我们开始吧!!
在这里插入图片描述


1. 什么是面向对象?

要知道什么是类之前,我们要先了解所谓的面向对象的Java语言。
我们知道,Java是一门纯面向对象的语言(Object Oriented Program,简称OOP)。面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。

1.2面向过程和面向对象

我们的C语言就是一种面向过程的语言,基本上什么都需要我们自己来编写,结合现实生活我们可以举个例子。

〚洗衣服〛

现在我们来试试细分一下洗衣服的步骤:
拿盆——放水——放衣服——放洗衣液——搓衣服——换水——再洗——拧干——晾衣服

这是我们传统情况下的洗衣服,注重的是洗衣服的过程
而当我们用洗衣机洗衣服的时候就完全不一样了。

〚洗衣机洗〛

分析一下啊:
人拿衣服——打开洗衣机——放衣服——放洗衣粉——开启洗衣机——拿衣服——晾衣服

经过细致到人的拆解一共就仅仅以上几小步,并没有洗衣服的过程。在其中总共只有四个对象:人、衣服、洗衣粉、洗衣机,以面向对象的方式来进行处理,就不关注洗衣服的过程,用户只需要通过对象之间的交互来完成〚洗衣服〛这件事就可以了,这就是面向对象的特点。在这里插入图片描述

注意:面向过程和面向对象并不是一门语言,而是解决问题的办法,并没有好坏之分,都有对应的应用场景,理解万岁!

2.类的定义和使用

2.1什么是类?

Java中的类和C语言中的结构体有些相似,都是用多种类型数据来描述一个复杂事物。
面向对象程序设计关注的是对象,而对象是现实生活中的实体,比如洗衣机等,但洗衣机计算机并不知道它的特点,就需要开发人员进行具体描述。
类是用来对一个实体(对象)来进行描述的,主要描述其具有哪些属性,哪些功能。

还是洗衣机,可以看成一个对象
属性:尺寸,品牌,重量,颜色等
功能:甩干,定时等

那么在Java语言中如何描述呢?

2.2类的定义格式

在Java中定义类时需要用到class关键字

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

class为关键字
ClassName为类名
{}中为类的主体

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

class Dog{//狗类(注意命名是大驼峰定义)
    String name;//狗名
    int age;//年龄
    String color;//毛色
    public void bark(){
        System.out.println(this.name + "正在汪汪叫...");
    }
    public void eat(){
        System.out.println(this.name + "正在吃吃吃....");
    }

2.3类的实例化

2.3.1什么是实例化

定义了一个类,就相当于定义了一种新的类型,和基本类型int、double等类似,不过类属于用户自定义的一种新的类型。
用类的类型创对象的过程,就叫类的实例化。我们在Java中使用关键字new来实现实例化。

public class test {
    public static void main(String[] args) {
        Dog dog1 = new Dog("dahuang",11,"huangse");
        dog1.name = "阿黄";
        dog1.color = "黑黄";
        dog1.bark();
        dog1.eat();
}

输出结果:
在这里插入图片描述

2.3.2类和对象的说明

总结来看:

  1. 类像一个设计图,用来对一个实体进行抽象概括描述,限定了类中有哪些成员,是一种自定义类型
  2. 一个类可以实例化出多个对象,对象就是具体的实体,有自身独有的数据,实例化出的对象占据实际的物理空间,来存储成员变量。

3.this引用

3.1为什么会有this

在介绍之前我们先来看一段代码。

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

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

自定义了一个日期类,在main中实例化就可以写日期了,看起来很完美,也确实很完美。

但我们要是这样改一下还可以实现正常的功能吗?

public void setDay(int year, int month, int day) {
        year = year;//形参名和成员变量名相同,并没有报错
        month = month;
        day = day;
    }

如果这样在使用的时候到底函数传入进来的数据是谁在给谁赋值就搞不清楚了,像这个时候就需要我们的this关键字登场了!

3.2this的含义与性质

this的含义:引用指向当前对象,即成员方法运行时调用该成员方法的对象
(简单说就是指名道姓,谁(对象)调用这个成员方法,this就指向这个“谁”)
在成员方法中的所有成员变量的操作,都是由this引用去访问。

3.3this的特性

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

在这里插入图片描述

4.构造方法

上面代码发现每次都要一个个的引用成员变量来实例化对象,感觉很麻烦,有没有那种一次搞定的?

4.1构造方法的概念

【构造方法】,其实是一个特殊的成员方法,方法名字必须与类名相同,在实例化对象时自动调用,并在整个对象的生命周期中只调用一次。

public class Date {
	public int year;
	public int month;
	public int day;
	// 构造方法:
	// 名字与类名相同,没有返回值类型,设置为void也不行
	// 一般情况下使用public修饰
	// 在创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次
	public Date(int year, int month, int day){
		this.year = year;
		this.month = month;
		this.day = day;
		System.out.println("Date(int,int,int)方法被调用了");
	}
	public void printDate(){
		System.out.println(year + "-" + month + "-" + day);
	}
	public static void main(String[] args) {
	// 此处创建了一个Date类型的对象,并没有显示调用构造方法
	Date date = new Date(2021,6,9); // 输出Date(int,int,int)方法被调用了
	date.printDate(); // 2021-6-9
	}
}

4.2构造方法的性质

构造方法有如下几种性质:

  1. 构造方法只负责对成员变量进行初始化,并不开辟空间
  2. 名字必须与类名相同
  3. 没有返回值类型,设置void也不行
  4. 构造方法是可以重载的(参数不同即可)
  5. 如果用户没有设置构造方法,编译器会自动生成一份默认(不带参数)的构造方法(一旦用户定义了构造方法,编译器就不再生成)

4.3成员变量初始化

那要是这样就有一个问题出现了:
“为什么成员变量不初始化使用时不会报错,而局部变量会报错呢????为什么为什么为什么??????”(接下来就会揭晓了!)

在这里插入图片描述

4.3.1默认初始化

要搞清楚这个问题,我们就要去探究new这个关键字发挥作用的过程。

Date date = new Date(2023124);//实例化对象
String date = "2023/12/4"//局部变量初始化

在程序层面只是简单的一条语句,在JVM层面需要做好多事情,下面简单介绍下:

  1. 检测对象对应的类是否加载了,如果没有加载则加载
  2. 为对象分配内存空间
  3. 处理并发安全问题
    比如:多个线程同时申请对象,JVM要保证给对象分配的空间不冲突
  4. 初始化分配的空间,如下:(这是不会报错的关键)
数据类型初始值
byte0
char“u0000”
short0
int0
long0L
booleanfalse
float0.0f
double0.0
referencenull
  1. 设置对象头信息
  2. 调用构造方法,给对象中各个成员赋值

4.3.2就地初始化

这个很好理解,就是在声明成员变量时,直接手动设置了初始值。

public class Date {
	public int year = 1900;
	public int month = 1;
	public int day = 1;
	
	public Date(){
	}
	
	public Date(int year, int month, int day) {
	}
	
	public static void main(String[] args) {
		Date d1 = new Date(2021,6,9);
		Date d2 = new Date();
	}
}

4.4构造方法快速创建

IDEA中有快速创建成员变量构造方法的操作。

操作步骤
1. 在IDEA中创建新的类和几个成员变量

class cat{
    String name;
    int age;
    String sex;
}

2.创建构造方法:右键代码空白处->选择generate->选择Constructor
在这里插入图片描述
在这里插入图片描述

3.在弹出的对话框中按住CTRL选择你想要构造的成员变量:
在这里插入图片描述

4.成功!!

在这里插入图片描述

5.封装

5.1封装的概念

面向对象程序三大特性:封装、继承、多态。 而类和对象阶段,主要研究的就是封装特性。何为封装呢?
简单来说
就是套壳屏蔽细节

5.2封装如何实现

Java中主要通过类和访问权限来实现封装:类可以将各类数据以及封装数据的方法结合在一起,而访问权限用来控制方法或者字段能否直接在类外使用。因此,Java提供了以下四种访问限定符:
private、public、protected、default
在这里插入图片描述

一般情况下成员变量一般设置为private,成员方法设置为public。

6.封装扩展之包

6.1什么是包

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

在Java中也引入了包,包是对类、接口等的封装机制的体线,是一种对类或者接口等很好的组织方式。

包还有一个重要作用:在同一个工程中允许存在相同名称的类,只要各自在不同的包中即可。

6.2怎么打开包(导入包的类)

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 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 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);
	}
}

6.3自定义包

基本规则

  • 在文件的最上方加上一个 package 语句指定该代码在哪个包中.
  • 包名需要尽量指定成唯一的名字, 通常会用公司的域名的颠倒形式(例如 com.bit.demo1 )
  • 包名要和代码路径相匹配. 例如创建 com.bit.demo1 的包, 那么会存在一个对应的路径 com/bit/demo1 来存储
    代码.
  • 如果一个类没有 package 语句, 则该类被放到一个默认包中.

操作步骤

  1. 在IDEA中先新建一个包:右键src -> 新建 -> 包
    在这里插入图片描述

  2. 在弹出的对话框中输入包名,例如com.test.demo1
    在这里插入图片描述

  3. 在包中创建类, 右键包名 -> 新建->类,然后输入类名即可
    在这里插入图片描述

  4. 此时可以看到我们的磁盘上的目录结构已经被 IDEA 自动创建出来了
    在这里插入图片描述

  5. 同时我们也看到了, 在新创建的 Test.java 文件的最上方, 就出现了一个 package 语句
    在这里插入图片描述

7.static成员

7.1再谈学生类

使用前文中介绍的学生类实例化三个对象s1、s2、s3,每个对象都有自己特有的名字、性别,年龄,学分绩点等成员信息,这些信息就是对不同学生来进行描述的,如下所示:

public class Student{
	// ...
	public static void main(String[] args) {
		Student s1 = new Student("Li leilei", "男", 18, 3.8);
		Student s2 = new Student("Han MeiMei", "女", 19, 4.0);
		Student s3 = new Student("Jim", "男", 18, 2.6);
	}
}

假设三个同学是同一个班的,那么他们上课肯定是在同一个教室,那既然在同一个教室,那能否给类中再加一个成员变量,来保存同学上课时的教室呢?答案是不行的。

之前在Student类中定义的成员变量,每个对象中都会包含一份(称之为实例变量),因为需要使用这些信息来描述具体的学生。而现在要表示学生上课的教室,这个教室的属性并不需要每个学生对象中都存储一份,而是需要让所有的学生来共享。在Java中,被static修饰的成员,称之为静态成员,也可以称为类成员,其不属于某个具体的对象,是所有对象所共享的。

7.2static修饰成员变量

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

【静态成员变量特性】

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

7.3static修饰成员方法

上面的学习我们知道一般类中的成员变量都设置为private,而成员方法设置为public,那设置之后,Student中的classRoom属性如何在类外访问呢?

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

【静态方法特性】

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

7.4static成员变量初始化

注意!静态成员变量一般不会放在构造方法中来初始化,构造方法中初始化的是与对象相关的实例属性

静态成员变量的初始化分为两种:就地初始化和静态代码块初始化

  1. 就地初始化
    就地初始化指的就是:在定义是直接给初始值
public class Student{
	private String name;
	private String gender;
	private int age;
	private double score;
	private static String classRoom = "430"; 
}
  1. 静态代码块初始化
    这里就到了代码块了,我们接着往下看就好了。

8.代码块

8.1代码块概念及分类

【基础概念】
使用{}定义的一段代码称为代码块。

根据代码块定义的位置以及关键字,又可以分为以下四种:

  • 普通代码块
  • 构造块
  • 静态块
  • 同步代码块(这里先不讨论)

8.2普通代码块

这个很好理解,就是定义在方法中的代码块。

public class Main{
public static void main(String[] args) {
	{ //直接使用{}定义,普通方法块
		int x = 10 ;
		System.out.println("x1 = " +x);
	}
	int x = 100 ;
	System.out.println("x2 = " +x);
	}
}

// 执行结果
x1 = 10
x2 = 100

8.3 构造代码块

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

public class Student{
	//实例成员变量
	private String name;
	private String gender;
	private int age;
	private double score;
	public Student() {
		System.out.println("I am Student init()!");
	}
	//实例代码块
	{
		this.name = "bit";
		this.age = 12;
		this.sex = "man";
		System.out.println("I am instance init()!");
	}
	public void show(){
		System.out.println("name: "+name+" age: "+age+" sex: "+sex);
	}
}
public class Main {
	public static void main(String[] args) {
		Student stu = new Student();
		stu.show();
	}
}

8.4静态代码块

static定义的代码块称为静态代码块。一般用于初始化静态成员变量。

public class Student{
	private String name;
	private String gender;
	private int age;
	private double score;
	private static String classRoom;

	//实例代码块
	{
		this.name = "bit";
		this.age = 12;
		this.gender = "man";
		System.out.println("I am instance init()!");
	}
	// 静态代码块
	static {
		classRoom = "bit306";
		System.out.println("I am static init()!");
	}
}

注意事项

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

结语

好了以上就是本篇“【Java】类和对象详解总结”博客的全部内容啦,感谢各位的阅读=v=,如有不足之处欢迎在评论区指出哦!!
觉得可以的话别忘了点赞三连支持一下欧!拜托啦这对我真的很重要o(>ω< )o!!!

请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

回溯和分支算法

状态空间图 “图”——状态空间图 例子&#xff1a;农夫过河问题——“图”状态操作例子&#xff1a;n后问题、0-1背包问题、货郎问题(TSP) 用向量表示解&#xff0c;“图”由解向量扩张得到的解空间树。 ——三种图&#xff1a;n叉树、子集树、排序树 ​ 剪枝 不满住条件的…

单细胞测序并不一定需要harmony去除批次效应

大家好&#xff0c;今天我们分享的是单细胞的学习教程https://www.singlecellworkshop.com/analysis-tutorial.html 教程的作者使用了四个样本&#xff0c;但是没有使用harmony或者其他方法去整合 去除批次效应。 主要内容&#xff1a; SCTransform流程代码及结果 harmony流程…

python pyaudio 录取语音数据

python pyaudio 录取语音数据 pyaudio安装方法&#xff1a; pip install pyaudio如果这个不行&#xff0c;可以尝试&#xff1a; pip install pipwin pipwin install pyaudio代码如下&#xff1a; import pyaudio import waveRESPEAKER_RATE 44100 # 采样率&#xff0c;每…

界面组件DevExpress Reporting v23.1新版亮点 - UX功能增强

DevExpress Reporting是.NET Framework下功能完善的报表平台&#xff0c;它附带了易于使用的Visual Studio报表设计器和丰富的报表控件集&#xff0c;包括数据透视表、图表&#xff0c;因此您可以构建无与伦比、信息清晰的报表 界面组件DevExpress Reporting v23.1已于前段时间…

无头浏览器与Selenium:探索无界爬虫的奇妙世界

selenium设置无头浏览器 背景 ​ 我们之前的selenium都是浏览器驱动自动打开一个网页&#xff0c;执行相关操作&#xff0c;其实也可以让其后台显示&#xff0c;不用在前台显示。 ​ 要设置无头浏览器&#xff0c;可以使用Selenium的Headless模式。在Headless模式下&#xf…

从零开始实现神经网络(二)_CNN卷积神经网络

参考文章: 介绍卷积神经网络1 介绍卷积神经网络2 在过去的几年里&#xff0c;关于卷积神经网络&#xff08;CNN&#xff09;的讨论很多&#xff0c;特别是因为它们彻底改变了计算机视觉领域。在这篇文章中&#xff0c;我们将建立在神经网络的基本背景知识的基础上&#xff0c;探…

GCN,GraphSAGE 到底在训练什么呢?

根据DGL 来做的&#xff0c;按照DGL 实现来讲述 1. GCN Cora 训练代码&#xff1a; import osos.environ["DGLBACKEND"] "pytorch" import dgl import dgl.data import torch import torch.nn as nn import torch.nn.functional as F from dgl.nn.pytorc…

质量小议35 -- SQL注入

已经记不得上次用到SQL注入是什么时候了&#xff0c;一些概念和操作已经模糊。 最近与人聊起SQL注入&#xff0c;重新翻阅&#xff0c;暂记于此。 重点&#xff1a;敏感信息、权限过大、未脱敏的输入/输出、协议、框架、数据包、明文、安全意识 SQL - Structured Query La…

时间序列预测实战(二十三)进阶版LSTM多元和单元预测(课程设计毕业设计首选)

一、本文介绍 本篇文章给大家带来的是利用我个人编写的架构进行LSTM模型进行时间序列建模&#xff08;专门为了时间序列领域新人编写的架构&#xff0c;简单且不同于市面上大家用GPT写的代码&#xff09;&#xff0c;包括结果可视化、支持单元预测、多元预测、模型拟合效果检测…

(C++)盛水最多的容器--双指针法

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream Offer。https://le…

软著项目推荐 深度学习图像风格迁移

文章目录 0 前言1 VGG网络2 风格迁移3 内容损失4 风格损失5 主代码实现6 迁移模型实现7 效果展示8 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习图像风格迁移 - opencv python 该项目较为新颖&#xff0c;适合作为竞赛课题…

【ArcGIS Pro微课1000例】0048:深度学习--人群计数

文章目录 一、小学回忆录二、深度学习计算人头数三、案例实现一、小学回忆录 加载配套实验数据包中的图片及训练模型。你还记得当年的小学毕业班有多少同学吗?今天我们就用ArcGIS提供的人工智能工具,重温一下童年记忆。 二、深度学习计算人头数 本案例使用到的是深度学习中…

[树莓派3B+][内核版本6.1]的linux内核编译+替换 (超详细)

学习Linux的内核编译&#xff0c;我使用的是x86 64位的18.04的ubuntu-linux虚拟机&#xff1a; 目录 树莓派的Linux内核源码安装 操作系统的启动过程 & Bootloader 单片机裸机&#xff1a;C51,STM32 X86&#xff0c;Intel&#xff1a;windows 嵌入式产品&#xff1a;…

CUDA简介——同步

1. 引言 前序博客&#xff1a; CUDA简介——基本概念CUDA简介——编程模式CUDA简介——For循环并行化CUDA简介——Grid和Block内Thread索引CUDA简介——CUDA内存模式 本文重点关注Thread同步和Barriers。 Threads并行执行&#xff0c;可能存在如下问题&#xff1a; 1&#…

芯擎科技与芯华章深度合作,软硬件协同开发加速车规级芯片创新

12月4日&#xff0c;系统级验证EDA解决方案提供商芯华章&#xff0c;与国产高端车规芯片设计公司芯擎科技正式建立战略合作。双方强强联手&#xff0c;芯擎科技导入芯华章相关EDA验证工具&#xff0c;赋能车规级芯片和应用软件的协同开发&#xff0c;助力大规模缩短产品上市周期…

PoE技术详解

标准的五类网线有四对双绞线&#xff0c;IEEE 802.3af和IEEE 802.3at允许两种用法&#xff1a;通过空闲线对供电或者数据线对供电。IEEE 802.3bt允许通过空闲线对供电、通过数据线对供电或者空闲线对和数据线对一起供电&#xff0c;如图16.1所示。 图 16.1 PoE供电线对 当在一…

第一节JavaScript 简介与使用

JavaScript简介 JavaScript是互联网上最流行的脚本语言&#xff0c;这门语言可用于HTML和Web&#xff0c;更广泛用于服务器、PC、电脑、智能手机等设备上。 JavaScript是一种轻量级的编程语言。 JavaScript是可插入HTML页面的编程代码。 JavaScript插入HTML页面后&#xff…

使用coco数据集进行语义分割:数据预处理与损失函数

如何coco数据集进行目标检测的介绍已经有很多了&#xff0c;但是关于语义分割几乎没有。本文旨在说明如何处理 stuff_train2017.json stuff_val2017.json panoptic_train2017.json panoptic_val2017.json&#xff0c;将上面那些json中的dict转化为图片的label mask&am…

【Proteus仿真】【Arduino单片机】蔬菜大棚温湿度控制系统设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用PCF8574、LCD1602液晶、DHT11温湿度传感器、按键、继电器、蜂鸣器、加热、水泵电机等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD160…

【模电】设置静态工作点的必要性

设置静态工作点的必要性 静态工作点为什么要设置静态工作点 静态工作点 在放大电路中&#xff0c;当有信号输入时&#xff0c;交流量与直流量共存。将输入信号为零、即直流电源单独作用时晶体管的基极电流 I B I\tiny B IB、集电极电流 I C I\tiny C IC、b - e间电压 U B E U\t…