Java面向对象(进阶)特征之二:继承性

文章目录

  • 一、继承的概述
    • (1)生活中的继承
    • (2) Java中的继承
      • 1、角度一:从上而下
      • 2、角度二:从下而上
    • (3)继承的好处
    • (4)总结
  • 二、继承的语法与应用举例
    • (1)继承的语法
      • 1、继承中的语法格式
      • 2、继承中的基本概念
      • 3、引入
      • 4、举例
      • 5、注意
      • 6、总结
    • (2)继承性的细节说明
  • 三、 练习
    • (1)练习1
    • (2)练习2

一、继承的概述

(1)生活中的继承

  • 财产继承

image.png

  • 绿化:前人栽树,后人乘凉

image.png

  • 样貌

image.png

  • 继承之外,还可以"进化"

继承有延续(下一代延续上一代的基因、财富)、扩展(下一代和上一代又有所不同)的意思。

父类中的一些功能,子类可以直接继承过来使用,同样子类也可以定义自己特有的功能

(2) Java中的继承

1、角度一:从上而下

为描述和处理个人信息,定义类Person
在这里插入图片描述
!

为描述和处理学生信息,定义类Student
在这里插入图片描述

“个人”与“学生”有这样包含的关系:
image.png

可以通过继承,简化Student类的定义:
在这里插入图片描述

让Student通过关键字extends继承于Person类,继承之后,在Person类中声明的属性(比如name,age,birthDate)在Student类中不用再写了,Student类可以直接获取Person类里面的属性,包括方法。

说明:Student类继承了父类Person的所有属性和方法,并增加了一个属性school。Person中的属性和方法,Student都可以使用。

2、角度二:从下而上

image.png

多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类中无需再定义这些属性和行为,只需要和抽取出来的类构成继承关系。如图所示:
image.png
“猫”与“狗”之间的关系:
image.png

再举例:
image.png

(3)继承的好处

  • 继承的出现减少了代码冗余提高了代码的复用性
  • 继承的出现,更有利于功能的扩展
  • 继承的出现让类与类之间产生了is-a的关系,为多态的使用提供了前提。 (比如Student–子类 is a Person–父类)
    • 继承描述事物之间的所属关系,这种关系是:is-a 的关系。可见,父类更通用、更一般,子类更具体。

注意:不要仅为了获取其他类中某个功能而去继承!比如猫能吃喝,人也能吃喝,不要让人继承了猫,根本不是一个种类!!!

(4)总结

继承性的理解

①生活上:财产的继承、颜值的继承

②代码层面:

<1> 自上而下:定义了一个类A,在定义另一个类B时,发现类B的功能与类A相似,考虑类B–子类继承于类A–父类(B->A),先有父类,后有子类。

<2> 自下而上:定义了类B,C,D等,发现B、C、D有类似的属性和方法,则可以考虑将相同的属性和方法进行抽取,封装到类A中,让类B、C、D继承于类A,同时类B、C、D中的相似的功能就可以删除了。

二、继承的语法与应用举例

(1)继承的语法

1、继承中的语法格式

通过 extends 关键字,可以声明一个类B继承另外一个类A,定义格式如下:

[修饰符] classA {
	...
    //属性、方法
}

[修饰符] classB extendsA {	//B继承了A(B是A的子类)
	...
}

2、继承中的基本概念

类A,称为父类、超类、基类(base class)、SuperClass

类B,称为子类、派生类(derived class)、SubClass

3、引入

之前写代码都是这样:

【Person.java】

public class Person {
    //属性
    String name;
    int age;

    //方法
    public void eat(){
        System.out.println("人吃饭");
    }

    public void sleep(){
        System.out.println("人睡觉");
    }
}

【Student.java】

public class Student {
    //属性
    String name;
    int age;

    String school;

    //方法
    public void eat(){
        System.out.println("人吃饭");
    }

    public void sleep(){
        System.out.println("人睡觉");
    }

    public void study(){
        System.out.println("学生学习");
    }
}

【ExtendsTest.java】

public class ExtendsTest {
    public static void main(String[] args) {
        Person p1=new Person();
        p1.name="Tom";
        p1.eat();

        Student s1=new Student();
        s1.name="Jack";
        s1.eat();
    }
}

若此时将Student类中的name、age属性和eat()、sleep()方法注释调,那么在测试类里面就会报错,如下:

image.png

此时将Student继承于Person类即可:

image.png

运行也不会有什么问题:

image.png


4、举例

1.父类

package com.atguigu.inherited.grammar;

/*
 * 定义动物类Animal,做为父类
 */
public class Animal {
    // 定义name属性
    String name;
    // 定义age属性
    int age;

    // 定义动物的吃东西方法
    public void eat() {
        System.out.println(age + "岁的"
                + name + "在吃东西");
    }
}

2.子类

package com.atguigu.inherited.grammar;

/*
 * 定义猫类Cat 继承 动物类Animal
 */
public class Cat extends Animal {
    int count;//记录每只猫抓的老鼠数量

    // 定义一个猫抓老鼠的方法catchMouse
    public void catchMouse() {
        count++;
        System.out.println("抓老鼠,已经抓了"
                + count + "只老鼠");
    }
}

3.测试类

package com.atguigu.inherited.grammar;

public class TestCat {
    public static void main(String[] args) {
        // 创建一个猫类对象
        Cat cat = new Cat();
        // 为该猫类对象的name属性进行赋值
        cat.name = "Tom";
        // 为该猫类对象的age属性进行赋值
        cat.age = 2;
        // 调用该猫继承来的eat()方法
        cat.eat();
        // 调用该猫的catchMouse()方法
        cat.catchMouse();
        cat.catchMouse();
        cat.catchMouse();
    }
}

5、注意

1.通过让子类(Student)继承于父类(Person),子类就获取到了父类中声明的属性和方法。

2.子类可以调用父类中的构造器,不认为直接在子类中加载父类的构造器,因为构造器要与类同名,在子类Person中声明的构造器叫Person是不合适的。

3.引入继承之后,Student类里面虽然只声明了一个属性school,但是在创建Student对象时。堆空间仍然会有三个属性(包括父类Person类的属性)。如下:
image.png


4.【调试】

我们也可以调试看一下,

首先在Student s1=new Student();这一行左边点一下,出现一个红色的点(断点);然后在上方点击“调试”:(不想要断点可以再点击一下红点位置)

image.png

然后:

image.png

往下执行一行:

image.png

这里显示了属性,可以看到有三个属性:

image.png


5.封装性问题

私有的属性只能在本类中使用,子类中不能使用

有了继承,封装性不会被打破。

比如此时让Person类(父类)的age属性私有化,在Student类(子类)中就不能直接调用这个私有属性了,如下:

image.png

但是Student子类还是拥有了父类的所有属性,只是不能直接调用而已,可以调试一下看看,还是有age属性的。

如下:

image.png

当然,p1自己也不能调用这个属性,都受到封装性的影响:

image.png

若想使用这个私有属性,那就只能提供它的set/get方法:

image.png

有了封装性可以拿到属性,只是不能访问而已。


6.默认的父类

Java中声明的类,如果没有显式的声明其父类时,则默认继承于java.lang.Object

比如调用p1的方法,可以看到还可以调用不在Person类里面的方法:(红色部分)

image.png

可以调用一下toString返回一个字符串,默认打印对象的地址,如下:

image.png

toString方法在Person类中并没有被定义,既然这里能够调用,那么一定来自父类。

想要知道这个方法来自哪里,可以按住Ctrl键点击这个方法,然后就会跳转到这个类中:

image.png

所以Person类的父类是Object

当然,也可以验证一下。

以Student类为例,获取它所属的类:s1.getClass();然后再去获取它的父类:s1.getClass().getSuperclass();(就是Student类的父类是谁)

可以发现,父类就是Person类:

image.png

还可以看一下Person类的父类:p1.getClass().getSuperclass();如下:

image.png

6、总结

有了继承性以后:

①子类就获取到了父类中声明的所有的属性和方法。

但是,由于封装性的影响,可能子类不能直接调用父类中声明的属性或方法。

②子类在继承父类以后,还可以扩展自己特有的功能(体现:增加特有的属性、方法)

extends:延展、扩展、延伸

③子类和父类的理解,要区别于集合和子集

④不要为了继承而继承。在继承之前,判断一下是否有is a的关系。

(2)继承性的细节说明

1、子类会继承父类所有的实例变量和实例方法

从类的定义来看,类是一类具有相同特性的事物的抽象描述。父类是所有子类共同特征的抽象描述。而实例变量和实例方法就是事物的特征,那么父类中声明的实例变量和实例方法代表子类事物也有这个特征。

  • 当子类对象被创建时,在堆中给对象申请内存时,就要看子类和父类都声明了什么实例变量,这些实例变量都要分配内存。
  • 当子类对象调用方法时,编译器会先在子类模板中看该类是否有这个方法,如果没找到,会看它的父类甚至父类的父类是否声明了这个方法,遵循从下往上找的顺序,找到了就停止,一直到根父类都没有找到,就会报编译错误。

所以继承意味着子类的对象除了看子类的类模板还要看父类的类模板。

在这里插入图片描述

2、子类不能直接访问父类中私有的(private)的成员变量和方法

子类虽会继承父类私有(private)的成员变量,但子类不能对继承的私有成员变量直接进行访问,可通过继承的get/set方法进行访问。

如图所示:
image.png

3、在Java 中,继承的关键字用的是“extends”,即子类不是父类的子集,而是对父类的“扩展”

子类在继承父类以后,还可以定义自己特有的方法,这就可以看做是对父类功能上的扩展

4、Java支持多层继承(继承体系)
image.png

Student是Graduate的直接父类,Person是Graduate的间接父类。

  • Java是支持多层继承。(可以有子类,子类也可以再有父类)
  • 概念:直接父类、间接父类
  • Java中的子父类的概念是相对的,Student相对于Person是子类,相对于Graduate是父类。
  • Java中一个父类可以声明多个子类。反之,一个子类只能有一个父类(Java的单继承性–类的层面,后边接口可以有多个父接口,关键字也是extends)
  • 类–单继承,接口–多继承
class A{}
class B extends A{}
class C extends B{}

说明:

  • 子类和父类是一种相对的概念
  • 顶层父类是Object类。所有的类默认继承Object,作为父类。
  • 一个父类可以被多个子类所继承,但是一个子类不能有多个父类

5、一个父类可以同时拥有多个子类

class A{}
class B extends A{}
class D extends A{}
class E extends A{}

6、Java只支持单继承,不支持多重继承
image.png

public class A{}
class B extends A{}

//一个类只能有一个父类,不可以有多个直接父类。
class C extends B{} 	//ok
class C extends A,B...	//error

三、 练习

(1)练习1

🌋题目描述

(1)定义一个ManKind类,包括

  • 成员变量int sex和int salary;
  • 方法void manOrWoman():根据sex的值显示“man”(sex==1)或者“woman”(sex==0);
  • 方法void employeed():根据salary的值显示“no job”(salary==0)或者“ job”(salary!=0)。

(2)定义类Kids继承ManKind,并包括

  • 成员变量int yearsOld;
  • 方法printAge()打印yearsOld的值。

(3)定义类KidsTest,在类的main方法中实例化Kids的对象someKid,用该对象访问其父类的成员变量及方法。

🤺代码

父类中声明的属性和方法都被继承到子类了,构造器就不提了。后边提super关键字的时候会提到,在子类当中调用父类中的构造器。

【 Mankind.java】

package yuyi05;

/**
 * ClassName: Mankind
 * Package: yuyi05
 * Description:
 * (1)定义一个ManKind类,包括
 *    成员变量int sex和int salary;
 * - 方法void manOrWoman():根据sex的值显示“man”(sex==1)或者“woman”(sex==0);
 *
 * - 方法void employeed():根据salary的值显示“no job”(salary==0)或者“ job”(salary!=0)。
 * @Author 雨翼轻尘
 * @Create 2023/10/30 0030 10:32
 */
public class Mankind {
    //属性
    private int sex;
    private int salary;

    //方法

    public int getSex() {
        return sex;
    }

    public void setSex(int sex) {
        this.sex = sex;
    }

    public int getSalary() {
        return salary;
    }

    public void setSalary(int salary) {
        this.salary = salary;
    }

    public void manOrWoman(){
        if(sex==1){
            System.out.println("man");
        } else if (sex==0) {
            System.out.println("woman");
        }
    }

    public void employeed(){
        if(salary==0){
            System.out.println("no job");
        } else {
            System.out.println("job");
        }
    }

    //构造器

    public Mankind() {

    }

    public Mankind(int sex, int salary) {
        this.sex = sex;
        this.salary = salary;
    }
}

【Kids.java】

package yuyi05;

/**
 * ClassName: Kids
 * Package: yuyi05
 * Description:
 *   (2)定义类Kids继承ManKind,并包括
 * - 成员变量int yearsOld;
 * - 方法printAge()打印yearsOld的值。
 * @Author 雨翼轻尘
 * @Create 2023/10/30 0030 10:56
 */
public class Kids extends Mankind { //父类中声明的属性和方法都被继承到子类了,构造器就不提了。后边提super关键字的时候会提到,在子类当中调用父类中的构造器
    private int yearOld;

    public int getYearOld() {
        return yearOld;
    }

    public void setYearOld(int yearOld) {
        this.yearOld = yearOld;
    }

    public void printAge(){
        System.out.println("I am "+yearOld+" years old");
    }

    //构造器
    public Kids(){

    }

    public Kids(int yearOld){
        this.yearOld=yearOld;
    }

    //把父类中的属性也做一个赋值,包括自己的属性
    public Kids(int sex, int salary,int yearOld){
        this.yearOld=yearOld;
        //sex、salary两个 属性是父类继承过来的,怎么给他们赋值?
        setSex(sex);
        setSalary(salary);
    }
}

【KidsTest.java】

package yuyi05;

/**
 * ClassName: KidsTest
 * Package: yuyi05
 * Description:
 *(3)定义类KidsTest,在类的main方法中实例化Kids的对象someKid,用该对象访问其父类的成员变量及方法。
 * @Author 雨翼轻尘
 * @Create 2023/10/30 0030 10:58
 */
public class KidsTest {
    public static void main(String[] args) {
        Kids someKid=new Kids();
        someKid.setSex(1);
        someKid.setSalary(100);
        someKid.setYearOld(12);

        //Kids类自己声明的方法
        someKid.printAge();

        //来自于父类中声明的方法
        someKid.manOrWoman();
        someKid.employeed();

    }
}

👻运行结果
image.png

⚡注意

1.父类中声明的属性和方法都被继承到子类了,构造器就不提了。后边提super关键字的时候会提到,在子类当中调用父类中的构造器怎么调用。

目前只能通过ManKind类中的方法去调用ManKind类中的属性,如下:

public class Kids extends Mankind { 
    private int yearOld;
    //...

    //构造器

    //把父类中的属性也做一个赋值,包括自己的属性
    public Kids(int sex, int salary,int yearOld){
        this.yearOld=yearOld;
        //sex、salary两个 属性是父类继承过来的,怎么给他们赋值?
        setSex(sex);
        setSalary(salary);
    }
}

2.赋值过程

public class KidsTest {
    public static void main(String[] args) {
        Kids someKid=new Kids();
        someKid.setSex(1);
        someKid.setSalary(100);
        someKid.setYearOld(12);

    }
}

对象刚创建好:

image.png

执行结束:

image.png

(2)练习2

🌋题目描述

根据下图实现相关的类。

image.png

在CylinderTest类中创建Cylinder类的对象,设置圆柱的底面半径和高,并输出圆柱的体积。

🤺代码

【Circle.java】

package yuyi06;

/**
 * ClassName: Circle
 * Package: yuyi06
 * Description:
 *
 * @Author 雨翼轻尘
 * @Create 2023/10/31 0031 10:07
 */
public class Circle {
    //属性
    private double radius;  //半径
    //方法
    public void setRadius(double radius){
        this.radius=radius;
    }
    public double getRadius(){
        return radius;
    }
    //求圆的面积
    public double findArea(){
        return Math.PI*radius*radius;
    }

    //构造器
    public Circle(){
        radius=1;
    }
}

【Cylinder.java】

package yuyi06;

/**
 * ClassName: Cylinder
 * Package: yuyi06
 * Description:
 *  圆柱类
 * @Author 雨翼轻尘
 * @Create 2023/10/31 0031 10:19
 */
public class Cylinder extends Circle{
    //属性
    private double length;  //高

    //方法
    public void setLength(double length){
        this.length=length;
    }
    public double getLength(){
        return length;
    }
    //求圆柱的体积
    public double findVolume(){
        //return Math.PI*getRadius()*getRadius()*getLength();
        return findArea()*getLength();
    }


    //构造器
    public Cylinder(){
        length=1;
    }
}

【CylinderTest.java】

package yuyi06;

/**
 * ClassName: CylinderTest
 * Package: yuyi06
 * Description:
 *
 * @Author 雨翼轻尘
 * @Create 2023/10/31 0031 10:29
 */
public class CylinderTest {
    public static void main(String[] args) {
        Cylinder cy=new Cylinder();
        cy.setRadius(2.3);
        cy.setLength(1.4);
        System.out.println("圆柱的体积为: "+cy.findVolume());
        System.out.println("圆柱的底面积为: "+cy.findArea());
    }
}

👻运行结果
image.png

⚡注意

调试:
image.png

Cylinder是我们声明的构造器,这个构造器里面,我们将高length设置为了1,如下:

public Cylinder(){
    length=1;
}

而在内存中,可以发现半径radius也是1.0。这里肯定调用了Circle构造器。

public Circle(){
    radius=1;
}

Cylinder是子类对象,子类对象在创建的时候,要调用父类的构造器,这个后边再说。

然后通过set属性给两个属性赋值:
image.png

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

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

相关文章

SpringBoot通过注解形式实现系统操作日志

介绍 我们在日常开发工作中&#xff0c;肯定逃不开与日志接触&#xff0c;一些比较严谨的后台管理系统里面会涉及到一些比较重要的资料&#xff0c;有些公司为了知道有哪些人登录了系统&#xff0c;是谁在什么时候修改了用户信息或者资料&#xff0c;所以就有了操作日志这么个…

灯串上亚马逊加拿大合规标准CSA认证如何办理?

灯串 灯串和配件都是插头连接的便携式、临时性商品&#xff0c;最大额定输入电压为 120 伏。 本政策适用于季节性照明、装饰性灯具以及灯串。 亚马逊灯串政策 根据亚马逊的要求&#xff0c;所有季节性和装饰性灯串均应经过检测&#xff0c;并且遵守下列法规、标准和要求&…

LabVIEW应用开发——基本函数(一)

前面我们介绍了一些控件的介绍和属性的配置&#xff0c;想要完成一个软件只会拖控件肯定是不行的&#xff0c;没办法实现既有的功能。比如我们要实现从串口中读到数据&#xff0c;根据一定的协议解析&#xff0c;然后转换成各个参数的值的显示&#xff0c;包括时间、电压、电流…

VIVO应用商店评论数据抓取

VIVO应用商店的app评论数据抓取 每个应用的评论能获取到最新的 100页 数据 每页20条&#xff0c;也就是 2000条评论数据 接口&#xff1a; pl.appstore.vivo.com.cn/port/comments/ 爬取运行截图&#xff1a;

Win10系统 如何使用cmd脚本命令,连接到指定WIFI并免手工输入WIFI密码连接?

环境&#xff1a; Win10 专业版 19041 WiFi 名称&#xff1a;LTG 问题描述&#xff1a; Win10系统 如何使用cmd脚本命令&#xff0c;连接到指定WIFI并免手工输入WIFI密码连接&#xff1f; 解决方案&#xff1a; 1.找一台已经连接过LTG这个wifi的电脑&#xff0c;导出.xlm配…

Octave Convolution学习笔记 (附代码)

论文地址&#xff1a;https://export.arxiv.org/pdf/1904.05049 代码地址&#xff1a;https://gitcode.com/mirrors/lxtgh/octaveconv_pytorch/overview?utm_sourcecsdn_github_accelerator 1.是什么&#xff1f; OctaveNet网络属于paper《Drop an Octave: Reducing Spatia…

系列四、Springboot中使用DevTools

一、概述 日常开发中&#xff0c;修改了一个类的很小一部分&#xff0c;例如HelloService中有这样的一个方法listAllCity()&#xff0c;代码如下&#xff1a; Service public class HelloService {public List<String> listAllCity() {List<String> cities Arrays…

第一次使用配音软件要怎么选择?

现在的配音软件软件很多&#xff0c;各种类型的都比较多&#xff0c;对于新手小白来说不知该如何选择&#xff0c;今天就来给你分享几款好用的配音软件。不论是制作短视频还是制作平常音频都完全可以。第一款&#xff1a;悦音配音这是一款专业的视频配音软件&#xff0c;多端使…

轻量级gif制作工具 GIFfun中文 for mac

GIFfun是一款GIF制作工具&#xff0c;可以帮助用户从照片和视频中创建GIF动画。该软件具有多种功能&#xff0c;例如GIF转视频、视频转GIF、照片转GIF、照片转视频、GIF转JPG、调整GIF大小、PDF转GIF、PDF转JPG、裁剪视频、GIF编辑等。 GIFfun还提供了专业版功能&#xff0c;如…

Unity 粒子特效-第三集-星星闪烁特效

一、特效预览 二、制作原理 星星素材资源 链接&#xff1a;https://pan.baidu.com/s/17D-9sC-ErtqmUxl81Ln1Mw?pwdndm9 提取码&#xff1a;ndm9 1.素材介绍 仔细看&#xff0c;我们的粒子贴图是&#xff08;如下&#xff09;&#xff0c;一颗星星 2.步骤介绍 1.星星动画的…

微信小程序 - 页面继承(非完美解决方案)

微信小程序 - 面页继承&#xff08;非完美解决方案&#xff09; 废话思路首页 indexindex.jsindex.jsonindex.wxml 父页面 page-basepage-base.jspage-base.wxml 子页面 page-apage-a.jspage-a.wxml 子页面 page-bpage-b.jspage-b.wxml 其它app.jsapp.jsonapp.wxss 参考资料 废…

靶机DC系列 DC:1

DC:1 文章目录 DC:1信息收集端口IP信息网页信息 漏洞利用shell提权 信息收集 端口IP信息 使用arp-scan获得靶机ip 使用nmap对端口进行详细扫描 可以看到该目标机开放了三个端口 有ssh、http、rpcbind服务 其中rpcbind是拥有该漏洞可使攻击者在远程rpcbind绑定主机上分配任意…

信道数据传输速率、信号传播速度——参考《天勤计算机网络》

一、缘起题目 二、解析 三、总结 信道数据传输速率和信号传播速度是两个不同的概念。 3.1 信道数据传输速率&#xff08;Channel Data Transfer Rate&#xff09; 指的是在通信系统中&#xff0c;通过信道传输的数据量&#xff0c;通常以 比特率&#xff08;bits per second…

第19章_写在最后

第19章_写在最后 分享1 分享2 如何看待生活上、工作上的冗余、反冗余&#xff1f; 又如何看待社会的脆弱性&#xff1f;反脆弱性&#xff1f; 个人如何应对&#xff1f;

[Linux]线程池

[Linux]线程池 文章目录 [Linux]线程池线程池的概念线程池的优点线程池的应用场景线程池的实现 线程池的概念 线程池是一种线程使用模式。线程池是一种特殊的生产消费模型&#xff0c;用户作为生产者&#xff0c;线程池作为消费者和缓冲区。 线程过多会带来调度开销&#xff0c…

ElasticSearch深度解析入门篇:高效搜索解决方案的介绍与实战案例讲解,带你避坑

ElasticSearch深度解析入门篇&#xff1a;高效搜索解决方案的介绍与实战案例讲解&#xff0c;带你避坑 1.Elasticsearch 产生背景 大规模数据如何检索 如&#xff1a;当系统数据量上了 10 亿、100 亿条的时候&#xff0c;我们在做系统架构的时候通常会从以下角度去考虑问题&a…

Android问题笔记四十三:JNI 开发如何快速定位崩溃问题

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&…

【c++|opencv】二、灰度变换和空间滤波---2.直方图和均衡化

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 图像直方图、直方图均衡化 1. 图像直方图 #include <iostream> #include <opencv2/opencv.hpp>using namespace cv; using namespace std;…

Django之登录注册

最近在准备上线一个网站&#xff08;基于django的编程技术学习与外包服务网站&#xff09;&#xff0c;所以会将自己的在做这个项目的过程中遇到的模块业务以及所涉及到的部分技术记录在CSDN平台里&#xff0c;一是希望可以帮到有需要的同学&#xff0c;二十以供自己后续回顾学…

玩转ChatGPT:批量下载Alphafold的蛋白pdb文件

一、写在前面 突发奇想&#xff0c;想批量下载Alphafold网站的蛋白pdb文件&#xff0c;后续再做个分子对接用。又不想手动下载&#xff0c;来求助CSDN和GPT。 二、CSDN白嫖基础代码 CSDN大神多&#xff0c;这不&#xff0c;找到一个&#xff1a;Alphafold批量下载蛋白的pdb文…