Java抽象类和接口

2023-10-30

一、抽象类

在面向对象的概念中,所有对象都是通过类来描绘的,但并不是所有类都是用来描绘对象的。如果一个类中没有足够的属性和行为来描绘一个完整具体的对象,Java 提供了一个语法——抽象类。

例如我们需要一个描述形状的类,成员方法可以输出当前的形状,但是形状有很多种,一个类中如果包含那么多方法就会显得很乱。可以使用抽象类,抽象类无法描述一个形状,但是其子类可以,继承抽象类然后重写抽象方法来输出不同的形状。这样就可以实现代码的重用和扩展性。

在这里插入图片描述


抽象类的概念

Java 抽象类是一种特殊的类,抽象类不能被实例化,只能被继承。抽象类的主要作用是为了实现代码的重用和扩展性。通过定义抽象类,可以将一些通用的属性和方法提取出来,供多个子类共享使用和重写。子类可以根据自身的需求对抽象方法进行实现,从而实现不同的功能。

抽象类的特点
1.被关键字 abstract 修饰的类称为抽象类,抽象类不能实例化对象;
2.抽象类中包含抽象方法和成员方法。抽象方法没有具体实现,只有方法的声明,当子类继承抽象类时,子类必须重写这些抽象方法;
3.抽象类可以拥有成员变量和成员方法,可以被子类继承和使用;
4.如果一个类继承了抽象类,那么子类必须重写所有的抽象方法。如果是抽象类则不用重写,但是一旦子类抽象类被普通类继承,需要重写两个父类的所有抽象方法;
5.抽象类可以拥有构造方法,但是不能用于实例化对象。


如何定义抽象类

在文章前面了解到,可以使用 abstract 关键字修饰一个类,让这个类成为抽象类(abstract class),抽象类不能实例化对象,其主要作用就是为了被继承。

也可以使用 abstract 关键字修饰方法,让这个方法成为抽象方法(abstract method),抽象方法没有具体的实现,其主要作用就是为了被子类重写。

1.代码示例: 定义一个图形抽象类

// 抽象形状类
abstract class Shape {
    // 成员变量:形状的名字
    private String name;

    // 抽象方法:输出当前形状,没有具体实现
    abstract public void display();

    // 成员方法:获取当前形状的名字
    public String getName() {
        return this.name;
    }
}

2.继承上方的抽象类并重写抽象方法

class Triangle extends Shape {
    // 构造方法:
    // 先构造父类;
    // 后构造子类;
    public Triangle(String name) {
        super(name);
    }
    //重写抽象方法
    @Override
    public void display() {
        System.out.println("△");
    }
}

注意: 如果没有重写抽象类的抽象方法,编译会报错!

3.使用子类重写父类的抽象方法,继承父类的属性、方法

public static void main(String[] args) {
    // 实例化对象
    Triangle t = new Triangle("三角形");
    // 使用子类重写父类的抽象方法:△
    t.display();
    // 使用子类继承抽象类的成员方法:三角形
    System.out.println("形状的名称是 " + t.getName());
}

抽象类的特性

1.抽象类不能被实例化;

public static void main(String[] args) {
    Shape shape = new Shape("三角形");
    // java: Main.Shape是抽象的; 无法实例化
}

2.抽象方法的访问修饰符不能是 private

abstract class Shape {
    abstract private void display();
    // java: 非法的修饰符组合: abstract和private
}

3.抽象方法的本质就是被子类重写,不能被 static final 关键字修饰;

abstract class Shape {
    abstract public final void draw();
    // java: 非法的修饰符组合: abstract和final
    abstract public static void display();
    // java: 非法的修饰符组合: abstract和private
}

4.抽象类被继承,子类必须重写父类所有抽象方法,否则会报错;

// 抽象类
abstract class Shape {
    abstract public void display();
}
// 普通类子类
class Triangle extends Shape{
    // java: Triangle不是抽象的, 并且未覆盖Shape中的抽象方法display()
}

当抽象类继承抽象类时,不需要重写父类抽象方法,如果子类再被普通类继承,那么需要重写所有抽象方法:

abstract class Shape {
    abstract public void display();
}

abstract class Triangle extends Shape{
    // 因为Triangle也是抽抽象类,所以不用重写父类抽象方法
    abstract public void draw();
}

class Circle extends Triangle{
    @Override
    public void draw() {
        System.out.println("○");
    }
    // 就算重写了父类Triangle所有的抽象方法;
    // 还是要重写Triangle父类Shape所有的抽象方法;
    @Override
    public void display() {
        System.out.println("△");
    }
}

总结:抽象类的作用

1.提供了一种抽象的模版和基类,用于定义一组相关类的共同特征和行为。子类继承抽象类后,必须重写父类抽象方法,从而使得子类具有相同的特征和行为;

2.限制类的实例化。这样可以确保抽象类的实例化对象具有一定的特征和行为,而不是一个没有明确定义的对象;

3.实现代码的复用和扩展。抽象类可以作为其他类的基类,子类可以继承抽象类的特征和行为。这样可以避免重复编写相同的代码,提高代码的复用性;

4.提供多态性。通过抽象类可以统一处理一组相同类的对象,实现多态性。


二、接口

接口这个名称一听大家就能联想到:插座、USB、音响、手机充电接口等等……
![在这里插入图片描述](https://img-blog.csdnimg.cn/37b08fcb83e94f3ebabb5c6dba4acc02.png

产品提供了公共的接口,用户在使用时必须符合规范标准,如果不符合规范标准就不能使用,还会造成不必要的损失。而在 Java 中,接口可以看成是:多个类的公共规范,是一种抽象引用数据类型。

此图就是使用接口不符合规范标准的示例,注意,此图为反例!切勿用于实际。
在这里插入图片描述


接口的概念

在 Java 中,接口是一种特殊的引用类型,它定义了一组抽象方法和常量。接口可以被类实现(implement)或者被其他接口类继承(extends)。
接口的主要作用是定义一组方法的规范,强制实现类提供特定的方法。它可以提供代码的灵活性和可扩展性,降低代码的耦合度,使得程序更易于维护和扩展。接口常用于回调方法、定义常量集合、实现多态等场景。


如何定义接口

语法格式

public interface 接口名称 {

	// public static final 静态常变量……
	
	// public abstract 抽象方法……
	
}

语法规定
1.创建接口时使用 interface 关键字;
2.实现接口使用 implements 关键字,支持实现多个接口;
3.创建接口时命名一般以大写的 I 开头,命名一般为形容词性;
4.定义成员变量时,变量默认属性为 public static final
5定义成员方法时,方法默认属性为 public abstract
6.定义变量和方法时,如果更改了默认属性,则会发生报错。

代码示例: 创建一个 USB 接口

public interface IUSB {
    String NAME = "USB-3.0"; // 接口名称
    void useUSB(); // 使用USB接口
    void closeUSB(); // 关闭接口
}

实现 IUSB 接口

public class USB implements IUSB{
    @Override
    public void useUSB() {
        System.out.println("正在使用" + NAME + "接口");
    }
    @Override
    public void closeUSB() {
        System.out.println("关闭" + NAME + "接口");
    }
}

使用实现接口的类

public static void main(String[] args) {
    USB usb = new USB();
    usb.useUSB(); // 输出结果:正在使用USB-3.0接口
    usb.closeUSB(); // 输出结果:关闭USB-3.0接口
}

接口特性

1.接口类型是一种引用类型,但是没有构造方法,不能实例化对象;

public static void main(String[] args) {
    IUSB usb = new ISUB(); // 无法解析符号“ISUB”
}

2.接口的变量和接口都有默认的属性,定义时书写默认关键字时,这些关键字就会变灰色,表示可以省略。如果定义的时候更改默认属性,就会发生报错;
在这里插入图片描述
在这里插入图片描述

3.接口中的抽象方法和抽象类的抽象方法一样不能实现,只能由实现接口的子类来实现;
在这里插入图片描述

4.重写接口方法时,访问修饰符等级不等低于 public
在这里插入图片描述

5.接口中没有构造方法和静态代码块,定义会报错;
在这里插入图片描述

6.接口虽然不是类,但是接口编译完成后生成的字节码文件后缀名也是 .class

7.和抽象类一样,实现了接口,如果不重写其抽象方法,那么这个类必须为抽象类。后者如果有普通类,必须重写所有抽象方法。


实现多个类

文章上面也谈到过,Java 是单继承多实现,指的是 Java 类只能继承一个类,但是一个类可以实现多个接口。例如将动物所有的动作都抽象为接口,然而动物代表普通类,普通类需要那些动作,就实现那些接口即可。

将不同的动作抽离出来定义成接口

interface IFly {
    String NAME = "飞翔";
    void fly(); // 飞翔
}

interface IRun {
    String NAME = "奔跑";
    void run(); // 奔跑
}

interface ISwim {
    String NAME = "游泳";
    void swim(); // 游泳
}

interface IJump {
    String NAME = "弹跳";
    void jump(); // 弹跳
}

interface IRoll {
    String NAME = "滚动";
    void Roll(); // 滚动
}

然后由不同特性的动物类来实现这些行为即可

在这里插入图片描述

// 小狗会跑、游泳和跳
class Dog implements IRun,ISwim,IJump{
    public String name; // 姓名

    // 奔跑
    @Override
    public void run() {
        System.out.println(this.name + "正在狂跑");
    }

    // 狗刨
    @Override
    public void swim() {
        System.out.println(this.name + "正在游泳");
    }

    // 跳跃
    @Override
    public void jump() {
        System.out.println(this.name + "正在跳过一个一个小坎");
    }
}

在这里插入图片描述

// 小鸟会飞翔、跳跃
class bird implements IFly,IJump {
    public String name; // 姓名
    @Override
    public void fly() {
        System.out.println(this.name + "正在飞");
    }

    @Override
    public void jump() {
        System.out.println(this.name + "正在树干上来回跳跃");
    }
}

注意: 一个类可以实现多个接口,但是必须重写这些接口的所有抽象方法,否则必须设置为抽象类。

接口之间继承

虽然类与类之间只能单继承,但是 Java 中接口与接口之间可以实现多继承。使用关键字 extends

例如高级动物——人,有很多种行为:
在这里插入图片描述

interface IRun {
    String NAME = "跑步";
    void run(); // 跑步
}

interface IEat {
    String NAME = "吃饭";
    void eat(); // 吃饭
}

interface IRead {
    String NAME = "阅读";
    void read(); // 阅读
}

interface IWork {
    String NAME = "工作";
    void work(); // 工作
}

就拿学生举例,学生在上方定义的接口中,会跑步、吃饭和阅读。但是学生也可以有自己独立的属性:班级、学校地址等等…… 独立的行为:学习、睡觉、休息等等……

interface IStudent extends IRun,IEat,IRead {
    String GRADE = "六年级"; // 年级
    String ADDRESS = "巨人小学"; // 地址
    
    void learn(); // 学习
    void sleep(); // 睡觉
    void rest(); // 休息
}

当我们使用普通类实现 IStudent 接口时,需要重写所有的抽象方法。接口之间的继承就相当于将多个接口合并在一起。


Comparable 接口

这里拿数组排序作为例子,数组排序在面向过程语言实现时,需要自己手动编写相关代码逻辑。而在面向对象语言中,早就封装好了一系列的方法,用户只需要调用即可。

面向过程数组排序——C语言

#include <stdio.h>

// 打印数
void display(int array[], int len)
{
	if (array == NULL)
	{
		printf("数组为NULL, 打印失败!");
		return;
	}
	int i = 0;
	for (i = 0; i < len; i++)
	{
		printf("%d ", array[i]);
	}
	printf("\n"); // 换行
}

// 冒泡排序
int* bubble_sort(int array[], int len)
{
	if (array == NULL)
	{
		printf("数组为NULL,排序失败!");
		return NULL;
	}
	int i = 0;
	for (i = 0; i < len - 1; i++)
	{
		int j = 0;
		int orderly = 1; // 判断是否有序
		for (j = 0; j < len - i - 1; j++) {
			if (array[j] < array[j + 1])
			{
				int tmp = array[j];
				array[j] = array[j + 1];
				array[j + 1] = tmp;
				orderly = 0;
			}
		}
		if (orderly)
		{
			break;
		}
	}
	return array;
}

// 主函数
int main()
{
	int arr[] = {1,2,3,4,5,6,7,8,9,10};
	int len = sizeof(arr) / sizeof(arr[0]); // 求数组长度
	printf("排序前打印:");
	display(arr, len);
	printf("排序后打印:");
	display(bubble_sort(arr, len), len);

	return 0;
}

输出结果
在这里插入图片描述

面向对象数组排序——Java

public static void main(String[] args) {
    Integer[] array = {1,2,3,4,5,6,7,8,9,10};
    System.out.println("排序前打印:" + Arrays.toString(array));
    Arrays.sort(array, Collections.reverseOrder());
    System.out.println("排序后打印:" + Arrays.toString(array));
}
输出结果:
排序前打印:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
排序后打印:[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

可以看出,调用 Arrays 类中现成的 sort() 方法, 的确要比C语言要方便。Arrays 类中的 sort() 方法除了能排序基本数值类型的数组,还可以将对象数组进行排序,例如排序一组学生数据的数组。

学生类

class Student {
    String name; // 姓名
    int age; // 年龄
    double score; // 成绩

    public Student(String name, int age, double score) {
        this.name = name;
        this.age = age;
        this.score = score;
    }
}

定义五个学生存放至数组调用 sort()

Student stu1 = new Student("小红",18,98);
Student stu2 = new Student("小明",15,50);
Student stu3 = new Student("小蓝",18,60);
Student stu4 = new Student("小菊",18,70);
Student stu5 = new Student("小小",16,50);
Student[] students = {stu1,stu2,stu3,stu4,stu5};
Arrays.sort(students);

发生报错
在这里插入图片描述
报错的原因是因为学生对象的属性有很多种,sort() 方法不知道根据那个属性进行排序,也不知道排序的规则是什么。这就需要用户来告知编译器该根据哪个属性那种规则进行排序。

sort() 的底层是根据 Comparable 接口的 compareTo() 方法的返回值来进行排序的,而我们需要做的就是重写 compareTo() 方法来重新定义比较规则,这就需要学生类来实现 Comparable 接口。

重定义比较规则,重写 compareTo() 方法,根据 age 排序

  • A > B 返回 正数
  • A < B 返回 负数
  • AB相同 返回 0
class Student implements Comparable {
    // 成员变量
    String name; // 姓名
    int age; // 年龄
    double score; // 成绩

    // 构造方法
    public Student(String name, int age, double score) {
        this.name = name;
        this.age = age;
        this.score = score;
    }

    // 重新定义比较规则
    @Override
    public int compareTo(Object o) {
        Student student = (Student)o;
        return this.age - student.age;
    }

    // 重写toString()方法
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                " age=" + age +
                " score=" + score +
                '}' + '\n';
    }
}

当我们再一次调用 sort 方法时,则不会报错,因为编译器已经知道了比较对象和规则。

public static void main(String[] args) {
    Student stu1 = new Student("小红",18,98);
    Student stu2 = new Student("小明",15,50);
    Student stu3 = new Student("小蓝",18,60);
    Student stu4 = new Student("小菊",14,70);
    Student stu5 = new Student("小小",16,50);
    Student[] students= {stu1,stu2,stu3,stu4,stu5};
    
    System.out.println("排序前打印:");
    System.out.println(Arrays.toString(students));
    Arrays.sort(students);
    System.out.println("排序后打印:");
    System.out.println(Arrays.toString(students));
    System.out.println("降序打印:");
    Arrays.sort(students,Comparator.reverseOrder());
    System.out.println(Arrays.toString(students));
}
输出结果:
排序前打印:
[Student{name='小红' age=18 score=98.0}
, Student{name='小明' age=15 score=50.0}
, Student{name='小蓝' age=18 score=60.0}
, Student{name='小菊' age=14 score=70.0}
, Student{name='小小' age=16 score=50.0}
]
排序后打印:
[Student{name='小菊' age=14 score=70.0}
, Student{name='小明' age=15 score=50.0}
, Student{name='小小' age=16 score=50.0}
, Student{name='小红' age=18 score=98.0}
, Student{name='小蓝' age=18 score=60.0}
]
降序打印:
[Student{name='小红' age=18 score=98.0}
, Student{name='小蓝' age=18 score=60.0}
, Student{name='小小' age=16 score=50.0}
, Student{name='小明' age=15 score=50.0}
, Student{name='小菊' age=14 score=70.0}
]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java抽象类和接口 的相关文章

  • 读取文件并获取 key=value 而不使用 java.util.Properties

    我正在构建一个 RMI 游戏 客户端将加载一个包含一些键和值的文件 这些键和值将用于多个不同的对象 它是一个保存游戏文件 但我不能为此使用 java util Properties 它符合规范 我必须读取整个文件并忽略注释行和与某些类不相关
  • 正确配置JDK环境变量后仍然找不到java命令

    我在 Windows 虚拟机启动时安装 JDK 使用 cloudinit 用户数据将 PowerShell 脚本传输到 Windows 计算机 然后运行该脚本来安装 JDK softwares Get ItemProperty HKLM S
  • 如何防止在 CXF Web 服务客户端中生成 JAXBElement

    我正在尝试使用 CXF 创建一个 Web 服务客户端来使用 WCF Web 服务 当我使用 wsdl2java 时 它生成具有 JAXBElement 类型而不是 String 的对象 我读到有关使用 jaxb bindings xml 文
  • 在哈希图中存储字符和二进制数

    我正在尝试存储字母到二进制数的映射 这是我的映射 h 001 i 010 k 011 l 100 r 101 s 110 t 111 为此 我创建了一个哈希映射并存储了键值对 我现在想显示给定句子的相应二进制值 这是我的代码 package
  • 以点作为分隔符分割字符串

    我想知道我是否要在一个字符串上分割字符串 正确的方式 我的代码是 String fn filename split return fn 0 我只需要字符串的第一部分 这就是我返回第一项的原因 我问这个是因为我在 API 中注意到 意味着任何
  • 如何在数据库中对 (Java) 枚举进行建模(使用 SQL92)

    您好 我正在使用名为 性别 的列对实体进行建模 在应用程序代码中 性别应该是一个 Java 枚举类型 有 2 个值 男性和女性 知道作为数据类型的枚举不是通用 SQL 语言 92 的一部分 您将如何建模它 数据模型必须是可移植的 以便由多个
  • WebLogic 10 中的临时目录

    每当 WL 停止时 它都不会删除其临时目录 即 domains mydomain servers myserver tmp WL TEMP APP DOWNLOADS domains mydomain servers myserver tm
  • 使用 JAXB 编组 LocalDate

    我正在构建一系列链接类 我希望能够将其实例编组到 XML 以便我可以将它们保存到文件中并稍后再次读取它们 目前我使用以下代码作为测试用例 import javax xml bind annotation import javax xml b
  • 如果按下 Esc 则中断循环

    我用 JAVA 语言编写了一个程序 它使用 Scanner 类接受来自控制台的输入 现在我想将此功能添加到我的代码中 以便在用户按下 Esc 按钮时存在循环 while 到目前为止 我认为键盘类可以帮助我 但它就像扫描仪一样 我尝试使用事件
  • JAX-WS:有状态 WS 在独立进程中失败

    我在 Tomcat 上部署了一个有状态的 Web 服务 它由工厂服务和主要 API 服务组成 并且工作得很好 工厂服务将 W3CEndpointReference 返回到主 API 实例 客户端使用会话 现在 我尝试将相同的服务作为独立应用
  • Hystrix是否可以订阅CircuitBreaker开启事件?

    对于单元测试 我希望能够订阅 Hystrix 事件 特别是在断路器打开或关闭时发生事件 我四处寻找示例 似乎解决方法是利用指标流并监视断路器标志 由于 Hystrix 是基于 RxJava 构建的 我认为应该在某个地方有一个事件订阅接口 在
  • 中间件 API 的最佳实践是什么? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我们正在开发一个中间件 SDK 采用 C 和 Java 语言 供游戏开发人员 动画软件开发人员 阿凡达开
  • 如何在命令提示符中检查 JAVA_OPTS 值?

    我们的应用程序部署 JBoss 服务器然后抛出错误 PermGen space 然后在 jboss bat 和配置文件中设置 permgen 变量中的 java OPTS JAVA OPTs 中是否有值 assige 如何检查 如何在命令提
  • Netty中连接关闭后重新连接的最佳方法是什么

    简单场景 扩展 SimpleChannelUpstreamHandler 的较低级别的类 A 此类是发送消息和接收响应的主力 系统其他部分可以使用顶级类 B 来发送和接收消息 可以模拟同步和异步 此类创建 ClientBootstrap 设
  • C++ 中的 Java ArrayList [重复]

    这个问题在这里已经有答案了 在Java中我可以做 List
  • BoneCP 和 Derby - 如何正确关闭

    I have BoneCP CONNECTION POOL CONNECTION POOL getConfig setJdbcUrl jdbc derby database shutdown true Connection connecti
  • java数据结构模拟数据树

    我需要帮助定义使用什么方法 我有一个 SOAP 响应 给我一个 xml 文件 我需要在屏幕上显示 3 个相关列表 当您在第一个列表中选择一个项目时 相应的选择将出现在第二个列表中 依此类推 我只对从 xml 流中提取数据后如何有效地组织数据
  • C/C++ 通过 Android NDK 在 JNI 中看不到 Java 方法

    我正在尝试从使用 NDK 构建的 C 类文件调用 Java 方法 它不断抛出常见的 未找到非静态方法 错误并导致整个 Android 应用程序崩溃 下面的代码片段 有些东西可能不需要 但我按原样保留它们 因为焦点 问题在于refreshJN
  • Java:基于 Web 的应用程序中的单例类实例

    我在 Web Application 中有这个 Singleton 类 public class MyDAO private static MyDAO instance private MyDAO public static MyDAO g
  • 在多线程环境中,Collections.sort 方法有时会抛出 ConcurrentModificationException。列表没有进行结构性修改

    package CollectionsTS import java util ArrayList import java util Collections import java util HashSet import java util

随机推荐

  • Mysql8.0开启远程访问权限

    use mysql 登录后选择mysql数据库 select host user password from user 查看当前root对应host是否为 update user set host where user root 更新 se
  • 基于YOLOv5+Hough变换的目标检测和车道线检测

    这学期做的一个大作业 实现了对行驶过程中车辆 行人以及车道线的检测 1 B站视频演示 2 Github仓库链接 文章目录 一 实现效果 二 环境配置 三 基于YOLOv5的目标检测 四 基于Hough变换的车道线检测 4 1 前置工作 Ca
  • 鸿蒙3部曲先看哪部,“隋唐三部曲”“鸿蒙三部曲”“斗罗四部曲”谁才是网文巅峰之作...

    原标题 隋唐三部曲 鸿蒙三部曲 斗罗四部曲 谁才是网文巅峰之作 从网络小说诞生的那一刻起 续集就是一个绕不过去的话题 如同电视剧一样 一部网络小说红了之后 它的原作者很多时候会忍不住开发它的续集 形成一个系列 然后再现网文界 小编今天就给大
  • java开发转测试开发经历

    1 背景 我从毕业一直做java开发已经两年半了 到目前为止也挺喜欢开发的 2 为什么想转行 想转行是由多方面考虑的 一 我的开发技能没达标 只能找到外包里的开发工作 二 开发前景对女生不够友好 难以获得认可 个人感受 至于第一点其实也可以
  • 减少数据打拍翻转的低功耗设计方法

    在流水设计中 时常会遇到对某一路数据打多拍从而对齐另一路数据的场景 而除了最后一拍是真正需要的 中间的打拍从功耗上来看是有点浪费的 举个例子 对8bit in data打4拍 总共需要用到4个8bit寄存器 常规打拍方法传输4个数据 D0
  • android 屏幕适配--------解决方案

    以下是Demo首页的预览图 demo下载 http www eoeandroid com forum php mod attachment aid NjE0Njh8ZTIyZDA2M2N8MTMzODgyOTQxN3w1NzAwOTV8MT
  • Spring Boot实现QQ邮件发送,用户注册功能——前后端分离版

    1 准备工作 我们需要前往我们的QQ邮箱开启相关功能 登录QQ邮箱后 点击进入 设置 在账户在一栏中 我们可以找到这个界面 然后点击开启 POP3 SMTP服务 他们会让我们用QQ的密保手机发送一条短信 我们照着即可 验证成功之后 会获得一
  • ISP记1

    目录 0 参考 1 噪声分类 1 1 空间区域 1 1 1 高斯噪声 1 1 2 瑞利噪声 1 1 3 伽马噪声 1 1 4 均匀分布噪声 1 1 5 泊松噪声 1 1 6 加性噪声 乘性噪声 0 参考 数字图像滤波算法的研究及应用 倪层敏
  • anaconda+pytorch安装说明

    第一步 anconda的安装 大家可以参考以下博文 写的比较简约 看起来比较清爽 https blog csdn net ITLearnHall article details 81708148 Anacond的介绍 Anaconda指的是
  • chisel线网(wire)和寄存器(reg)详解(更新)

    主体内容摘自 https blog csdn net qq 34291505 article details 87714172 在Verilog里 模块内部主要有 线网 wire 和 四态变量 reg 两种硬件类型 它们用于描述数字电路的组
  • QVariant的使用

    在有些情况下 我们希望把数据存储在一个变量中 例如 我有一个数组 既希望存整数 又希望存浮点数 还希望存string 想了一个方法 创建一个object类 这是一个很大的类 里面几乎包含了所有类型的数据 如下 class Object pu
  • Java合并两个有序数组

    合并排序 将两个已经排序的数组合并成一个数组 其中一个数组能容下两个数组的所有元素 public class MergeArray public MergeArray public static ArrayList
  • 【APB协议详解】

    APB协议详解 APB Advanced Peripheral Bus 作为高级外设总线是AMBA协议之一 也是最基本的总线协议 按照ARM官方定义 APB是一种低成本的接口协议 可以实现低功耗以及精简的接口设计 降低接口设计的复杂度 AP
  • adb操作提示Read-only file system问题

    Android adb调试时 经常会遇到权限问题 failed for system lib libmm test so Read only file system 即使Root设备 在向 system等系统文件夹操作时 比如push rm
  • Shell基础—正则表达式(通配符、模式表达式)详解【附例】

    Shell基础 正则表达式 正则表达式是一种可以用于模式匹配和替换的工具 通过正则表达式 Shell可以使用一系列的特殊字符构建匹配模式 然后将匹配模式与待比较字符串或文件进行比较 根据比较对象中是否包含匹配模式 执行相应的程序 1 通配符
  • 【环境搭建】Notepad++显示16十六进制编码

    环境搭建 Notepad 显示16十六进制编码 by 041 打开插件 gt 插件管理 找到HEX Editor 安装 重启Notepad 选择插件 gt HEX Editor gt View in HEX 即可显示16进制文件
  • ubuntu18.04使用Mysql指令

    前言 在使用Ubuntu中 对MySQL不熟悉 在实践中不断总结 不断更新 目录 前言 在使用Ubuntu中 对MySQL不熟悉 在实践中不断总结 不断更新 一 安装MySQL 1 更新 2 安装数据库 3 查看版本 二 sql语句 1 启
  • F - Tickets

    F Ticketshttps vjudge csgrandeur cn problem Gym 101911F 暴力 超时 时间复杂度 2 1e5 1e6 别忘了还有查询 include
  • TCP-服务器监听

    package main import fmt net func process conn net Conn 这里我们循环的接收客户端发送的数据 defer conn Close 关闭conn for 创建一个新的切片 buf make b
  • Java抽象类和接口

    一 抽象类 在面向对象的概念中 所有对象都是通过类来描绘的 但并不是所有类都是用来描绘对象的 如果一个类中没有足够的属性和行为来描绘一个完整具体的对象 Java 提供了一个语法 抽象类 例如我们需要一个描述形状的类 成员方法可以输出当前的形