当前位置: 首页 > news >正文

Java基础知识(四) -- 面向对象(中)

1.包

1.3.1 包的作用
  • (1)可以避免类重名:有了包之后,类的全名称就变为:包.类名【便于使用】
  • (2)分类组织管理众多的类【便于管理类】
  • (3)可以控制某些类型或成员的可见范围【控制访问范围】

Java中常见的包:

包名作用
java.langJava语言的核心类,如String、Math、Integer、 System和Thread等,提供常用功能
java.net执行与网络相关的操作的类和接口
java.io提供多种输入/输出功能的类
java.util实用工具类,如集合框架类、日期时间、数组工具类Arrays,文本扫描仪Scanner,随机值产生工具Random
java.textJava格式化相关的类

包的本质就是创建不同的文件夹/目录来保存类文件

1.3.2 如何声明包?
package 包名;

注意:

(1)必须在源文件的代码首行

(2)一个源文件只能有一个声明包的语句

包名命名规范与习惯:

    1. 所有单词都小写,每一个单词之间使用.分割
    1. 习惯用公司的域名倒置
1.3.3 如何跨包使用类?

前提:被使用的类或成员的权限修饰符是>缺省的,即可见的。

    1. 使用类型的全名称
    java.util.Scanner input = new java.util.Scanner(System.in);
    
    1. 使用import 语句之后,代码中使用简名称
    import.类名;
    import.*;
    import static.类名.静态成员;
    

2.访问修饰符

2.1 概述

  Java 提供四种访问控制修饰符号,用于控制方法和属性(成员变量)的访问权限(范围):

  1. 公开级别:用 public 修饰,对外公开

  2. 受保护级别:用 protected 修饰,对子类和同一个包中的类公开

  3. 默认级别:没有修饰符号,向同一个包的类公开.

  4. 私有级别:用 private 修饰,只有类本身可以访问,不对外公开.

2.2 访问修饰符的访问范围

访问级别访问修饰控制符同类同包子类不同包
公开public
受保护protected×
默认没有修饰符××
私有private×××

## 3.面向对象编程-封装

3.1 概述

  面向对象编程语言是对客观世界的模拟,客观世界里每一个事物的内部信息都是隐藏在对象内部的,外界无法直接操作和修改,只能通过指定的方式进行访问和修改。封装可以被认为是一个保护屏障,防止该类的代码和数据被其他类随意访问。适当的封装可以让代码更容易理解与维护,也加强了代码的安全性。正如现实生活中,每一个个体与个体之间是有边界的,每一个团体与团体之间是有边界的,而同一个个体、团体内部的信息是互通的,只是对外有所隐瞒。

  随着业务系统越来越复杂,类会越来越多,那么类之间的访问边界必须把握好,面向对象的开发原则要遵循“高内聚、低耦合”,而“高内聚,低耦合”的体现之一:

  • 高内聚:类的内部数据操作细节自己完成,不允许外部干涉;
  • 低耦合:仅对外暴露少量的方法用于使用

  隐藏对象内部的复杂性,只对外公开简单的接口。便于外界调用,从而提高系统的可扩展性、可维护性。通俗的讲,把该隐藏的隐藏起来,该暴露的暴露出来。这就是封装性的设计思想。

Q:封装就是把该隐藏的隐藏起来,该暴露的暴露出来。那么暴露的程度如何控制呢?

A: 依赖访问控制修饰符,也称为权限修饰符来控制。访问控制修饰符来控制相应的可见边界,边界有如下:类、包、子类、模块(Java9之后引入)。权限修饰符:public,protected,缺省,private。

3.2 封装的实现

    1. 将属性私有化private
    1. 提供一个公共的(public)set方法, 用于对属性判断并赋值
    public void setXxx(类型 参数名){//加入业务逻辑判断属性 = 参数名;
    }
    
    1. 提供一个公共的(public)get方法, 用于获取属性值
    public void getXxx(){return xx;
    }
    

3.3 成员变量/属性私有化问题

  成员变量(field)私有化之后,提供标准的get/set方法,我们把这种成员变量也称为属性(property)。 或者可以说只要能通过get/set操作的就是事物的属性,哪怕它没有对应的成员变量。

3.3.1 成员变量封装目的
  • 隐藏类的实现细节
  • 保证对象信息的完整性,提高代码的安全性。让使用者只能通过事先预定的方法来访问数据,从而可在该方法里面加入控制逻辑,限制对成员变量的不合理访问。还可以进行数据检查,从而有利于保证对象信息的完整性。
  • 便于修改,提高代码的可维护性。主要体现在隐藏的部分,在内部修改了,如果其对外可以的访问方式不变,外部根本感觉不到它的修改。例如:Java8->Java9,String从char[]转为byte[]内部实现,而对外的方法不变,使用者根本感觉不到它内部的修改。
3.3.2 成员变量封装实现
  1. 使用 private 修饰成员变量

    public class Chinese{private static String Country;private String name;private int age;private boolean marry;
    }
    
  2. 提供 getXxx方法 / setXxx 方法,可以访问成员变量

    package JavaBase;public class Chinese {private static String country;private String name;private int age;private boolean marry;public static void setCountry(String c) {country = c;}public static String getCountry() {return country;}public void setName(String n) {name = n;}public String getName() {return name;}public void setAge(int a) {age = a;}public int getAge() {return age;}public void setMarry(boolean m) {marry = m;}public boolean isMarry(){return marry;}
    }
    
3.3.3 如何解决局部变量与成员变量同名问题

当局部变量与类变量(静态成员变量)同名时,在类变量前面加“类名.";

当局部变量与实例变量(非静态成员变量)同名时,在实例变量前面加“this.”。

public class Chinese {private static String country;private String name;private int age;public static void setCountry(String country) {Chinese.country = country;}public static String getCountry() {return country;}public void setName(String name) {this.name = name;}public String getName() {return name;}public void setAge(int age) {this.age = age;}public int getAge() {return age;}
}

4.面向对象编程-继承

4.1 概述

  多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类中无需再定义这些属性和行为,只需要和抽取出来的类构成某种关系。如图所示:
在这里插入图片描述
在这里插入图片描述

其中,多个类可以称为子类,也叫派生类;多个类抽取出来的这个类称为父类超类(superclass)或者基类。继承描述的是事物之间的所属关系,这种关系是:is-a 的关系。例如,图中猫属于动物,狗也属于动物。可见,父类更通用,子类更具体。通过继承,可以使多种事物之间形成一种关系体系。

  继承可以解决代码复用,让编程更加靠近人类思维.当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类,在父类中定义相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过 extends 来声明继承父类即可。
在这里插入图片描述

4.2 继承的好处

  • 提高代码的复用性
  • 提高代码的扩展性
  • 类与类之间产生了关系,是学习多态的前提

4.3 继承的格式

【修饰符】 class 父类 {...
}【修饰符】 class 子类 extends 父类 {...
}

示例1:

父类:

package JavaBase.extend.extend01;// 父类:Pupil 和 Graduate 的父类
public class Student {// 公共属性public String name;public int age;private double score;// 公共方法public void setScore(double score) {this.score = score;}public void showInfo() {System.out.println("学生名 " + name + " 年龄 " + age + " 成绩 " + score);}
}

子类:

package JavaBase.extend.extend01;public class Pupil extends Student {public void testing() {System.out.println("小学生" + name + "正在考小学数学..");}
}package JavaBase.extend.extend01;public class Graduate extends Student {public void testing() {System.out.println("大学生" + name + "正在考大学数学..");}
}

测试类:

package JavaBase.extend.extend02;import JavaBase.extend.extend01.Graduate;
import JavaBase.extend.extend01.Pupil;public class Extends01 {public static void main(String[] args) {Pupil pupil = new Pupil();pupil.name = "银角大王~";pupil.age = 11;pupil.testing();pupil.setScore(50);pupil.showInfo();System.out.println("===========================");Graduate graduate = new Graduate();graduate.name="金角大王~";graduate.age = 23;graduate.testing();graduate.setScore(80);graduate.showInfo();}
}
/*
小学生银角大王~正在考小学数学..
学生名 银角大王~ 年龄 11 成绩 50.0
===========================
大学生金角大王~正在考大学数学..
学生名 金角大王~ 年龄 23 成绩 80.0
*/

4.4 理解继承

    1. 子类继承父类所有的属性和方法,非私有的属性和方法可以在子类直接访问, 但是私有属性和方法不能在子类直接访问,要通过父类提供公共的方法去访问。
    1. 子类必须调用父类的构造器, 完成父类的初始化。
    1. 当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中用 super 去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译不通过。
    1. 如果希望指定去调用父类的某个构造器,则显式的调用一下 : super(参数列表)。
    1. super 在使用时,必须放在构造器第一行(super 只能在构造器中使用)。
    1. super() 和 this() 都只能放在构造器第一行,因此这两个方法不能共存在一个构造器。
    1. Java 所有类都是 Object 类的子类, Object 是所有类的基类。
    1. 父类构造器的调用不限于直接父类!将一直往上追溯直到 Object 类(顶级父类)。
    1. 子类最多只能继承一个父类(指直接继承),即 Java 中是单继承机制。
    1. 不能滥用继承,子类和父类之间必须满足 is-a 的逻辑关系。

4.5 继承的本质分析

示例:

public class GrandPa {String name = "大头爷爷";String hobby = "旅游";
}public class Father extends GrandPa {String name = "大头爸爸";private int age = 39;public int getAge(){return age;}
}public class Son extends Father{String name = "大头儿子";
}public class ExtendTheory {public static void main(String[] args) {Son son = new Son();System.out.println(son.name);// 大头儿子System.out.println(son.getAge()); //39System.out.println(son.hobby);//旅游}
}

从以上的案例可以看出来:

  • (1) 首先看子类是否有该属性
  • (2) 如果子类有这个属性,并且可以访问,则返回信息
  • (3) 如果子类没有这个属性,就看父类有没有这个属性(如果父类有该属性,并且可以访问,就返回信息…)
  • (4) 如果父类没有就按照(3)的规则,继续找上级父类,直到 Object…

在这里插入图片描述

5.super关键字

5.1 概述

super 代表父类的引用,用于访问父类的属性、方法、构造器

5.2 基本语法

  • 1.访问父类的属性,但不能访问父类的private属性

    super.属性名;
    
  • 2.访问父类的方法,不能访问父类的private方法

     super.方法名(参数列表);
    
  • 3.访问父类的构造器

    super(参数列表)//只能放在构造器的第一句,只能出现一句!
    

5.3 super的好处

  • 1.调用父类的构造器的好处(分工明确,父类属性由父类初始化,子类的属性由子类初始化)
  • 2.当子类中有和父类中的成员(属性和方法)重名时,为了访问父类的成员,必须通过super。如果没有重名,使用super、this、直接访问是一样的效果!
  • 3.super的访问不限于直接父类,如果爷爷类和本类中有同名的成员,也可以使用super去访问爷爷类的成员;如果多个基类(上级类)中都有同名的成员,使用super访问遵循就近原则。

5.4 super 与 this 比较

编号区别点thissuper
1访问属性访问本类中的属性,如果本类中没有此属性则从父类中继续查找从父类开始查找属性
2调用方法访问本类中的方法,如果本类中没有此方法则从父类中继续查找从父类开始查找方法
3调用构造器调用本类构造器,必须放在构造器的首行调用父类的构造器,必须放在子类构造器的首行
4特殊表示当前对象子类中访问父类对象

6.方法重写/覆盖(override)

6.1 概述

  简单的说:方法覆盖(重写)就是子类有一个方法,和父类的某个方法的名称、返回类型、参数一样,那么我们就说子类的这个方法覆盖了父类的方法。

示例

public class Animal {public void cry() {System.out.println("动物叫唤..");}public Object m1() {return null;}public String m2() {return null;}protected void eat() {}
}public class Dog extends Animal {//1. 因为 Dog 是 Animal 子类//2. Dog 的 cry 方法和 Animal 的 cry 定义形式一样(名称、返回类型、参数)//3. 这时我们就说 Dog 的 cry 方法,重写了 Animal 的 cry 方法public void cry() {System.out.println("小狗汪汪叫..");}
}public class Override01 {public static void main(String[] args) {
//演示方法重写的情况Dog dog = new Dog();dog.cry();// 小狗汪汪叫..}
}

6.2 方法重写的注意事项

方法重写也叫方法覆盖,需要满足下面的条件:

  • 1.子类的方法的形参列表,方法名称,要和父类方法的形参列表、方法名称完全一样。
  • 2.子类方法的返回值类型和父类方法的返回值类型完全一样,或者是父类返回值类型的子类。
  • 3.子类方法不能缩小父类方法的访问权限(public>protected>默认>private)。

6.3 方法重写与重载的区别

名称发生范围方法名形参列表返回值类型修饰符
重载(overload)本类必须一样类型、个数或顺序至少有一个不同无要求无要求
重写(overwride)父子类必须一样相同子类重写的方法,返回值类型和父类返回值类型一致,或者其子类子类不能缩小父类的方法的访问范围

7.面向对象编程-多态

7.1 概述

  在Java中,多态是面向对象编程中的一个重要概念,它允许不同类型的对象对同一方法进行不同的实现。具体来说,多态性指的是通过父类的引用变量来引用子类的对象,从而实现对不同对象的统一操作。方法或对象具有多种形态。是面向对象的第三大特征,多态是建立在封装和继承基础之上的。

例如:狗和猫都是动物,动物共同的行为都有吃这个动作,而狗可以表现为啃骨头,猫则可以表现为吃老鼠。这就是多态的表现,即同一件事情,发生在不同对象的身上,就会产生不同的结果。

public class Animal {public void cry(){System.out.println("Animal Cry() 动物在叫...");}
}public class Dog extends Animal{public void cry(){System.out.println("Dog Cry() 小狗汪汪叫...");}
}public class Cat extends Animal{public void cry(){System.out.println("Cat cry() 小猫喵喵叫...");}
}public class PolyObject {public static void main(String[] args) {//animal1 编译类型就是 Animal , 运行类型 DogAnimal animal1 = new Dog();animal1.cry(); // Dog Cry() 小狗汪汪叫...//animal2 编译类型就是 Animal , 运行类型 CatAnimal animal2 = new Cat();animal2.cry(); // Cat cry() 小猫喵喵叫...}
}

注:

    1. 一个对象的变编译类型和运行类型可以不一致。
    1. 编译类型在定义对象时, 就确定了,不能改变。
    1. 运行类型是可以变化的。
    1. 编译类型看定义时 = 的左边, 运行类型看 = 号的右边。

7.2 多态实现的条件

在Java中,要实现多态性,就必须满足以下条件:

    1. 继承关系
    • 存在继承关系的类之间才能够使用多态性。多态性通常通过一个父类用变量引用子类对象来实现。
    1. 方法重写
    • 子类必须重写(Override)父类的方法。通过在子类中重新定义和实现父类的方法,可以根据子类的特点行为改变这个方法的行为,如猫和狗吃东西的独特行为。
    1. 父类引用指向子类对象
    • 使用父类的引用变量来引用子类对象。这样可以实现对不同类型的对象的统一操作,而具体调用哪个子类的方法会在运行时多态决定

多态的向上转型

  1. 本质:父类引用指向了子类的对象

  2. 语法:父类类型 引用名 = new 子类类型();

  3. 特点:① 编译类型看左边,运行类型看右边

​ ② 可以调用父类中所有的成员(遵守访问权限)

​ ③ 不能调用子类中特有成员

public class Animal {String name = "动物";int age = 10;public void sleep() {System.out.println("睡");}public void run() {System.out.println("跑");}public void eat() {System.out.println("吃");}public void show() {System.out.println("hello,你好");}
}public class Cat extends Animal {@Overridepublic void eat() {//方法重写System.out.println("猫吃鱼");}public void catchMouse() {//Cat 特有方法System.out.println("猫抓老鼠");}
}public class PolyObject {public static void main(String[] args) {//向上转型: 父类的引用指向了子类的对象//语法:父类类型引用名 = new 子类类型();Animal animal = new Cat();animal.eat();animal.sleep();animal.show();animal.run();}
}

多态的向下转型

  1. 语法:子类类型 引用名 = (子类类型) 父类引用

  2. 特点:① 只能强转父类引用,但是不能父类对象

​ ② 要求父类的引用必须指向的是当前目标类型的对象

​ ③ 当向下转型后,可以调用子类类型中所有的成员

// 现在想调用Cat类中的catchMouse 方法--> 向下转型
public class PolyObject {public static void main(String[] args) {//向上转型: 父类的引用指向了子类的对象//语法:父类类型引用名 = new 子类类型();Animal animal = new Cat();animal.eat();animal.sleep();animal.show();animal.run();Cat cat = (Cat) animal;cat.catchMouse();}
}

8.Java的动态绑定机制

    1. 当调用对象方法时, 该方法会和该对象的内存地址/运行类型绑定。
    1. 当调用对象属性时,没有动态绑定机制,哪里声明,哪里使用。

示例如下:

public class A {public int i = 10;public int sum() {return getI() + 10;}public int sum1() {return i + 10;}public int getI() {return i;}
}public class B extends A {public int i = 20;public int sum() {return getI() + 20;//20+20}public int sum1() {return i + 10;// 20+10}public int getI() {return i;}
}public class DynamicBinding {public static void main(String[] args) {A a = new B();System.out.println(a.sum());// 40System.out.println(a.sum1());// 30}
}public class A {public int i = 10;public int sum() {return getI() + 10;//20+10}public int sum1() {return i + 10;//10+10}public int getI() {return i;}
}public class B extends A {public int i = 20;public int getI() {return i;//20}
}public class DynamicBinding {public static void main(String[] args) {A a = new B();System.out.println(a.sum());// 30System.out.println(a.sum1());// 20}
}

9.Object类详解

9.1 equals方法

  ==和 equals 的对比

  • == 是一个比较运算符, 既可以判断基本类型, 又可以判断引用类型。如果判断基本类型,判断的是值是否相等。如果判断引用类型,判断的是地址是否相等,判定是不是同一个对象。
  • equals是Object类中的方法,只能判断引用数据类型。默认是判断地址是否相等,子类往往重写该方法,用于判断内容是否相等。

示例:

/***** 判断两个 Person 对象的内容是否相等,* 如果两个 Person 对象的各个属性值都一样,则返回 true,反之 false*/
public class Person {private String name;private int age;private String gender;@Overridepublic boolean equals(Object obj) {//判断如果比较的两个对象是同一个对象,则直接返回 tif (this == obj) {System.out.println("同一个对象");return true;}//类型判断if (obj instanceof Person) {//进行 向下转型, 因为需要得到obj的各个属性Person person = (Person) obj;System.out.println("不是同一个对象");return this.name.equals(person.name) && this.age == person.age && this.gender.equals(person.gender);}//如果不是 Person ,则直接返回 falsereturn false;}public Person(String name, int age, String gender) {this.name = name;this.age = age;this.gender = gender;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}public class EqualObj {public static void main(String[] args) {Person person1 = new Person("jack", 10, "男");Person person2 = new Person("jack", 20, "男");Person person3 = new Person("jack", 10, "男");System.out.println(person1.equals(person1));System.out.println("=================================");System.out.println(person1.equals(person2));System.out.println("=================================");System.out.println(person1.equals(person3));}
}

9.2 hashCode方法

  hashCode方法返回该对象的哈希码值。实际上, 由Object类定义的hashCode方法会针对不同的对象返回不同的整数[一般通过将该对象的内部地址转换成一个整数来实现]。该方法是提高具有哈希结构的容器效率。两个引用, 如果指向的是同一个对象, 则哈希值肯定是相同的, 反之哈希值是不同的。

示例:

public class HashCode {public static void main(String[] args) {Person person1 = new Person();Person person2 = new Person();Person person3 = person1;System.out.println("person1的哈希值: " + person1.hashCode());System.out.println("person2的哈希值: " + person2.hashCode());System.out.println("person3的哈希值: " + person3.hashCode());}
}
/*
person1的哈希值: 1163157884
person2的哈希值: 1956725890
person3的哈希值: 1163157884
*/

9.3 toString方法

  该方法返回对象的字符串表示形式。Object类的toString方法返回一个包含该类的对象是一个实例的名称字符串的符号` @ ',和符号进制表示的对象的哈希码[全类名+@+哈希值的十六进制]。换句话说,此方法返回一个等于值的字符串:getClass().getName() + ‘@’ + Integer.toHexString(hashCode())。子类往往重写toString方法,用于返回对象的属性信息, 重写toString方法,打印对象或拼接对象时,都会自动调用该对象的toString形式。

public class Monster {private String name;private String job;private double salary;//重写toString方法,输出对象的属性@Overridepublic String toString() {return "Monster {name=" + name + ", job=" + job + ", salary=" + salary + "}";}@Overrideprotected void finalize() throws Throwable {System.out.println("fin....");}public Monster() {}public Monster(String name, String job, double salary) {this.name = name;this.job = job;this.salary = salary;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getJob() {return job;}public void setJob(String job) {this.job = job;}public double getSalary() {return salary;}public void setSalary(double salary) {this.salary = salary;}
}public class ToString_ {public static void main(String[] args) {Monster monster = new Monster("小妖怪", "巡山", 1000);System.out.println(monster.toString() + "\nhashcode=" + monster.hashCode());System.out.println("==当直接输出一个对象时,toString方法会被默认的调用==");System.out.println(monster);//等价monster.toString()}
}

10.总结

在这里插入图片描述

相关文章:

Java基础知识(四) -- 面向对象(中)

1.包 1.3.1 包的作用 (1)可以避免类重名:有了包之后,类的全名称就变为:包.类名【便于使用】(2)分类组织管理众多的类【便于管理类】(3)可以控制某些类型或成员的可见范…...

RAG开发中,如何用Milvus 2.5 BM25算法实现混合搜索

01. 背景 混合搜索(Hybrid Search)作为RAG应用中Retrieve重要的一环,通常指的是将向量搜索与基于关键词的搜索(全文检索)相结合,并使用RRF算法合并、并重排两种不同检索的结果,最终来提高数据的召回率。全文检索与语义…...

RadiAnt DICOM - 基本主题 :从 PACS 服务器打开研究

正版序列号获取:https://r-g.io/42ZopE RadiAnt DICOM Viewer PACS 客户端功能允许您从 PACS 主机(图片存档和通信系统)搜索和下载研究。 在开始之前,您需要确保您的 PACS 服务器和 RadiAnt 已正确配置。有关配置说明&#xff0c…...

使用 CFD 加强水资源管理:全面概述

探索 CFD(计算流体动力学)在增强保护人类健康的土木和水利工程实践方面的重大贡献。 挑战 水资源管理是指规划、开发、分配和管理水资源最佳利用的做法。它包括广泛的活动,旨在确保水得到有效和可持续的利用,以满足各种需求&…...

AMS1117芯片驱动电路·降压芯片的驱动电路详解

编写不易,仅供学习,请勿搬运,感谢理解 AMS1117常见封装 很常用的一种LDO降压芯片,LDO(Low Dropout Regulator)降压芯片是线性稳压器,这种IC因为内部集成的不是开关电路,只能将输入与输出的电压差值通过内部…...

贪心算法 part01

class Solution { public:int maxSubArray(vector<int>& nums) {int result INT32_MIN;int count 0;for (int i 0; i < nums.size(); i) {count nums[i];if (count > result) { // 取区间累计的最大值&#xff08;相当于不断确定最大子序终止位置&#xff…...

新能源汽车充电需求攀升,智慧移动充电服务有哪些实际应用场景?

在新能源汽车行业迅猛发展的今天&#xff0c;智慧充电桩作为支持这一变革的关键基础设施&#xff0c;正在多个实际应用场景中发挥着重要作用。从公共停车场到高速公路服务区&#xff0c;从企业园区到住宅小区&#xff0c;智慧充电桩不仅提供了便捷的充电服务&#xff0c;还通过…...

随机森林算法原理

随机森林算法原理 算法流程随机森林的生成随机森林的预测 算法总结随机森林的优点随机森林的缺点 算法流程 随机森林的生成 输入训练数据 D&#xff0c;样本个数为 m &#xff0c;待学习的决策树数量为 T。 对于 t 1,2,…,T&#xff0c;从 D 中有放回地采样 m 次&#xff0c…...

java中sha256和md5某个字符串实例代码

在Java中&#xff0c;可以使用 java.security.MessageDigest 类来计算字符串的 SHA-256 和 MD5 哈希值。以下是如何为给定的字符串生成这两种哈希值的实例代码。 生成SHA-256和MD5哈希值的示例代码 Java 深色版本 import java.security.MessageDigest; import java.security.N…...

thinkphp8自带分页bootstrap

tp8引用的是bootstrap3.4.1这个版本&#xff1b; 前端结构&#xff1a; <ul class"pagination"><li><a href"/index.php?page4"></a></li><li><a href"/index.php?page1">1</a></li>…...

C++算法第九天

本篇文章我们继续学习c算法 目录 第一题 题目链接 题目展示 代码原理 暴力解法 二分解法 代码编写 第二题 题目链接 题目展示 代码原理 代码编写 重点回顾 朴素二分 非朴素二分 重点一 重点二 重点三 第一题 题目链接 153. 寻找旋转排序数组中的最小值 - 力…...

ASRPRO学习笔记一之语音模型位置和语音替换

一、语音替换的步骤 1、扬声器录音 打开GoldWave,点击工具栏中的蓝色控制属性按钮&#xff0c;点击设备&#xff0c;选择扬声器&#xff0c;点击ok。打开电脑上的网易云音乐&#xff0c;点击红色的录制按钮&#xff0c;开始录制音乐&#xff0c;在网易云音乐上点击播放音乐,录…...

QT编译opencv

一.QT5.12编译 1.QT环境 QT5.12 Qt Creator 12.0.2 2.OpenCV文件 因为QT5.12版本qt最后支持到2021.12月&#xff0c;所以这里选择的opencv版本为2021.4月发布的opencv-3.4.16版本 官网下载地址&#xff1a;https://opencv.org/releases/ 最新版本&#xff1a;opencv-3.4.16.…...

[笔记]关于Qt的nativeEvent事件无法接收window消息的Bug

1.nativeEvent事件无法接收window消息 此处不是nativeEvent不能接收&#xff0c;是possmessage一定要写对发送的软件名称&#xff0c;这个名称在Qt中是主界面类的名称&#xff0c;就是主界面UI的名称&#xff0c;而不是rc文件中定义的名称。 所以在FindWindow函数获取目标窗口…...

基于深度学习的猫狗识别系统【深度学习课设】

&#x1f3c6; 作者简介&#xff1a;席万里 ⚡ 个人网站&#xff1a;https://dahua.bloggo.chat/ ✍️ 一名后端开发小趴菜&#xff0c;同时略懂Vue与React前端技术&#xff0c;也了解一点微信小程序开发。 &#x1f37b; 对计算机充满兴趣&#xff0c;愿意并且希望学习更多的技…...

Java性能调优 - JVM性能监测及调优

JVM 内存模型概述 堆 堆是JVM内存中最大的一块内存空间&#xff0c;该内存被所有线程共享&#xff0c;几乎所有对象和数组都被分配到了堆内存中。堆被划分为新生代和老年代&#xff0c;新生代又被进一步划分为Eden和Survivor区&#xff0c;最后Survivor由From Survivor和To Su…...

[代码随想录21二叉树]二叉树的修改和改造,修剪二叉树,将有序数组转为二叉搜索树

前言 二叉树章节最后的题目了&#xff0c;就是对搜索二叉树的改造&#xff0c; 题目链接 669. 修剪二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 108. 将有序数组转换为二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 一、修剪二叉搜索树 思路&#xff1a;等会…...

C# OpenCV机器视觉:图像平滑

在一个寒冷的冬日&#xff0c;阿强窝在家里的沙发上&#xff0c;裹着厚厚的毛毯&#xff0c;手里捧着一杯热巧克力。他的朋友们约他一起去滑雪&#xff0c;但阿强却更喜欢待在温暖的家中&#xff0c;享受这份宁静。突然&#xff0c;他的手机响了&#xff0c;是朋友们发来的滑雪…...

Dubbo 3.x源码(26)—Dubbo服务引用源码(9)应用级服务发现订阅refreshServiceDiscoveryInvoker

基于Dubbo 3.1&#xff0c;详细介绍了Dubbo服务的发布与引用的源码。 此前我们学习了MigrationRuleHandler这个处理器&#xff0c;它用于通过动态更改规则来控制迁移行为。MigrationRuleListener的onrefer方法是Dubbo2.x 接口级服务发现与Dubbo3.x应用级服务发现之间迁移的关键…...

java client http请求 返回数据 实时循环监听 url 中资源是否生成

1、php 中 执行 exec 调用操作系统 命令行 执行 以下 java 代码 生成 的jar 2、php 执行命令是 以上1 需要命令行 输入 参数 taskid 3、实现实时监听 MP3 url 是否生成 4、 package com.example.filedemo.controller;import java.io.BufferedReader; import java.io.InputStre…...

ONES 功能上新|ONES Copilot、ONES Wiki 新功能一览

ONES Copilot 可基于工作项的标题、描述、属性信息&#xff0c;对工作项产生的动态和评论生成总结。 针对不同类型的工作项&#xff0c;总结输出的内容有对应的侧重点。 应用场景&#xff1a; 在一些流程步骤复杂、上下游参与成员角色丰富的场景中&#xff0c;工作项动态往往会…...

【自适应】postcss-pxtorem适配Web端页面

在进行页面开发时&#xff0c;自适应设计是一个关键的考虑因素。为了实现这一点&#xff0c;postcss-pxtorem是一个非常有用的工具&#xff0c;它可以将CSS中的px单位转换为rem单位&#xff0c;从而实现基于根元素字体大小的自适应布局。下面介绍一下在项目中如何引入并配置pos…...

BOE(京东方)“向新2025”年终媒体智享会首站落地上海 六大维度创新开启产业发展新篇章

12月17日,BOE(京东方)以“向新2025”为主题的年终媒体智享会在上海启动。正值BOE(京东方)新三十年的开局之年,活动全面回顾了2024年BOE(京东方)在各领域所取得的领先成果,深度解读了六大维度的“向新”发展格局,同时详细剖析了BOE(京东方)在智能制造领域的领先实践。BOE(京东方…...

Moretl安全日志采集工具

永久免费: 至Gitee下载 使用教程: Moretl使用说明 使用咨询: 用途 定时全量或增量采集工控机,电脑文件或日志. 优势 开箱即用: 解压直接运行.不需额外下载.管理设备: 后台统一管理客户端.无人值守: 客户端自启动,自更新.稳定安全: 架构简单,兼容性好,通过授权控制访问. 架…...

LabVIEW农机自主导航监控系统

随着现代农业技术的快速发展&#xff0c;自主导航农机的需求日益增加&#xff0c;提高作业效率和减少劳动成本成为农业现代化的关键目标。本文介绍了一个基于LabVIEW的农机自主导航监控系统的开发案例&#xff0c;该系统通过先进的传感器与控制技术&#xff0c;实现农机在田间作…...

ChatGPT重大更新:新增实时搜索和高级语音

12月17日消息&#xff0c;据报道&#xff0c;OpenAI开启了第八天技术分享直播&#xff0c;对ChatGPT搜索功能进行了大量更新。 此次ChatGPT新增的功能亮点纷呈。其中&#xff0c;实时搜索功能尤为引人注目。OpenAI对搜索算法进行了深度优化&#xff0c;使得用户提出问题后&…...

爬虫基础学习

爬虫概念与工作原理 爬虫是什么&#xff1a;爬虫&#xff08;Web Scraping&#xff09;是自动化地访问网站并提取数据的技术。它模拟用户浏览器的行为&#xff0c;通过HTTP请求访问网页&#xff0c;解析HTML文档并提取有用信息。 爬虫的基本工作流程&#xff1a; 发送HTTP请求…...

一般行业安全管理人员考试题库分享

1.在高速运转的机械飞轮外部安装防护罩&#xff0c;属于(B)安全技术措施。 A.限制能量 B.隔离 C.故障设计 D.设置薄弱环节 2.生产经营单位的(B)是本单位安全生产的第一责任人&#xff0c;对落实本单位安全生产主体责任全面负责&#xff0c;具体履行安全生产管理职责。 A.全员 B…...

递归问题(c++)

递归设计思路 数列递归 : 如果一个数列的项与项之间存在关联性&#xff0c;那么可以使用递归实现 ; 原理 : 如果一个函数可以求A(n)&#xff0c;那么该函数就可以求A(n-1)&#xff0c;就形成了递归调用 ; 注意: 一般起始项是不需要求解的&#xff0c;是已知条件 这就是一个典型…...

企业数字化转型规划“秘籍”全解析

一、规划前奏&#xff1a;明确目标与洞察现状 &#xff08;一&#xff09;描绘数字化转型愿景 数字化转型愿景是工程设计总承包企业未来发展的蓝图&#xff0c;是企业数字化征程的指引。它不仅涉及技术更新&#xff0c;更是企业战略、运营模式和组织文化的深度重塑。企业需确保…...

达梦8-达梦数据的示例用户和表

1、示例库说明&#xff1a; 创建达梦数据的示例用户和表&#xff0c;导入测试数据。 在完成达梦数据库的安装之后&#xff0c;在/opt/dmdbms/samples/instance_script目录下有用于创建示例用户的SQL文件。samples目录前的路径根据实际安装情况进行修改&#xff0c;本文将达梦…...

day08-别名-重定向-去重排序等

1.重复用touch命令创建同一份文件&#xff0c;会修改文件的时间戳。 alias命令&#xff1a; 别名 查看已有别名&#xff1a;alias [rootoldboy ~]# alias alias cpcp -i alias egrepegrep --colorauto alias fgrepfgrep --colorauto alias grepgrep --colorauto alias l.ls…...

如何在 .NET Core 中轻松实现异步编程并提升性能

目录 初识异步编程 与多线程关系 异步编程操作 初识异步编程 异步编程&#xff1a;是指在执行某些任务时程序可以在等待某个操作完成的过程中继续执行其他任务&#xff0c;而不是阻塞当前线程&#xff0c;这在处理I/O密集型操作(如文件读取、数据库查询、网络请求等)时尤为重…...

makefile文件

简介&#xff1a; 自动化编译&#xff1a;只需要一个make命令&#xff0c;整个工程自动编译 提高编译效率&#xff1a;再次编译时&#xff0c;只编译修改的文件&#xff08;查看时间戳&#xff0c;根据修改文件的时间判断文件是否被修改&#xff09; 基本语法&#xff1a; …...

MybatisPlus使用LambdaQueryWrapper更新时 int默认值问题

问题&#xff1a; User user new User();user.setBalance(1000);QueryWrapper<User> queryWrapper new QueryWrapper<>();queryWrapper.eq("username","Jack");userMapper.update(user, queryWrapper);通过用户名&#xff0c;更新金额&…...

泷羽sec学习打卡-brupsuite7搭建IP炮台

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都 与本人无关,切莫逾越法律红线,否则后果自负 关于brupsuite的那些事儿-Brup-IP炮台搭建 搭建炮台服务端安装zmap1、更新系统和安装基础依赖&#xff…...

WPF系列一:窗口设置无边框

WindowStyle 设置&#xff1a;WindowStyle"None"&#xff0c;窗口无法拖拽&#xff0c;但可纵向和横向拉伸 <Window x:Class"WPFDemo.MainWindow.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x&quo…...

《C++与 Armadillo:线性代数助力人工智能算法简化之路》

在人工智能领域&#xff0c;线性代数运算可谓是构建各类模型与算法的基石。从神经网络中的矩阵乘法、向量运算&#xff0c;到数据处理中的特征分解、奇异值分解等&#xff0c;无一不依赖高效且精准的线性代数计算。而 C作为一种强大且高效的编程语言&#xff0c;在人工智能开发…...

【新界面】基于卷积神经网络的垃圾分类(Matlab)

基于CNN的垃圾识别与分类GUI【新界面】 有需要可直接联系我&#xff0c;基本都在在线&#xff0c;能秒回&#xff01;可加我看演示视频&#xff0c;不懂可以远程教学 1.此项目设计包括两份完整的源代码&#xff0c;有GUI界面的代码和无GUI界面系统的代码。 &#xff08;以下部…...

阿尔茨海默症数据集,使用yolo,voc,coco格式对2013张原始图片进行标注,可识别轻微,中等和正常的症状

阿尔茨海默症数据集,使用yolo&#xff0c;voc&#xff0c;coco格式对2013张原始图片进行标注&#xff0c;可识别轻微&#xff0c;中等&#xff0c;严重和正常的症状 数据集分割 训练组100&#xff05; 2013图片 有效集&#xff05; 0图片 测试集&#xf…...

评估二分类模型性能之AUC-ROC 曲线

AUC-ROC 曲线 是评估二分类模型性能的重要工具。它结合了 受试者工作特性曲线 (Receiver Operating Characteristic, ROC) 和 曲线下面积 (Area Under the Curve, AUC)&#xff0c;全面衡量分类器在不同阈值下的表现。 概念解释 1. ROC 曲线 ROC 曲线展示了分类器在不同阈值下…...

睡岗和玩手机数据集,4653张原始图,支持YOLO,VOC XML,COCO JSON格式的标注

睡岗和玩手机数据集&#xff0c;4653张原始图&#xff0c;支持YOLO&#xff0c;VOC XML&#xff0c;COCO JSON格式的标注 数据集分割 训练组70&#xff05; 3257图片 有效集20&#xff05; 931图片 测试集10&#xff05; 465图片 预处理 没有采用任何预处…...

景联文科技:精准语音标注,驱动语音技术新发展

在人工智能迅速发展的今天&#xff0c;语音技术的应用已经渗透到我们生活的方方面面。从智能音箱、语音助手到自动语音识别系统&#xff0c;高质量的语音数据是这些应用成功的关键。景联文科技作为领先的AI数据服务提供商&#xff0c;专注于为客户提供高精度、高效的语音标注服…...

Linux 查看目录命令 ls 详细介绍

Linux 和 Unix 系统中 ls 命令是用于列出目录内容。用户可以查看指定目录下的文件和子目录&#xff0c;还可以获取有关这些文件和子目录的详细信息。 基本语法&#xff1a; ls [选项] [目录]如果不指定目录&#xff0c;ls 将列出当前工作目录下的内容。 01、-a 或 --all ls…...

Flux Tools 结构简析

Flux Tools 结构简析 BFL 这次一共发布了 Canny、Depth、Redux、Fill 四个 Tools 模型系列&#xff0c;分别对应我们熟悉的 ControlNets、Image Variation&#xff08;IP Adapter&#xff09;和 Inpainting 三种图片条件控制方法。虽然实现功能是相同的&#xff0c;但是其具体…...

从零开始:PHP基础教程系列-第13篇:构建简单的Web应用

从零开始&#xff1a;PHP基础教程系列 第13篇&#xff1a;构建简单的Web应用 在本篇文章中&#xff0c;我们将学习如何使用PHP构建一个简单的Web应用。这个应用将实现用户注册和登录功能&#xff0c;并使用PDO与MySQL数据库进行交互。我们将逐步实现这个应用的基本功能。 一…...

文件夹属性变0字节:全面解析与恢复指南

一、文件夹属性变0字节现象概述 在日常使用电脑的过程中&#xff0c;我们可能会遇到文件夹属性突然变为0字节的情况。这意味着文件夹中的文件列表或元数据被某种方式清空或损坏&#xff0c;导致系统无法正确读取文件夹的内容。当您尝试打开此类文件夹时&#xff0c;通常会收到…...

PDFMathTranslate 一个基于AI优秀的PDF论文翻译工具

PDFMathTranslate 是一个设想中的工具&#xff0c;旨在翻译PDF文档中的数学内容。以下是这个工具的主要特点和使用方法&#xff1a; 功能特点 数学公式识别&#xff1a;利用先进的OCR&#xff08;光学字符识别&#xff09;技术&#xff0c;精准识别PDF文档中的数学公式和文本…...

35. Three.js案例-创建带阴影的球体与平面

35. Three.js案例-创建带阴影的球体与平面 实现效果 知识点 WebGLRenderer WebGLRenderer 是Three.js中用于渲染场景的主要类之一&#xff0c;它负责将场景中的对象渲染到画布上。 构造器 new THREE.WebGLRenderer(parameters : Object) 参数类型描述parametersObject可选…...

【Linux】深入理解进程信号机制:信号的产生、捕获与阻塞

&#x1f3ac; 个人主页&#xff1a;谁在夜里看海. &#x1f4d6; 个人专栏&#xff1a;《C系列》《Linux系列》《算法系列》 ⛰️ 时间不语&#xff0c;却回答了所有问题 目录 &#x1f4da;前言 &#x1f4da;一、信号的本质 &#x1f4d6;1.异步通信 &#x1f4d6;2.信…...