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

news2024/11/22 16:42:23

文章目录

  • 一、继承的概述
    • (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

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

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

相关文章

vue3引入并加载unity工程的两种方式

1、使用unity-webgl插件 npm i unity-webglunity打包后的build文件夹是这样的 需要手动删除.unityweb这个后缀&#xff0c;完成后放在vue3项目的根目录下的public文件夹下。 下面是引入unity的vue组件,其中实例化UnityWebgl时的参数地址直接引用上面的对应文件地址 <scri…

Soul CEO张璐团队创新技术与用户共建,推动网络社交空间绿色发展

近年来,随着互联网社交成为青年人交友的主要方式之一,网络黑灰产业也随之蓬勃发展,新型网络犯罪层出不穷,给用户的安全带来了巨大挑战。为了维护用户的社交安全,国家相关部门不断开展着"净网"、"清朗"等专项行动。在这个背景下,Soul App的CEO张璐及其团队积…

一招教你,如何快速搭建属于自己的AI数字人直播系统!

随着AI技术的不断发展&#xff0c;AI数字人直播系统成为了直播行业的新宠。本文将向大家介绍如何在短时间内快速搭建AI数字人直播系统&#xff0c;并寻找合适的服务商进行OEM合作&#xff0c;为用户带来全新的直播体验。 这边有2种方法你可以选择代理加盟可靠的AI数字人直播系统…

【Java 进阶篇】Java BeanUtils 使用详解

Java中的BeanUtils是一组用于操作JavaBean的工具&#xff0c;它允许你在不了解JavaBean的具体内部结构的情况下&#xff0c;访问和修改其属性。本文将详细介绍Java BeanUtils的使用&#xff0c;包括如何获取和设置JavaBean的属性&#xff0c;复制属性&#xff0c;以及如何处理嵌…

VS Code 全局搜索代码变量名时,有些文件中有这个变量但是没有被搜索到的问题

可以打开visual studio code&#xff0c;打开文件->首选项->设置&#xff0c;去掉 Use Ignore Files 这个选项。

FL Studio21.2中文版终身免费更新

FL Studio水果音乐编曲软件中文版,一款强大的音乐制作软件,可以进行音乐编曲、剪辑、录音、混音。FL Studio中文官网提供各个版本编曲软件的正版购买与下载和众多编曲软件教程。 FL Cloud 音效库包含开放版权的Loop和采样&#xff0c;以及来自 FL Studio 著名用户的艺术家独家…

【安装】自建Rustdesk Server

文章目录 RustDesk说明RustDesk优点RustDesk相关链接非Docker基于CentOSRustDesk默认程序占用端口说明 启动 hbbr 是中继服务器启动 hbbs 是ID服务器客户端配置 RustDesk说明 RustDesk优点 自建服务端。搭建在自己的云服务器就相当于独享高速带宽&#xff01;点对点通信。TCP…

程序从编译到运行

一、程序的编译流程&#xff08;以 C 语言为例&#xff09; 编译一个 C 程序从可以分为四个阶段&#xff1a;预处理 --> 编译&#xff08;生成汇编代码&#xff09;--> 汇编 --> 链接。 下面以大家最熟悉的 hello world 程序为例&#xff0c;编译器为 linux 下的 gcc…

C语言实现斐波那契数列的多种方法

斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又称黄金分割数列&#xff0c;因数学家莱昂纳多斐波那契&#xff08;Leonardo Fibonacci&#xff09;以兔子繁殖为例子而引入&#xff0c;故又称为“兔子数列”。对于解决此类问题方法有四&#xff0c;前两…

代码随想录算法训练营第三十九天 | LeetCode 62. 不同路径、63. 不同路径 II

代码随想录算法训练营第三十九天 | LeetCode 62. 不同路径、63. 不同路径 II 文章链接&#xff1a;不同路径 不同路径II 视频链接&#xff1a;不同路径 不同路径II 1. LeetCode 62. 不同路径 1.1 思路 本题是个二维矩阵&#xff0c;因此 dp 数组也定义为二维的&…

select...for update 锁表了?

在MySQL中&#xff0c;事务A中使用select...for update where id1锁住了&#xff0c;某一条数据&#xff0c;事务还没提交&#xff0c;此时&#xff0c;事务B中去用select ... where id1查询那条数据&#xff0c;会阻塞等待吗&#xff1f; select...for update在MySQL中&#…

chatgpt 安卓版本提供google play商店版本太旧更新方法

多击play商店版本&#xff0c;开启开发者模式&#xff0c;再点击更新play商店。会自动下载最新版安装。记得开梯子。

太极培训机构展示服务预约小程序的作用如何

太极是适合男女老幼的&#xff0c;很多地方也有相关的学校或培训机构&#xff0c;由于受众广且不太受地域影响&#xff0c;因此对培训机构来说&#xff0c;除了线下经营外&#xff0c;线上宣传、学员获取和发展也不可少。 接下来让我们看下通过【雨科】平台制作太极教培服务预…

面试算法45:二叉树最低层最左边的值

题目 如何在一棵二叉树中找出它最低层最左边节点的值&#xff1f;假设二叉树中最少有一个节点。例如&#xff0c;在如图7.5所示的二叉树中最低层最左边一个节点的值是5。 分析 可以用一个变量bottomLeft来保存每一层最左边的节点的值。在遍历二叉树时&#xff0c;每当遇到新…

Apollo上车实践:打造安全、高效、舒适的出行体验

上车实践 概述自动驾驶车辆适配线控标准协议开环验证车辆 自动驾驶车辆集成了解传感器布置与连接了解车辆标定了解传感器标定循迹实践 自动驾驶测试与调车了解车辆安全操作流程了解实车控制调试了解实车定位调试 福利活动 主页传送门&#xff1a;&#x1f4c0; 传送 概述 通过…

C++设计模式_18_State 状态模式

State和Memento被归为“状态变化”模式。 文章目录 1. “状态变化”模式1.1 典型模式 2. 动机 (Motivation)3. 代码演示State 状态模式3.1 常规方式3.2 State 状态模式 4. 模式定义5. 结构( Structure )6. 要点总结7. 其他参考 1. “状态变化”模式 在组件构建过程中&#xf…

Apache ActiveMQ (版本 < 5.18.3) (CNVD-2023-69477)RCE修复方案/缓解方案

一、漏洞描述 Apache ActiveMQ 是美国阿帕奇&#xff08;Apache&#xff09;基金会的一套开源的消息中间件&#xff0c;它支持 Java 消息服务、集群、Spring Framework 等。 二、漏洞成因 ActiveMQ 默认开放了 61616 端口用于接收 OpenWire 协议消息&#xff0c;由于针对异常…

sqlite3 关系型数据库语言 SQL 语言

SQL(Structured Query Language)语言是一种结构化查询语言,是一个通用的,功能强大的关系型数据库操作语言. 包含 6 个部分: 1.数据查询语言(DQL:Data Query Language) 从数据库的二维表格中查询数据,保留字 SELECT 是 DQL 中用的最多的语句 2.数据操作语言(DML) 最主要的关…

视频下载工具Downie4 mac中文支持格式

Downie4 mac是一款视频下载工具。它支持下载各种视频网站上的视频&#xff0c;并且具有快速、稳定、易于使用的特点。 Downie支持下载各种视频网站上的视频&#xff0c;包括YouTube、Vimeo、Netflix、Hulu、Amazon等等。它具有快速、稳定的下载速度&#xff0c;可以帮助用户轻松…

HDFS架构介绍

数新网络_让每个人享受数据的价值浙江数新网络有限公司是一家开源开放、专注于云数据智能操作系统和数据价值流通的服务商。公司自主研发的DataCyber云数据智能操作系统&#xff0c;主要包括数据平台CyberData、人工智能平台CyberAI、数据智能引擎CyberEngine、数据安全平台Cyb…