类和对象(4)——多态:方法重写与动态绑定、向上转型和向下转型、多态的实现条件
目录
1. 向上转型和向下转型
1.1 向上转型
1.2 向下转型
1.3 instanceof关键字
2. 重写(overidde)
2.1 方法重写的规则
2.1.1 基础规则
2.1.2 深层规则
2.2 三种不能重写的方法
final修饰
private修饰
static修饰
3. 动态绑定
3.1 动态绑定的概念
3.2 动态绑定与静态绑定
4. 多态
4.1 多态的实现场景
1. 基类形参方法
2. 基数组
4.2 多态缺陷
1. 属性(字段)没有多态性
2. 向上转型不能使用子类特有的方法
3. 构造方法没有多态性
上一篇文章中,我们深度学习了继承的概念与实现。在继承篇中,我们最重要的就是“弄清楚通过子类实例变量来访问与父类相同的成员会怎么样”;而在多态篇中,最核心的内容就是“弄清楚通过父类实例变量来访问与子类相同的方法会怎么样”。
1. 向上转型和向下转型
在了解多态之前,我们还要补充几个知识点,这首先就是向上转型和向下转型。
1.1 向上转型
向上转型是指将一个子类对象的引用赋值给一个父类类型的实例变量。
语法格式:
父类类型 对象名 = new 子类类型();
//例如 Animal animal = new Cat("小咪", 2);
animal是父类类型的实例变量,但引用的是一个子类Cat对象,因为这是从小范围向大范围的转换。类似基础数据类型中的隐式类型转换(例如长整形long接收整形int的数据)
向上转型的3种使用场景:
- 直接赋值:子类对象的引用直接赋值给父类类型的实例变量。
- 方法传参:子类对象的引用作为参数,传递给方法中的父类类型的形参。
- 方法返回:方法的返回类型是父类类型,返回的值是子类类型。
例如:
public class TestAnimal {// 2. 方法传参:形参为父类型引用,可以接收任意子类的对象public static void eatFood(Animal a){a.eat();}// 3. 作返回值:返回任意子类对象public static Animal buyAnimal(String var){if("狗".equals(var) ){return new Dog("狗狗",1);}else if("猫" .equals(var)){return new Cat("猫猫", 1);}else{return null;}}public static void main(String[] args) {Animal cat = new Cat("元宝",2); // 1. 直接赋值:子类对象赋值给父类对象Dog dog = new Dog("小七", 1);eatFood(cat);eatFood(dog);Animal animal = buyAnimal("狗");animal.eat();animal = buyAnimal("猫");animal.eat();}}
1.2 向下转型
向下转型是将父类对象强制转换为子类对象的过程,需要用到类型转换运算符( ) 。
【注意】
- 只能对已向上转型的对象进行向下转型:不能直接将一个父类对象强制转换为子类对象,除非这个父类对象实际上是子类对象的向上转型。也就是说,必须先创建一个子类对象,然后将其向上转型为父类对象,最后再进行向下转换。
- 向上转型的子类类型 与 向下接收的子类类型必须一致。
例如:
先看父类和子类的具体代码:
public class Animal {public String name;public Animal(String name){this.name = name;}public void eat(){System.out.println(name+"在吃东西");}
}public class Dog extends Animal{public Dog(String name){super(name);}public void eat(){System.out.println(name+"在吃狗粮");}//Dog类的专属方法public void bark(){System.out.println(name+"在汪汪叫");}
}public class Cat extends Animal{public Cat(String name){super(name);}public void eat(){System.out.println(name+"在吃猫粮");}//Cat类的专属方法public void mew(){System.out.println(name+"在喵喵叫");}
}
测试1:父类实例animal是Dag类的向上转型,再让animal向下转型传给子类实例dog。
public class Test {public static void main(String[] args) {Animal animal = new Dog("旺财");Dog dog;dog = (Dog) animal;dog.bark();}
}
运行成功
测试2:父类实例animal是Dag类的向上转型,再让animal向下转型传给子类实例cat。(向上转型的子类与向下接收的子类不一致)
public class Test {public static void main(String[] args) {Animal animal = new Dog("旺财");Cat cat;cat = (Cat) animal;//抛出异常}
}
抛出异常
1.3 instanceof关键字
向下转型用的比较少,而且不安全,万一转换失败,运行时就会抛异常。Java中为了提高向下转型的安全性,引入了instanceof关键字。
语法:
Object instanceof ClassName
其中,
object
是要测试的对象或实例变量,ClassName
是要测试的类名。
作用和返回值:
如果
object
是ClassName
的实例或其子类的实例,则表达式返回true
;否则返回false
。
有了instanceof,我们向下转型就可以更安全了:
public class TestAnimal {public static void main(String[] args) {Cat cat = new Cat("元宝",2);Dog dog = new Dog("小七", 1);// 向上转型Animal animal = cat;animal.eat();animal = dog;animal.eat();if(animal instanceof Cat){ //检查类型cat = (Cat)animal;cat.mew();}if(animal instanceof Dog){ //检查类型dog = (Dog)animal;dog.bark();}}}
animal最后是Dog类的引用,所以通过了第2个检查,由dog接收animal的向下转型。
2. 重写(overidde)
2.1 方法重写的规则
2.1.1 基础规则
方法重写:也称为方法覆盖,即外壳不变,核心重写。
- 子类在重写父类的方法时,一般必须与父类的方法原型一致【返回值类型、方法名、参数列表要完全一致】。
- 重写的方法,可以在子类方法头的上一行使用“ @Override ”注解来显式指定。有了这个注解能帮我们进行一些合法性校验。(例如不小心将方法名字拼写错了,比如eat写成 aet,那么此时编译器就会发现父类中没有 aet 方法, 就会编译报错, 提示无法构成重写)
例如:
如果显示指定@overidde,但方法与父类原型不一致的话,系统会报错:
2.1.2 深层规则
- 返回值类型:其实子类重写的方法返回类型也可以与父类不一样,但是必须是具有父子关系的。
- 该要求其实隐藏了一个情况,那就是此时的方法返回值类型是类类型的。
- 对于这种情况的方法重写,父类方法的返回值类型 必须是 子类方法的返回值类型的 基类。
- 访问限定符:访问权限不能比父类中被重写的方法的访问权限更低。(即子类重写的方法访问权限可以更宽松,不能更严格)
对于“返回值类型”要求的举例:
class Parent {public Number display() {return 42; // 返回一个Integer类型的值}
}class Child extends Parent {// 重写父类的display方法,并改变返回类型为Double,这是允许的,因为Double是Number的子类型@Overridepublic Double display() {return 42.0;}
}public class Test {public static void main(String[] args) {Parent parent = new Parent();System.out.println(parent.display()); // 输出: 42Child child = new Child();System.out.println(child.display()); // 输出: 42.0}
}
Parent类的display方法的返回类型是Number类,Child类的display方法的返回类型是Double类。其中Parent类是Child类的父类,Number类又是Double类和Interger类的父类,这符合方法重写的深层规则。
如果该例子中的 方法返回值类型的父子关系反过来 会报错:
对于“访问限定符”要求的举例:
关于方法重写还有更深层更严格的规定,这些规定与异常、线程等有关。本章重点是继承与多态,所以不再具体展开。
2.2 三种不能重写的方法
如果父类方法被final、private或static修饰,则子类不能重写该方法。
final修饰
final:
final修饰成员方法时,就是用来防止该方法被子类重写 或者 不想让该方法被重写。
例如:
private修饰
private:
当父类的方法被private修饰时,说明这个方法是父类私有的,子类也没有办法去访问该方法。
- 如果private修饰了父类的方法,子类又写了一个与父类方法原型一样的方法,系统并不会报错。
(因为系统检查方法重写时,会自动把父类的私有方法忽略掉)- 如果private修饰了子类的方法,父类又有一个与子类方法原型一样的非private方法,那么系统会报错。
(此时系统会认为你想要让子类重写父类方法,又因为重写后的方法是私有的而父类的方法非私有,所以会提醒你“分配了更低的访问权限”并报错)
例1:
父类方法是私有的,build没有问题
例2:
子类方法是私有的,父类方法原型与子类一致。系统认为你要重写,但子类的方法权限更低,所以报错:
static修饰
static:
静态方法是在类加载时就绑定到类本身,而不是在运行时绑定到具体的对象实例,所以static修饰的方法不能被重写。即静态方法不能实现动态绑定,也就不能被覆盖(重写)。
例如:
虽然静态方法是可以被继承的,但如果子类定义了一个与父类相同签名的静态方法,这只是对父类静态方法的一种隐藏,而非真正意义上的重写。
- 子类对象向上转型后,当通过父类实例变量引用调用该方法时,仍然会执行父类的静态方法,而不是子类的静态方法。
例如:
class Parent {static void display() {System.out.println("Parent display method");}
}class Child extends Parent {static void display() {System.out.println("Child display method");}
}public class Test {public static void main(String[] args) {Parent parent1 = new Parent();parent1.display(); //调用父类静态方法Child child = new Child();child.display(); //调用子类静态方法Parent parent2 = new Child(); //向上转型parent2.display(); //调用父类静态方法}
}
3. 动态绑定
3.1 动态绑定的概念
刚刚在解释static修饰方法时,我们提到了一个词叫动态绑定。下面让我们看看什么是动态绑定。
概念:
动态绑定也叫后期绑定,是指在运行时根据对象的实际类型来确定调用哪个方法,而不是在编译时就决定。当一个父类引用指向其子类的对象,并且通过该引用调用一个被重写的方法时,会在运行时根据对象的实际类型来调用相应的方法实现,这就是重写方法的动态绑定。
动态绑定重写方法的实现条件:
- 存在继承关系:必须有一个基类(父类)和至少一个派生类(子类),子类继承自父类。
- 方法重写:子类要实现父类中至少一个方法的重写。
- 向上转型:在程序中存在向上转型的情况,即把子类对象的引用赋值给父类的实例变量。
例如:
class Animal {public String name;public Animal(String name){this.name = name;}public void eat(){System.out.println(name+"在吃东西");}
}public class Dog extends Animal{public Dog(String name){super(name);}public void eat(){System.out.println(name+"在吃狗粮");}
}public class Cat extends Animal{public Cat(String name){super(name);}public void eat(){System.out.println(name+"在吃猫粮");}
}public class Test {public static void main(String[] args) {Animal animal = new Animal("动物");//animal动态绑定到Animal类animal.eat();animal = new Dog("小狗");//animal动态绑定到Dog类animal.eat();animal = new Cat("小猫");//animal动态绑定到Cat类animal.eat();}
}
3.2 动态绑定与静态绑定
静态绑定也称为早期绑定:是指在程序编译时就已经确定了方法调用的具体对象和方法实现。与动态绑定相对应,静态绑定不需要在运行时进行额外的判断和查找来确定调用哪个方法。
静态绑定的适用情况
- 基本数据类型的方法调用(可重载的方法):对于基本数据类型的操作方法,如数学运算等,通常是静态绑定。例如,
int a = 5; int b = 10; int c = a + b;
中+
运算符对应的加法方法是在编译时就确定的。- 私有方法、静态方法和 final 方法:这些方法不能被重写或具有特殊的性质,所以它们的调用可以在编译时确定。例如,
class Example { private void privateMethod() {...} static void staticMethod() {...} final void finalMethod() {...} }
中的私有方法、静态方法和 final 方法都是静态绑定的。- 构造方法:构造方法在创建对象时被调用,每个类都有特定的构造方法,且在编译时就可以确定是哪个类的构造方法会被调用。例如,
new Example()
会调用 Example 类的构造方法,这是在编译时就已经决定的。
方法重载(静态绑定)是一个类的多态性表现【例如工具类Arrays】,而方法重写(动态绑定)是子类与父类间的多态性的表现。
4. 多态
多态的概念:
去完成某个行为时,当不同的对象去完成时会产生出不同的状态。又或者同一件事情,发生在不同对象身上,就会产生不同的结果。
打个比方,语文老师要求同学们背一首诗,同学A背了一首李白的诗、同学B背了一首杜甫的诗、同学C背了一首李清照的诗……每个同学背的诗都不同,但不管怎么说他们都完成了“背一首诗”的任务,这就是多态。
4.1 多态的实现场景
在java中要实现多态,必须要满足如下几个条件,缺一不可:
- 必须在继承体系下
- 子类必须要对父类中方法进行重写
- 通过父类的引用调用
下面我来介绍两种常见的多态实现。
1. 基类形参方法
基类形参方法:指的是形参数据类型为基类类型的方法。
该方法的形参的类型是父类类型,我们一般在该方法中使用被重写的方法。不同的子类实例变量传参进去并发生向上转型,该基类形参方法就能够通过动态绑定来调用不同的重写方法,从而实现多态。
例如:
//有继承关系的类
public class Animal {public String name;public Animal(String name){this.name = name;}public void eat(){System.out.println(name+"在吃东西");}
}public class Dog extends Animal{public Dog(String name){super(name);}public void eat(){System.out.println(name+"在吃狗粮");}
}public class Cat extends Animal{public Cat(String name){super(name);}public void eat(){System.out.println(name+"在吃猫粮");}
}
————————————————————————————————————————————————————————
————————————————————————————————————————————————————————
//含基类形参方法的类
public class Test {public void eat(Animal animal){ //基类形参方法animal.eat();}public static void main(String[] args) {Test test = new Test(); //如果Test的eat方法是静态方法,那么可以不用new一个Test对象test.eat(new Animal("小动物"));test.eat(new Dog("小狗"));test.eat(new Cat("小猫"));}
}
这种方法有点类似C语言中的函数指针和回调函数的用法。详细请看《指针之旅(4)—— 指针与函数:函数指针、转移表、回调函数》
2. 基数组
基数组:指的是数组元素的类型都是基类类型。
由于可以向上转型,在基数组中可以存放子类对象,从而实现多态。
(有点类似C语言中的函数指针数组)
例如:
//Animal类、Dog类和Cat类的内容如上面的一致
public class Test {public static void main(String[] args) {//基数组animalsAnimal[] animals = {new Animal("小动物"), new Dog("小狗"), new Cat("小猫")};for(Animal x: animals){x.eat(); //临时变量x通过动态绑定实现多态}}
}
如果有新的动物增加,我们可以在基数组animals中添加,这就是多态的好处,十分便捷。
如果不基于多态来实现刚刚的代码内容,我们需要多个if-else语句,如下:
在这种情况下,如果要增加一个动物,不仅字符串数组animals要变,而且在for-each循环中还要加多一条else-if语句,十分不便。
4.2 多态缺陷
1. 属性(字段)没有多态性
当父类和子类都有同名属性的时候,通过父类实例变量引用,只能引用父类自己的成员属性。
例如:
public class Parent {public String str = "parent";
}public class Child extends Parent{public String str = "child";
}public class Test {public static void main(String[] args) {Parent parent = new Parent();System.out.println(parent.str);//打印parentChild child = new Child();System.out.println(child.str);//打印childparent = child; //向上转型System.out.println(parent.str);//属性没有多态性,打印的还是父类的str}
}
2. 向上转型不能使用子类特有的方法
方法调用在编译时进行类型检查,编译器只检查引用变量类型中定义的方法,而不考虑实际对象的类型。
例如,这里子类Dog比父类Animal类多了一个特殊方法bark()。如果用Animal类型的实例变量来接收Dog类的对象,我们会发现无法通过该实例变量调用bark方法:
3. 构造方法没有多态性
当父类的构造方法中调用一个被重写的方法时,实际执行的是子类中的实现。然而,此时子类可能还未完成初始化,其成员变量尚未赋值或处于默认状态,这就可能导致程序行为不确定,甚至引发错误。
父类构造方法中如果调用了被重写的方法,那么该重写的方法使用的是子类的方法。
我们创建两个类, B 是父类, D 是子类. D 中重写 func 方法. 并且在 B 的构造方法中调用 func:
class B {public B() {// do nothingfunc();}public void func() {System.out.println("B.func()");}
}class D extends B {private int num = 10;@Overridepublic void func() {System.out.println("D.func() " + num);}
}public class Test {public static void main(String[] args) {D d = new D();}
}
- 构造 D 对象的同时,会调用 B 的构造方法.
- B 的构造方法中调用了 func 方法, 此时会触发动态绑定,会调用到 D 中的 func 。此时 D 对象自身还没有构造,此时 num 处在未初始化的状态,值为 0.
- 如果具备多态性,num的值应该是10.
结论: "用尽量简单的方式使对象进入可工作状态", 尽量不要在构造器中调用方法(如果这个方法被子类重写, 就会触 发动态绑定, 但是此时子类对象还没构造完成), 可能会出现一些隐藏的但是又极难发现的问题。
本期分享完毕,感谢大家的支持Thanks♪(・ω・)ノ
相关文章:
类和对象(4)——多态:方法重写与动态绑定、向上转型和向下转型、多态的实现条件
目录 1. 向上转型和向下转型 1.1 向上转型 1.2 向下转型 1.3 instanceof关键字 2. 重写(overidde) 2.1 方法重写的规则 2.1.1 基础规则 2.1.2 深层规则 2.2 三种不能重写的方法 final修饰 private修饰 static修饰 3. 动态绑定 3.1 动态绑…...
动态规划<九>两个数组的dp
目录 引例 LeetCode经典OJ题 1.第一题 2.第二题 3.第三题 4.第四题 5.第五题 6.第六题 7.第七题 引例 OJ传送门LeetCode<1143>最长公共子序列 画图分析: 使用动态规划解决 1.状态表示 ------经验题目要求 经验为选取第一个字符串的[0,i]区间以及第二个字…...
Go:基于Go实现一个压测工具
文章目录 写在前面整体架构通用数据处理模块Http请求响应数据处理Curl参数解析处理 客户端模块Http客户端处理Grpc客户端处理Websocket客户端处理 连接处理模块GrpcHttp 统计数据模块统计原理实现过程 写在前面 本篇主要是基于Go来实现一个压测的工具,关于压测的内…...
2025年数学建模美赛 A题分析(2)楼梯使用频率数学模型
2025年数学建模美赛 A题分析(1)Testing Time: The Constant Wear On Stairs 2025年数学建模美赛 A题分析(2)楼梯磨损分析模型 2025年数学建模美赛 A题分析(3)楼梯使用方向偏好模型 2025年数学建模美赛 A题分…...
在Ubuntu上用Llama Factory命令行微调Qwen2.5的简单过程
半年多之前写过一个教程:在Windows上用Llama Factory微调Llama 3的基本操作_llama-factory windows-CSDN博客 如果用命令行做的话,前面的步骤可以参考上面这个博客。安装好环境后, 用自我认知数据集微调Lora模块:data/identity.j…...
虹科分享 | 汽车NVH小课堂之听音辨故障
随着车主开始关注汽车抖动异响问题,如何根据故障现象快速诊断异响来源,成了汽修人的必修课。 一个比较常用的方法就是靠“听”——“听音辨故障”。那今天,虹科Pico也整理了几个不同类型的异响声音,一起来听听看你能答对几个吧 汽…...
RoboVLM——通用机器人策略的VLA设计哲学:如何选择骨干网络、如何构建VLA架构、何时添加跨本体数据
前言 本博客内解读不少VLA模型了,包括π0等,且如此文的开头所说 前两天又重点看了下openvla,和cogact,发现 目前cogACT把openvla的动作预测换成了dit,在模型架构层面上,逼近了π0那为了进一步逼近&#…...
【SpringBoot教程】Spring Boot + MySQL + HikariCP 连接池整合教程
🙋大家好!我是毛毛张! 🌈个人首页: 神马都会亿点点的毛毛张 在前面一篇文章中毛毛张介绍了SpringBoot中数据源与数据库连接池相关概念,今天毛毛张要分享的是关于SpringBoot整合HicariCP连接池相关知识点以及底层源码…...
0.91英寸OLED显示屏一种具有小尺寸、高分辨率、低功耗特性的显示器件
0.91英寸OLED显示屏是一种具有小尺寸、高分辨率、低功耗特性的显示器件。以下是对0.91英寸OLED显示屏的详细介绍: 一、基本参数 尺寸:0.91英寸分辨率:通常为128x32像素,意味着显示屏上有128列和32行的像素点,总共409…...
【insert函数】
在 C 中,std::string::insert 是一个功能强大的成员函数,用于在字符串的指定位置插入内容。它有多个重载版本,支持插入 字符、字符串、子字符串 等。以下是 insert 所有相关函数的详细介绍: 1. 插入字符串 函数签名: …...
Python 如何进行文本匹配:difflib| python 小知识
Python 如何进行文本匹配:difflib| python 小知识 difflib是Python标准库中的一个工具,用于比较和处理文本差异。它提供了一组用于比较和处理文本差异的功能,可以用于比较字符串、文件等。本文将详细介绍difflib模块的用法和实现细节&#x…...
MySQL误删数据怎么办?
文章目录 1. 从备份恢复数据2. 通过二进制日志恢复数据3. 使用数据恢复工具4. 利用事务回滚恢复数据5. 预防误删数据的策略总结 在使用MySQL进行数据管理时,误删数据是一个常见且具有高风险的操作。无论是因为操作失误、系统故障,还是不小心执行了删除命…...
可以称之为“yyds”的物联网开源框架有哪几个?
有了物联网的发展,我们的生活似乎也变得更加“鲜活”、有趣、便捷,包具有科技感的。在物联网(IoT)领域中,也有许多优秀的开源框架支持设备连接、数据处理、云服务等,成为被用户们广泛认可的存在。以下给大家…...
为AI聊天工具添加一个知识系统 之74 详细设计之15 正则表达式 之2
本文要点 要点 本项目(为AI聊天工具添加一个知识系统)中的正则表达式。 正则表达式的三“比”。正则表达式被 一、排比为三种符号(元符号-圈号,特殊符号-引号,普通符号-括号) 引号<<a线性回归bo…...
Java 注解与元数据
Java学习资料 Java学习资料 Java学习资料 一、引言 在 Java 编程中,注解(Annotation)和元数据(Metadata)是两个重要的概念。注解为程序提供了一种在代码中嵌入额外信息的方式,这些额外信息就是元数据。元…...
【橘子Kibana】Kibana的分析能力Analytics简易分析
一、kibana是啥,能干嘛 我们经常会用es来实现一些关于检索,关于分析的业务。但是es本身并没有UI,我们只能通过调用api来完成一些能力。而kibana就是他的一个外置UI,你完全可以这么理解。 当我们进入kibana的主页的时候你可以看到这样的布局。…...
度小满前端面试题及参考答案
<form>标签使用过哪些 tag? <form>标签中常使用的标签有很多。 <input>:这是最常用的标签之一,用于创建各种类型的输入字段,如文本框、密码框、单选按钮、复选框、文件上传框等。通过设置type属性来指定输入类型,例如type="text"创建文本输入…...
Padas进行MongoDB数据库CRUD
在数据处理的领域,MongoDB作为一款NoSQL数据库,以其灵活的文档存储结构和高扩展性广泛应用于大规模数据处理场景。Pandas作为Python的核心数据处理库,能够高效处理结构化数据。在MongoDB中,数据以JSON格式存储,这与Pandas的DataFrame结构可以很方便地互相转换。通过这篇教…...
LQ1052 Fibonacci斐波那契数列
题目描述 Fibonacci斐波那契数列也称为兔子数列,它的递推公式为:FnFn-1Fn-2,其中F1F21。 当n比较大时,Fn也非常大,现在小蓝想知道,Fn除以10007的余数是多少,请你编程告诉她。 输入 输入包含一…...
华硕笔记本装win10哪个版本好用分析_华硕笔记本装win10专业版图文教程
华硕笔记本装win10哪个版本好用?华硕笔记本还是建议安装win10专业版。Win分为多个版本,其中家庭版(Home)和专业版(Pro)是用户选择最多的两个版本。win10专业版在功能以及安全性方面有着明显的优势ÿ…...
编译器gcc/g++ --【Linux基础开发工具】
文章目录 一、背景知识二、gcc编译选项1、预处理(进行宏替换)2、编译(生成汇编)3、汇编(生成机器可识别代码)4、链接(生成可执行文件或库文件) 三、动态链接和静态链接四、静态库和动态库1、动静态库2、编译…...
八股文 (一)
文章目录 项目地址一、前端1.1 大文件上传,预览1.2 首页性能优化1.2 流量染色,灰度发布1.3 Websock心跳机制,大数据实时数据优化1.4 Gpu 加速 fps优化1.5 echarts包大小优化和组件封装1.6 前端监控系统1.7 超大虚拟列表卡顿1. 实现2. 相关问题(1) 什么是虚拟化列表,为什么要…...
c语言无符号的变量不能和有符号的直接比较,或者使用移项解决符号问题
使用移项解决问题,简单来说就是无符号运行不要有减号,使用移项后的加号代替 if(uEventDirLimitSize > uEventAndNormalDirSize) {if((uEventDirLimitSize - uEventAndNormalDirSize) > pStConfig->stParam.stUserParam.uEventRemain){return O…...
安卓日常问题杂谈(一)
背景 关于安卓开发中,有很多奇奇怪怪的问题,有时候这个控件闪一下,有时候这个页面移动一下,这些对于快速开发中,去查询,都是很耗费时间的,因此,本系列文章,旨在记录安卓…...
电力晶体管(GTR)全控性器件
电力晶体管(Giant Transistor,GTR)是一种全控性器件,以下是关于它的详细介绍:(模电普通晶体管三极管进行对比学习) 基本概念 GTR是一种耐高电压、大电流的双极结型晶体管(BJT&am…...
【美】Day 1 CPT申请步骤及信息获取指南(Day1 CPT)
参考文章:【美】境外申请Day 1 CPT完整流程(境外Day 1 CPT) 文章目录 **一、申请前准备:了解Day 1 CPT基本要求****二、选择Day 1 CPT学校****1. 搜索学校****2. 筛选标准** **三、申请流程****1. 提交学校申请****2. 转SEVIS记录…...
梯度下降优化算法-动量法
1. 动量法的数学原理 1.1 标准梯度下降回顾 在标准梯度下降中,参数的更新公式为: θ t 1 θ t − η ⋅ ∇ θ J ( θ t ) \theta_{t1} \theta_t - \eta \cdot \nabla_\theta J(\theta_t) θt1θt−η⋅∇θJ(θt) 其中: θ t …...
游戏引擎介绍:Game Engine
简介 定义:软件框架,一系列为开发游戏的工具的集合 可协作创意生产工具,复杂性艺术,注重realtime实时 目的 为艺术家,设计师,程序员设计工具链 游戏引擎开发参考书 推荐:Game Engine Archite…...
zookeeper-3.8.3-基于ACL的访问控制
ZooKeeper基于ACL的访问控制 ZooKeeper 用ACL控制对znode的访问,类似UNIX文件权限,但无znode所有者概念,ACL指定ID及对应权限,且仅作用于特定znode,不递归。 ZooKeeper支持可插拔认证方案,ID格式为scheme…...
ResNeSt: Split-Attention Networks 参考论文
参考文献 [1] Tensorflow Efficientnet. https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet. Accessed: 2020-03-04. 中文翻译:[1] TensorFlow EfficientNet. https://github.com/tensorflow/tpu/tree/master/models/official/efficien…...
正反转电路梯形图
1、正转联锁控制。按下正转按钮SB1→梯形图程序中的正转触点X000闭合→线圈Y000得电→Y000自锁触点闭合,Y000联锁触点断开,Y0端子与COM端子间的内部硬触点闭合→Y000自锁触点闭合,使线圈Y000在X000触点断开后仍可得电。 Y000联锁触点断开&…...
【数据结构】空间复杂度
目录 一、引入空间复杂度的原因 二、空间复杂度的分析 ❥ 2.1 程序运行时内存大小 ~ 程序本身大小 ❥ 2.2 程序运行时内存大小 ~ 算法运行时内存大小 ❥ 2.3 算法运行时内存大小 ❥ 2.4 不考虑算法全部运行空间的原因 三、空间复杂度 ❥ 3.1空间复杂度的定义 ❥ 3.2 空…...
系统学英语 — 句法 — 复合句
目录 文章目录 目录复合句型主语从句宾语从句表语从句定语从句状语从句同位语从句 复合句型 复合句型,即:从句。在英语中,除了谓语之外的所有句子成分都可以使用从句来充当。 主语从句 充当主语的句子,通常位于谓语之前&#x…...
SQL server 数据库使用整理
标题:SQL server 数据库使用整理 1.字符串表名多次查询 2.读取SQL中Json字段中的值:JSON_VALUE(最新版本支持,属性名大小写敏感) 1.字符串表名多次查询 SELECT ROW_NUMBER() OVER (ORDER BY value ASC) rowid,value…...
*胡闹厨房*
前期准备 详细教程 一、创建项目 1、选择Universal 3D,创建项目 2、删除预制文件Readme:点击Remove Readme Assets,弹出框上点击Proceed 3、Edit-Project Setting-Quality,只保留High Fidelity 4、打开 Assets-Settings ,保留URP-HighFidelity-Renderer 和 URP-High…...
.NET 8 项目 Docker 方式部署到 Linux 系统详细操作步骤
本文将详细介绍如何将一个 .NET 8 项目通过 Docker 部署到 Linux 系统中。以下步骤包括从项目的创建、Dockerfile 的编写、镜像构建、到最后在 Linux 上的容器运行。 1. 环境准备 在开始之前,请确保你已经具备以下环境: Linux 系统(如 Ubu…...
状态码对照表
别瞎自定义状态码了 1xx:信息性状态码 状态码名称使用场景100Continue客户端应继续请求,等待后续响应。101Switching Protocols服务器根据客户端的请求切换协议。102Processing服务器正在处理请求,但尚未完成。103Early Hints提供给客户端的…...
【愚公系列】《循序渐进Vue.js 3.x前端开发实践》027-组件的高级配置和嵌套
标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…...
Autosar-Os是怎么运行的?(多核系统运行)
写在前面: 入行一段时间了,基于个人理解整理一些东西,如有错误,欢迎各位大佬评论区指正!!! 目录 1.Autosar多核操作系统 1.1多核启动过程 1.2多核运行过程 1.2.1核间任务同步 1.2.2Counte…...
WPF3-在xaml中引用其他程序集的名称空间
1. 如何在XAML里引用类库中的名称空间和类2. 小结 1. 如何在XAML里引用类库中的名称空间和类 首先需要记住一点:把类库引用到项目中是引用其中名称空间的物理基础,无论是C#还是XAML都是这样。 一旦将一个类库引用进程序,就可以引用其中的名…...
无人机红外热成像:应急消防的“透视眼”
无人机红外热成像:应急消防的“透视眼” 亲爱的小伙伴们,每年一到夏天,应急消防的战士们就像上紧了发条的闹钟,时刻准备应对各种灾害。炎热天气让火灾隐患“蹭蹭”往上涨,南北各地还有防洪救灾、台风、泥石流等灾害轮…...
飞牛NAS安装过程中的docker源问题
采用CloudFlare进行飞牛NAS的远程访问 【安全免费】无需公网IP、端口号,NAS外网访问新方法_网络存储_什么值得买 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<EOF {"registry-mirrors": ["https://docker.1panel.dev&quo…...
python基础语法(4) ----- 学习笔记分享
目录 Python 使用库 以及 实战的一些案例 1. 标准库 1.1 认识标准库 1.2 使用import导入模块 1.3 代码示例:日期及结算 1.4 代码示例:字符串操作 1.5 代码示例 : 文件查找工具 2. 第三方库 2.1 认识第三方库 2.2 使用pip 2.3 代码示例:生成二维码 (1) 使用搜索引擎,…...
Linux 内核学习 3b - 和copilot 讨论pci设备的物理地址在内核空间和用户空间映射到虚拟地址的区别
前提知识: 可以把内核当作一个需要特殊权限运行的程序,那么不同的程序,相同的设备物理地址就会映射到不同的虚拟地址 (见Linux 内核学习 3 - 虚拟内存和物理内存)。 You said 同一个pcie 设备物理地址在linux 内核和用…...
算法【有依赖的背包】
有依赖的背包是指多个物品变成一个复合物品(互斥),每件复合物品不要和怎么要多种可能性展开。时间复杂度O(物品个数 * 背包容量),额外空间复杂度O(背包容量)。 下面通过题目加深理解。 题目一 测试链接:[NOIP2006 提…...
【Linux】 冯诺依曼体系与计算机系统架构全解
Linux相关知识点可以通过点击以下链接进行学习一起加油!初识指令指令进阶权限管理yum包管理与vim编辑器GCC/G编译器make与Makefile自动化构建GDB调试器与Git版本控制工具Linux下进度条 冯诺依曼体系是现代计算机设计的基石,其统一存储和顺序执行理念推动…...
【深度学习】 UNet详解
UNet 是一种经典的卷积神经网络(Convolutional Neural Network, CNN)架构,专为生物医学图像分割任务设计。该模型于 2015 年由 Olaf Ronneberger 等人在论文《U-Net: Convolutional Networks for Biomedical Image Segmentation》中首次提出&…...
“深入浅出”系列之算法篇:(2)openCV、openMV、openGL
OpenCV是一个的跨平台计算机视觉库,可以运行在Linux囚、Windows 和Mac OS操作系统上。它轻量级而且高效,由一系列 C函数和少量C类构成,同时也提供了Python 接口,实现了图像处理和计算机视觉方面的很多通用算法。 OpenMV是一个开源,低成本&am…...
低代码系统-产品架构案例介绍、得帆云(八)
产品名称 得帆云DeCode低代码平台-私有化 得帆云DeMDM主数据管理平台 得帆云DeCode低代码平台-公有云 得帆云DePortal企业门户 得帆云DeFusion融合集成平台 得帆云DeHoop数据中台 名词 概念 云原生 指自己搭建的运维平台,区别于阿里云、腾讯云 Dehoop 指…...
web3py+flask+ganache的智能合约教育平台
最近在学习web3的接口文档,使用web3pyflaskganache写了一个简易的智能合约教育平台,语言用的是python,ganche直接使用的本地区块链网络,用web3py进行交互。 代码逻辑不难,可以私信或者到我的闲鱼号夏沫mds获取我的代码…...