面向对象编程第二式:继承 (Java篇)

本篇会加入个人的所谓‘鱼式疯言’
❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言
而是理解过并总结出来通俗易懂的大白话,
小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的.
🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能接受我们这个概念 !!!
在这里插入图片描述

前言

上节面向对象编程第一式:封装 中小编提及了,我们面向对象的三大特性就是: 封装,继承,多态。

在本篇文章中,小编将带着大家越入 面向对象编程的第二式: 继承

那么什么是继承,为什么需要继承,继承的优点有哪些 ? ? ?
以及继承和我们上篇学过的封装有什么关联 ? ? ?

在小编都会带着大家找到以上问题的答案 💕 💕 💕

目录

  1. 继承
  2. super 关键字
  3. protected 限定符
  4. 继承方式
  5. final 关键字
  6. 继承与组合

一. 继承

小伙伴一定很疑惑 为什么要继承呢 🤔 🤔 🤔

1. 继承的初识

Java 中使用类对现实世界中实体来进行描述,类经过 实例化之后的产物对象 ,则可以用来表示现实中的 实体

但是现实世界错综复杂,事物之间可能会存在一些 关联,那在设计程序是就需要考虑。

比如:狗和猫,它们都是一个动物。

使用Java语言来进行描述,就会设计出:

<1>. 举个栗子

当小伙伴需要定义一个 dog 类时是不是 这样写的
在这里插入图片描述

// Dog.javaclass Dog{public String name;int age;float weight;public void eat(){System.out.println(name + "正在吃饭");}public void sleep(){System.out.println(name + "正在睡觉");}void Bark(){System.out.println(name + "汪汪汪~~~");}
}

当小伙伴需要定义一个 cat 时是不是这样写的
在这里插入图片描述

// Cat.Java
class Cat{String name;int age;float weight;public void eat(){System.out.println(name + "正在吃饭");}public void sleep(){System.out.println(name + "正在睡觉");}void mew(){System.out.println(name + "喵喵喵~~~");}
}

通过观察上述代码会发现,猫和狗的类存在 大量重复 的代码

在这里插入图片描述

那能否将这些共性抽取呢?

面向对象思想中提出了继承的概念,专门用来进行共性抽取,实现代码复用。

2. 继承的概念

继承(inheritance)机制:是面向对象程序设计使代码可以复用的最重要的手段
它允许程序员在保持原有类特性的基础上进行 扩展,增加新功能 ,这样产生新的类, 称派生类 。继承呈现了面向对象程序设计的层次结构,

体现了由简单到复杂的认知过程。继承主要解决的问题是:

共性的抽取,实现代码复用。

例如:狗和猫都是动物,那么我们就可以将共性的内容进行抽取,然后采用 继承的思想 来达到共用。

在这里插入图片描述
上述图示中,Dog和Cat都继承了 Animal类,其中:Animal类称为 父类/基类或超类

Dog和Cat 可以称为Animal的 子类/派生类 ,继承之后,子类可以复用 父类中成员 ,子类在实现时只需关心自己 新增加的成员 即可。

从继承概念中可以看出继承最大的作用就是:实现代码复用,还有就是来实现多态 (下篇文章讲解)。

鱼式疯言

一句话总结下继承的特点就是:

  • 复用代码,共性抽

继承的概念我们明白了,下面就让我们实操一下吧 😃 😃 😃

下面让小编带着感受下继承的语法是怎么样的

3. 继承的语法

在 Java 中如果要表示类之间的关系,需要借助 extends 关键字
具体如下:

修饰符 class 子类 extends 父类 {
// …
}

catdog 中场景使用继承方式重新设计:

// Animal.java
class Animal{String name;int age;public void eat(){System.out.println(name + "正在吃饭");}public void sleep(){System.out.println(name + "正在睡觉");}
}
// Dog.java
class Dog extends Animal{void bark(){System.out.println(name + "汪汪汪~~~");}
}class Cat extends Animal{void mew(){System.out.println(name + "喵喵喵~~~");}
}class Test {public static void main(String[] args) {Cat cat=new Cat();cat.name="小喵";cat.sleep();Dog dog=new Dog();dog.name="阿黄";dog.bark();}
}

在这里插入图片描述
从中我们可以看出效果是一样哒,但值得注意的是有以下两点哦 💖 💖 💖

鱼式疯言

注意:

  1. 子类会将父类中的成员变量或者成员方法继承到子类中
  1. 子类继承父类之后,必须要新添加自己特有的成员,体现出与父类的不同,否则就没有必要继承了。

可小爱同学问题就来了,如果我们子类要访问父类的成员该怎么操作呢 ! ! !

这不小编也准备了嘛 ,下面请看 💖 💖 💖

4. 父类成员访问

<1>.子类中访问父类不同名的成员变量

在继承体系中,子类将父类中的方法和字段继承下来了

那在子类中能否直接访问父类中继承下来的成员呢?

class Base {int a;int b;
}
class Derived extends Base{int c;public void method(){a = 10; // 访问从父类中继承下来的ab = 20; // 访问从父类中继承下来的bc = 30; // 访问子类自己的c}
}class Test {public static void main(String[] args) {Derived derived=new Derived();derived.method();System.out.println(derived.a);System.out.println(derived.b);System.out.println(derived.c);}
}

在这里插入图片描述

<2>.子类中访问父类同名的成员变量

public class Base {
int a;
int b;
int c;
}
/
public class Derived extends Base{
int a; // 与父类中成员a同名,且类型相同
char b; // 与父类中成员b同名,但类型不同
public void method(){
a = 100; // 访问父类继承的a,还是子类自己新增的a?
b = 101; // 访问父类继承的b,还是子类自己新增的b?
c = 102; // 子类没有c,访问的肯定是从父类继承下来的c
// d = 103; // 编译失败,因为父类和子类都没有定义成员变量b
}
}

在这里插入图片描述

由上面的运行结果我们可以看出:

在子类方法中 或者 通过子类对象访问成员时:

  • 如果访问的成员变量子类中有,优先访问自己的成员变量。

  • 如果访问的成员变量子类中无,则访问父类继承下来的,如果父类也没有定义,则编译报错。

  • 如果访问的成员变量与父类中成员变量同名,则优先访问自己的。

鱼式疯言

总结起来就一句话的事

成员变量访问遵循就近原则,自己有优先自己的,如果没有则向父类中找。

<3>. 子类访问父类不同的成员方法

class Base {public void methodA(){System.out.println("Base中的methodA()");}
}
class Derived extends Base{public void methodB(){System.out.println("Derived中的methodB()方法");}public void methodC(){methodB(); // 访问子类自己的methodB()methodA(); // 访问父类继承的methodA()
// methodD(); // 编译失败,在整个继承体系中没有发现方法methodD()}
}class Test {public static void main(String[] args) {Derived derived=new Derived();derived.methodA();derived.methodB();derived.methodC();}
}

在这里插入图片描述
从中我们也可以得出一个小收获 ❤️ ❤️ ❤️

总结:成员方法没有同名时,在子类方法中或者通过子类对象访问方法时

则优先访问自己的,自己没有时再到父类中找,如果父类中也没有则报错。

<4>. 子类访问父类相同的成员方法

 class Base {public void methodA(){System.out.println("Base中的methodA()");}public void methodB(){System.out.println("Base中的methodB()");}
}class Derived extends Base{public void methodA(int a) {System.out.println("Derived中的method(int)方法");}public void methodB(){System.out.println("Derived中的methodB()方法");}public void methodC(){methodA(); // 没有传参,访问父类中的methodA()methodA(20); // 传递int参数,访问子类中的methodA(int)methodB(); // 直接访问,则永远访问到的都是子类中的methodB(),基类的无法访问到}
}class Test {public static void main(String[] args) {Derived derived=new Derived();derived.methodA(100);derived.methodB();derived.methodC();}
}

在这里插入图片描述
小编具体说明一下吧:

  • 通过子类对象访问父类与子类中不同名方法时,优先在子类中找,找到则访问,否则在父类中找,找到则访问,否则编译报错。

  • 通过派生类对象访问父类与子类同名方法时,如果父类和子类同名方法的参数列表不同(重载),根据调用方法适传递的参数选择合适的方法访问,如果没有则报错;

鱼式疯言

还是那句话

成员方法访问遵循就近原则,自己有优先自己的,如果没有则向父类中找。

这时小爱同学就很坚持的问:

那我非要在子类中访问父类的成员变量该怎么做呢?

这时我们就不得不引出下一节的内容: super 关键字啦 😊 😊 😊

二. super 关键字

由于设计不好,或者因场景需要,子类和父类中可能会存在相同名称的成员

如果要在子类方法中访问父类同名成员时,该如何操作?

直接访问是 无法做到 的,Java提供了 super关键字

该关键字主要作用:在子类方法中访问父类的成员。

1. super的实际运用

 class Base {int a;int b;public void methodA(){System.out.println("Base中的methodA()");}public void methodB(){System.out.println("Base中的methodB()");}
}class Derived extends Base{int a; // 与父类中成员变量同名且类型相同char b; // 与父类中成员变量同名但类型不同// 与父类中methodA()构成重载public void methodA(int a) {System.out.println("Derived中的method()方法");}// 与基类中methodB()构成重写(即原型一致,重写下一章详细介绍)public void methodB(){System.out.println("Derived中的methodB()方法");}public void methodC(){// 对于同名的成员变量,直接访问时,访问的都是子类的a = 100; // 等价于: this.a = 100;b = 101; // 等价于: this.b = 101;// 注意:this是当前对象的引用// 访问父类的成员变量时,需要借助super关键字// super是获取到子类对象中从基类继承下来的部分super.a = 200;super.b = 201;// 父类和子类中构成重载的方法,直接可以通过参数列表区分清访问父类还是子类方法methodA(); // 没有传参,访问父类中的methodA()methodA(20); // 传递int参数,访问子类中的methodA(int)// 如果在子类中要访问重写的基类方法,则需要借助super关键字methodB();// 直接访问,则永远访问到的都是子类中的methodA(),基类的无法访问到super.methodB();// 访问基类的methodB()}
}class Test {public static void main(String[] args) {Derived derived=new Derived();derived.methodA(100);derived.methodB();derived.methodC();}
}

在这里插入图片描述
从上面的运行结果来看我们可以知道

在子类方法中,如果想要明确访问父类中成员时,借助super关键字即可。

注意事项

1. 只能在非静态方法中使用

2. 在子类方法中,访问父类的成员变量和方法。

至于 super的其他用法 在后文继续介绍哦。

2.父子类构造方法

父子父子,先有父再有子

即:子类对象构造时,需要先调用父类构造方法,然后执行子类的构造方法。

<1>. 栗子说明

class Base {public Base(){System.out.println("Base()");}}class Derived extends Base{public Derived(){// super(); // 注意子类构造方法中默认会调用基类的无参构造方法:super(),// 用户没有写时,编译器会自动添加,而且super()必须是子类构造方法中第一条语句,// 并且只能出现一次System.out.println("Derived()");}
}class Test {public static void main(String[] args) {Derived d = new Derived();}
}

在这里插入图片描述
所以我们明白了父类与子类构造方法的特点:

在子类构造方法中,并没有写任何关于基类构造的代码

但是在构造子类对象时,先执行基类的构造方法,然后执行子类的构造方法

因为:子类对象中成员是有两部分组成的,基类继承下来的以及子类新增加的部分 。

父子父子肯定是先有父再有子,所以在构造子类对象时候

先要调用父类的构造方法,将从父类继承下来的成员构造完整

然后再调用子类自己的构造方法,将子类自己新增加的成员初始化完整 。

鱼式疯言

注意:

  1. 若父类显式定义无参或者默认的构造方法,在子类构造方法第一行默认有隐含的 super() 调用,即 调用基类构造方法

  2. 如果父类构造方法是带有参数的,此时需要用户为 子类显式定义构造方法

并在子类构造方法中选择合适的父类构造方法调用,否则 编译失败 (如下图)。

在这里插入图片描述

  1. 在子类构造方法中,super(…)调用父类构造时,必须是子类构造函数中第一条语句。

  2. super(…)只能在子类构造方法中出现一次,并且不能和 this 同时出现

<2>. super 和 this

super和this都可以在成员方法中用来访问:

成员变量和调用其他的成员函数,都可以作为 构造方法的第一条语句

那他们之间有什么区别呢?

同:

  1. 都是Java中的 关键字
  1. 只能在类的 非静态方法 中使用,用来访问 非静态成员方法和字段
  1. 在构造方法中调用时,必须是构造方法中的 第一条语句并且不能同时存在

异:

  1. this是当前对象的引用,当前对象

调用实例方法的对象

super相当于是子类对象中从父类继承下来 部分成员的引用

在这里插入图片描述

  1. 在非静态成员方法中,this用来访问本类的方法和属性,super用来 访问父类继承下来的 方法和属性
  1. 在构造方法中:this(…)用于调用本类构造方法,super(…)用于调用父类构造方法,两种调用不能同时在构造方法中出现
  1. 构造方法中一定会存在super(…)的调用,用户没有写编译器也会增加,但是this(…)用户不写则没有

3. 父子类代码块优先级

我们还记得之前讲过的代码块吗?

我们简单回顾一下几个重要的代码块:实例代码块和静态代码块。

在没有继承关系时的执行顺序。

宝子们可以参考下面链接哦

未继承的代码块的执行顺序链接

先回顾一下我们上篇文章的代码块的执行顺序:

简单来说就是两句话

  1. 静态代码块先执行**,并且只执行一次,在类加载阶段执行**
  1. 当有对象创建时,才会执行实例代码块,实例代码块执行完成后,最后构造方法执行

而在本篇文章主要讲解继承关系下代码的 执行顺序

<1>. 举个栗子

class Person {public String name;public int age;public Person(String name, int age) {this.name = name;this.age = age;System.out.println("Person:构造方法执行");}{System.out.println("Person:实例代码块执行");}static {System.out.println("Person:静态代码块执行");}
}
class Student extends Person{public Student(String name,int age) {super(name,age);System.out.println("Student:构造方法执行");}{System.out.println("Student:实例代码块执行");}static {System.out.println("Student:静态代码块执行");}
}class TestDemo4 {public static void main(String[] args) {Student student1 = new Student("张三",19);System.out.println("===========================");Student student2 = new Student("xiaoxiao",20);}public static void main1(String[] args) {Person person1 = new Person("byte",10);System.out.println("============================");Person person2 = new Person("dada",20);}
}

在这里插入图片描述

通过分析结果,我们可以得出以下结论:

1、父类静态代码块优先于子类静态代码块执行,且是最早执行

2、父类实例代码块和父类构造方法紧接着执行

3、子类的实例代码块和子类构造方法紧接着再执行

4、第二次实例化子类对象时,父类和子类的静态代码块都将不会再执行

鱼式疯言

有图有真相

在这里插入图片描述

三. protected 限定符

面向对象编程第一式:封装章节中,为了实现封装特性

Java中引入了 访问限定符

主要限定: 类者类中成员能否在类外或者其他包中被访问。

在这里插入图片描述

友友们是不是还记得这张图呢,我们已经详细说明了private default public 三个限制符

如果还模糊的小伙伴可以参考下面链接哦

private default public 限制符的详解

那么这篇中我们就来揭开 protected 的神秘面纱

<1>. 栗子one

下面就让我们一起验证下什么叫做 不同包中的子类访问权限

extendo1 的包下

package extend01;
public class B {private int a;protected int b;public int c;int d;
}

extendo1 的包下

package extend01;
public class D extends B{public void method(){// super.a = 10;// 编译报错,父类private成员在相同包子类中不可见super.b = 20;// 父类中protected成员在相同包子类中可以直接访问super.c = 30;// 父类中public成员在相同包子类中可以直接访问super.d = 40;// 父类中默认访问权限修饰的成员在相同包子类中可以直接访问}
}
// extend01包中
// 不同包中的类class TestC {public static void main(String[] args) {D d = new D();d.method();// System.out.println(c.a);// 编译报错,父类中private成员在不同包其他类中不可见System.out.println(d.b);System.out.println(d.c);// 父类中public成员在不同包其他类中可以直接访问System.out.println(d.d);// 父类中默认访问权限修饰的成员在不同包其他类中不能直接访问}
}

在这里插入图片描述

栗子 two

extendo1 的包下

package extend01;
public class B {private int a;protected int b;public int c;int d;
}

extendo2 的包下

package extend02;import extend01.B;
public class C extends B {public void method(){// super.a = 10;// 编译报错,父类中private成员在不同包子类中不可见super.b = 20;// 父类中protected修饰的成员在不同包子类中可以直接访问super.c = 30;// 父类中public修饰的成员在不同包子类中可以直接访问//super.d = 40;// 父类中默认访问权限修饰的成员在不同包子类中不能直接访问}}// extend02包中
// 不同包中的类
class TestC {public static void main(String[] args) {C c = new C();c.method();// System.out.println(c.a);// 编译报错,父类中private成员在不同包其他类中不可见//    System.out.println(c.b);// 父类中protected成员在不同包其他类中不能直接访问System.out.println(c.c);// 父类中public成员在不同包其他类中可以直接访问// System.out.println(c.d);// 父类中默认访问权限修饰的成员在不同包其他类中不能直接访问}
}

在这里插入图片描述

从上面两个栗子的运行结果我们就可以看出:

protected 限定符只要还是与其他限定符**(除了public之外)** 最主要的区别就是能够在 不同包的子类访问父类的成员

注意:父类中 private 成员变量虽然在 子类中不能直接访问,但是也继承到子类中了

鱼式疯言

那么话说回来了,我们该在什么场景下使用他们呢 ! ! !

什么时候下用哪一种呢?

我们希望类要尽量做到 “封装”, 即隐藏内部实现细节, 只暴露出必要的信息给类的 调用者 .

因此我们在使用的时候应该尽可能的使用 比较严格 的访问权限.

例如如果一个方法能用 private, 就尽量不要用 public.

另外, 还有一种 简单粗暴 的做法: 将所有的字段设为 private, 将所有的方法设为 public.

不过这种方式属于是对访问权限的滥用, 还是更希望小伙伴们能写代码的时候认真思考,

该类提供的字段方法到底给 “谁” 使用(是类内部自己用, 还是类的调用者使用, 还是子类使用).

四.继承方式

我们了解了继承的逻辑之后,下面就让小编都小小了解一下继承都有哪些方式吧 💕 💕 💕

在现实生活中,事物之间的关系是非常复杂,灵活多样,比如:

在这里插入图片描述
但在 Java 中只支持以下几种继承方式:

在这里插入图片描述
注意:Java中不支持多继承。

时刻牢记, 我们写的类是现实事物的抽象. 而我们真正在公司中所遇到的项目往往业务比较 复杂
可能会涉及到一系列复杂的概念, 都需要我们使用代码来表示, 所以我们真实项目中所写的类也会有很多. 类之间的关系也会更加复杂.
但是即使如此, 我们并不希望类之间的继承层次太复杂. 一般我们不希望出现超过三层的继承关系.

如果 继承层次 太多, 就需要考虑对代码进行重构了.

如果想从语法上进行限制继承, 就可以使用 final 关键字

下面就让小编具体讲讲我们 final 的用法吧 💖 💖 💖

五. final 关键字

final关键可以用来 修饰变量、成员方法以及类。

1.修饰变量字段

当 final 修饰变量或者字段时表示: 常量(即不能修改)

public class J3_15 {public static void main(String[] args) {final int a = 10;a = 20; // 编译出错}}

在这里插入图片描述

2. 修饰类

当 final修饰类时 表示此类 不能被继承

final class Animal {//...
}class Bird extends Animal {//...public static void main(String[] args) {}
}// 编译出错
//Error:(3, 27) java: 无法从最终com.bit.Animal进行继

在这里插入图片描述

3. 修饰方法

final 表示该方法不能被重写(下篇文章介绍)

六. 继承与组合

和继承类似, 组合也是一种表达类之间关系的方式, 也是能够达到代码重用的效果。

(这里只是做个简单的了解哦,)

组合并没有涉及到特殊的语法

(诸如 extends 这样的关键字),

仅仅是将 一个类 的实例作为 另外一个类 的字段。

<1>. 举个栗子

就拿我们平常的小汽车举例吧 💕 💕 💕

在这里插入图片描述

在这里插入图片描述

汽车和其 轮胎、发动机、方向盘、车载系统 等的关系就应该是 组合

因为汽车是有这些 部件组成 的。

// 轮胎类
class Tire{
// ...
}
// 发动机类
class Engine{
// ...
}
// 车载系统类
class VehicleSystem{
// ...
}
class Car{
private Tire tire; // 可以复用轮胎中的属性和方法
private Engine engine; // 可以复用发动机中的属性和方法
private VehicleSystem vs; // 可以复用车载系统中的属性和方法
// ...
}
// 奔驰是汽车
class Benz extend Car{
// 将汽车中包含的:轮胎、发送机、车载系统全部继承下来
}

组合和继承都可以实现代码复用,应该使用继承还是组合,需要根据应用场景来选择

一般小编建议:能用组合尽量用组合。

具体想要提前了解组合可以参考下面的链接哦,不过小编后期也会出组合专题的文章哦,咱们敬请期待哦 💖 💖 💖

继承与组合

总结

  • 继承: 熟悉了继承的逻辑思路以及实际运用
  • super 关键字: super 的出现是如何解决父类和子类之间的关系的
  • protected 限定符: 对于 protected 与其他限定符的本质区别
  • 继承方式: 简单了解了不同的继承方式
  • final 关键字: final 的出现有效的限制了继承的多重性以及在其他类型的运用
  • 继承与组合: 有继承就会有组合,后续我们会重点讲解组合的干货,而本篇文章的重点是理解继承的核心

如果觉得小编写的还不错的咱可支持 三连 下 (定有回访哦) , 不妥当的咱请评论区 指正

希望我的文章能给各位宝子们带来哪怕一点点的收获就是 小编创作 的最大 动力 💖 💖 💖

在这里插入图片描述

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

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

相关文章

【Golang】golang使用三方SDK操作容器指南

【Golang】golang使用三方SDK操作容器指南 大家好 我是寸铁&#x1f44a; 总结了一篇 golang使用三方SDK操作容器✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 这应该是目前全网最全golang使用三方SDK操作容器的指南了✌️ CreateConfig 主要是创建容器的配置信息&#xff0c;常…

uniapp遇到的问题

【uniapp】小程序中input输入框的placeholder-class不生效解决办法 解决&#xff1a;写在scope外面 uniapp设置底部导航 引用&#xff1a;https://www.jianshu.com/p/738dd51a0162 【微信小程序】moveable-view / moveable-area的使用 https://blog.csdn.net/qq_36901092/…

【机器学习】走进监督学习:构建智能预测模型的第一步

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

go语言基础笔记

1.基本类型 1.1. 基本类型 bool int: int8, int16, int32(rune), int64 uint: uint8(byte), uint16, uint32, uint64 float32, float64 string 复数&#xff1a;complex64, complex128 复数有实部和虚部&#xff0c;complex64的实部和虚部为32位&#xff0c;complex128的实部…

基于Java+SpringBoot+vue+element实现校园闲置物品交易网站

基于JavaSpringBootvueelement实现校园闲置物品交易网站 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 ** 作者主页 央顺技术团队** 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式 文章目录 基于…

【Unity】Tag、Layer、LayerMask

文章目录 层&#xff08;Layer&#xff09;什么是LayerLayer的应用场景Layer层的配置&#xff08;Tags & Layers&#xff09;Layer的数据结构LayerMaskLayer的选中和忽略Layer的管理&#xff08;架构思路&#xff09;层碰撞矩阵设置&#xff08;Layer Collision Matrix&…

人工智能入门学习笔记1:什么是人工智能

一、什么是人工智能 人工智能(Artificial Intelligence)&#xff0c;是一个以计算机科学&#xff08;Computer Science&#xff09;为基础&#xff0c;由计算机、心理学、哲学等多学科交叉融合的交叉学科、新兴学科&#xff0c;研究、开发用于模拟、延伸和扩展人的智能的理论、…

【探索程序员职业赛道:挑战与机遇】

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

【JetsonNano】onnxruntime-gpu 环境编译和安装,支持 Python 和 C++ 开发

1. 设备 2. 环境 sudo apt-get install protobuf-compiler libprotoc-devexport PATH/usr/local/cuda/bin:${PATH} export CUDA_PATH/usr/local/cuda export cuDNN_PATH/usr/lib/aarch64-linux-gnu export CMAKE_ARGS"-DONNX_CUSTOM_PROTOC_EXECUTABLE/usr/bin/protoc&qu…

使用 Docker Compose 快速搭建监控网站 uptime-kuma

有时候需要监控自己搭建的一些网站、服务是否正常运行&#xff0c; 这时候可以考虑使用一个监控网站&#xff0c; 定时的进行检测&#xff0c; 记录网站、服务的运行状态&#xff0c; 在这推荐使用 uptime-kuma。 博主博客 https://blog.uso6.comhttps://blog.csdn.net/dxk539…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Menu)

以垂直列表形式显示的菜单。 说明&#xff1a; 该组件从API Version 9开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 Menu组件需和bindMenu或bindContextMenu方法配合使用&#xff0c;不支持作为普通组件单独使用。 子组件 包含MenuIt…

【Claude 3】一文谈谈Anthropic(Claude) 亚马逊云科技(Bedrock)的因缘际会

文章目录 前言1. Anthropic的诞生2. Anthropic的“代表作”——Claude 3的“三驾马车”3. 亚马逊云科技介绍4. 强大的全托管服务平台——Amazon Bedrock5. 亚马逊云科技(AWS)和Anthropic的联系6. Claude 3模型与Bedrock托管平台的关系7. Clude 3限时体验入口分享【⚠️截止3月1…

HTML5:七天学会基础动画网页11

CSS3动画 CSS3过渡的基本用法: CSS3过渡是元素从一种样式逐渐改变为另一种样式的效果。 过渡属性-transition 值与说明 transition-property 必需&#xff0c;指定CSS属性的name&#xff0c;transition效果即哪个属性发生过渡。 transition-duration 必需&#xff0c;t…

细说C++反向迭代器:原理与用法

文章目录 一、引言二、反向迭代器的原理与实现细节三、模拟实现C反向迭代器反向迭代器模板类的设计反向迭代器的使用示例与测试 一、引言 迭代器与反向迭代器的概念引入 迭代器&#xff08;Iterator&#xff09;是C标准模板库&#xff08;STL&#xff09;中的一个核心概念&am…

一篇文章认识【性能测试】

一、 性能测试术语解释 1. 响应时间 响应时间即从应用系统发出请求开始&#xff0c;到客户端接收到最后一个字节数据为止所消耗的时间。响应时间按软件的特点再可以细分&#xff0c;如对于一个 C/S 软件的响应时间可以细分为网络传输时间、应用服务器处理时间、数据库服务器…

layuiAdmin-通用型后台模板框架【广泛用于各类管理平台】

1. 主页 1.1 控制台 2. 组件 3. 页面 3.1 个人主页 3.2 通讯录 3.3 客户列表 3.4 商品列表 3.5 留言板 3.6 搜索结果 3.7 注册 3.8 登入 3.9 忘记密码 4. 应用 4.1 内容系统 4.1.1 文章列表 4.1.2 分类管理 4.1.3 评论管理 4.2 社区系统 4.2.1 帖子列表 4.2.2 回…

支小蜜AI校园防欺凌系统可以使用在宿舍吗?

随着人工智能技术的快速发展&#xff0c;AI校园防欺凌系统已成为维护校园安全的重要手段。然而&#xff0c;关于这一系统是否适用于宿舍环境&#xff0c;仍存在一些争议和讨论。本文将探讨AI校园防欺凌系统在宿舍中的适用性&#xff0c;分析其潜在的优势与挑战&#xff0c;并提…

解析Perl爬虫代码:使用WWW__Mechanize__PhantomJS库爬取stackoverflow.com的详细步骤

在这篇文章中&#xff0c;我们将探讨如何使用Perl语言和WWW::Mechanize::PhantomJS库来爬取网站数据。我们的目标是爬取stackoverflow.com的内容&#xff0c;同时使用爬虫代理来和多线程技术以提高爬取效率&#xff0c;并将数据存储到本地。 Perl爬虫代码解析 首先&#xff0…

微信小程序开发学习笔记《21》uni-app框架-楼层图片跳转

微信小程序开发学习笔记《21》uni-app框架-楼层图片跳转 博主正在学习微信小程序开发&#xff0c;希望记录自己学习过程同时与广大网友共同学习讨论。建议仔细阅读uni-app对应官方文档 一、创建新的分包goods_list 二、将请求到的楼层数据url调整为本地的 可以看到上图是请求…

矢量图片转换软件Vector Magic mac中文版功能特色

Vector Magic mac中文版是一款非常流行的矢量图片转换软件&#xff0c;它的功能特色主要体现在以下几个方面&#xff1a; 首先&#xff0c;Vector Magic mac中文版拥有出色的矢量转换能力。它采用世界上最好的全彩色自动描摹器&#xff0c;能够将JPG、PNG、BMP和GIF等位图图像…