【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!!!

请添加图片描述

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

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

相关文章

【VRTK】【VR开发】【Unity】10-连续移动

课程配套学习资源下载 https://download.csdn.net/download/weixin_41697242/88485426?spm=1001.2014.3001.5503 【概述】 连续移动与瞬移有如下不同: 连续移动不容易打断沉浸对于新手或者不适应者来说更容易晕动 我对玩家的建议:连续移动前后左右可以用摇杆,转向用自己…

低代码如何降低门槛、快速交付、实现可持续IT架构?

目录 低代码开发模式期望达成的目标 1.降低开发门槛 2.加快系统交付 3.建立可持续发展的IT架构 写在最后 低代码的概念&#xff0c;最早提出的时间是在2014年左右&#xff0c;随后一直处于上升期&#xff0c;随着前两年阿里、腾讯的相继入场&#xff0c;竞争逐步加大。低代…

设计简单高效的短链系统

目录 引言 1. 短链系统的原理 1.1 长链接生成短码 1.2 短码映射到长链接 1.3 短码重定向 1.4 过期短 URL 清理 2. 设计与实现 2.1 数据存储 2.2 短码生成 2.3 接口设计 2.4 安全性考虑 2.5 访问性能优化 引言 在当今数字化时代&#xff0c;人们对信息的分享需求不断…

市场缺口投资者应该怎么做? 昂首资本一招就能盈利

当在市场交易分析中&#xff0c;投资者发现市场缺口或者价格缺口的时候&#xff0c; 昂首资本问各位投资者应该怎么才能抓住机会盈利一波。 其实在技术分析中的这个术语指的是&#xff1a;前一根棒线的收盘价和下一根棒线的开盘价之间有差距的情况。例如&#xff0c;当做市商将…

【SpringBoot系列】SpringBoot时间字段格式化

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Allegro无法模块复用的解决办法

Allegro无法模块复用的解决办法 在用Allegro做PCB设计的时候,模块复用是使用的比较频繁的功能,对于有相同模块的单板,可以节省大量的时间。 模块复用的功能不细说,具体参考以前的文章。 有时会遇到模块复用的时候出现如下报错 无法匹配,有时如果因为Device而无法复用,就…

python提取通话记录中的时间信息

您需要安装适合中文的SpaCy模型。您可以通过运行 pip install spacypython -m spacy download zh_core_web_sm来安装和下载所需的模型。 import spacy# 加载中文模型 nlp spacy.load(zh_core_web_sm)# 示例电话记录文本 text """ Agent: 今天我们解决一下这…

Linux CentOS7 安装Docker

CentOS7安装Docker&#xff1a; Docker简介 Docker是一个开源的容器化平台&#xff0c;可帮助开发者轻松地创建、部署和运行应用程序。Docker使开发人员能够在一个独立的容器中打包应用程序及其依赖项&#xff0c;这样他们就可以轻松地将应用程序移植到任何其他环境中。Docke…

基础堆溢出原理与DWORD SHOOT实现

堆介绍 堆的数据结构与管理策略 程序员在使用堆时只需要做三件事情&#xff1a;申请一定大小的内存&#xff0c;使用内存&#xff0c;释放内存。 对于堆管理系统来说&#xff0c;响应程序的内存使用申请就意味着要在"杂乱"的堆区中"辨别"出哪些内存是正在…

Python实现交易策略评价指标-夏普比率

1.夏普比率的定义 在投资的过程中&#xff0c;仅关注策略的收益率是不够的&#xff0c;同时还需要关注承受的风险&#xff0c;也就是收益风险比。 夏普比率正是这样一个指标&#xff0c;它表示承担单位的风险会产生多少超额收益。用数学公式描述就是&#xff1a; S h a r p R…

【算法每日一练]-图论(保姆级教程 篇6(图上dp))#最大食物链 #游走

目录 题目&#xff1a;最大食物链 解法一&#xff1a; 解法二&#xff1a; 记忆化 题目&#xff1a;游走 思路&#xff1a; 题目&#xff1a;最大食物链 解法一&#xff1a; 我们标记f[i]是被f[x]捕食的点对应的类食物链数 不难得出&#xff1a; f[x]∑(f[i]) 首先从生…

206 反转链表

解题思路可以有两种方法&#xff1a;递归 or 迭代。 \qquad 迭代&#xff1a;通过使用for循环遍历&#xff0c;完成目标。方法直观&#xff0c;容易理解。 \qquad 递归&#xff1a;通过函数调用其自身&#xff0c;完成目标。递归最复杂、最重要的部分就是递归函数的构建&#…

【数据结构】——栈|队列(基本功能)

目录 栈 基本概念 栈的常见基本操作 栈的存储 ✌栈的基本操作实现 栈的构建 栈的初始化 入栈 打印栈 出栈 获取栈顶元素 获取栈的有效元素个数 判断栈是否为空 销毁栈 队列 基本概念 队列的常见基本操作 ✌队列的基本操作实现 队列的构建 初始化 入队列 出…

Spring Security 6.x 系列(9)—— 基于过滤器链的源码分析(二)

一、前言 在本系列文章&#xff1a; Spring Security 6.x 系列&#xff08;4&#xff09;—— 基于过滤器链的源码分析&#xff08;一&#xff09;中着重分析了Spring Security在Spring Boot 的自动配置、 DefaultSecurityFilterChain 的构造流程、FilterChainProxy 的构造流…

详解原生Spring当中的事务

&#x1f609;&#x1f609; 学习交流群&#xff1a; ✅✅1&#xff1a;这是孙哥suns给大家的福利&#xff01; ✨✨2&#xff1a;我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 &#x1f96d;&#x1f96d;3&#xff1a;QQ群&#xff1a;583783…

Spring Security 6.x 系列(8)—— 源码分析之配置器SecurityConfigurer接口及其分支实现

一、前言 本章主要内容是关于配置器的接口架构设计&#xff0c;任意找一个配置器一直往上找&#xff0c;就会找到配置器的顶级接口&#xff1a;SecurityConfigurer。 查看SecurityConfigurer接口的实现类情况&#xff1a; 在 AbstractHttpConfigurer 抽象类的下面可以看到所有…

idea类和方法模版

类模版 修改目标位置 class #if (${PACKAGE_NAME} && ${PACKAGE_NAME} ! "")package ${PACKAGE_NAME};#end #parse("File Header.java")/*** ${Description}* author whc ${YEAR}/${MONTH}/${DAY}* version v1.0 */public class ${NAME} { }inte…

【网络安全】虚假IP地址攻击如何防范?

在当今的网络时代&#xff0c;虚假IP地址攻击已成为一种新型的网络攻击方式&#xff0c;给网络安全带来了极大的威胁。那么&#xff0c;什么是虚假IP地址攻击&#xff1f;又如何进行溯源和防范呢&#xff1f;本文将为您揭开这一神秘面纱。 一、虚假IP地址攻击概述 虚假IP地址攻…

[python]离线加载fetch_20newsgroups数据集

首先手动下载这个数据包 http://qwone.com/~jason/20Newsgroups/20news-bydate.tar.gz 下载这个文件后和脚本放一起就行&#xff0c;然后 打开twenty_newsgroups.py文件&#xff08;在fetch_20newsgroups函数名上&#xff0c;右键转到定义即可找到&#xff09; 之后运行代码即…

羊大师教你如何有效应对冬季流感,保护自己与家人

羊大师教你如何有效应对冬季流感&#xff0c;保护自己与家人 随着冬季的临近&#xff0c;流感病毒将再次蔓延。如何预防冬季流感来袭&#xff0c;成为了许多人关注的话题。幸运的是&#xff0c;我们可以采取一系列的预防措施来保护自己和家人&#xff0c;避免被流感侵袭。下面…