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

【JavaSE学习专栏】第04篇 Java面向对象

文章目录

  • 1 面向过程&面向对象
  • 2 类和对象
    • 2.1 对象的特征
    • 2.2 java类及类的成员
    • 2.3 类的语法格式
  • 3 创建与初始化对象
    • 3.1 类的成员之一:属性
    • 3.2 类的成员之二:方法
    • 3.3 类的成员之三:构造器(构造方法)
      • 3.3.1 无参构造方法
      • 3.3.2 有参构造方法
    • 3.4 类的成员之四:初始化块
    • 3.5 final关键字
  • 4 四种访问权限修饰符
  • 5 三大特性
    • 5.1 封装
      • 5.1.1 基本概念
      • 5.1.2 封装的步骤
      • 5.1.3 this关键字
      • 5.1.4 方法的重载
    • 5.2 继承
      • 5.2.1 基本概念
      • 5.2.2 案例
      • 5.2.3 super关键字
      • 5.2.4 方法重写
    • 5.3 多态
      • 5.3.1 基本概念
      • 5.3.2 为什么使用多态
      • 5.3.3 instanceof操作符
      • 5.3.4 Object类
  • 6 抽象类和抽象方法
    • 6.1 基本概念
    • 6.2 案例
  • 7 接口
    • 7.1 基本概念
    • 7.2 接口的特点


1 面向过程&面向对象

  • 面向过程思想
    1.步骤清晰简单,第一步做什么,第二步做什么…

    2.面向过程适合处理一些较为简单的问题

  • 面向对象思想
    1.物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考。最后,才对某个分类下的细节进行面向过程的思索。

    2.面向对象适合处理复杂的问题,适合处理需要多人协作的问题!

  • 对于描述复杂的事务,为了从宏观上把握、从整体上合理分析,我们需要使用面向对象的思路来分析整个系统。但是,具体到微观操作,任然需要面向过程的思路去处理。

2 类和对象

在这里插入图片描述

2.1 对象的特征

  • 属性 :对象具有的各种特征,每个对象的每个属性都拥有特定值。例如:小张和小明的年龄、姓名不一样;
  • 方法:对象执行的操作。
  • 封装:对象同时具有属性和方法两项特性;对象的属性和方法通常被封装在一起,共同体现事物的特性, 二者相辅相承,不能分割。

2.2 java类及类的成员

  • 属性:对应类中的成员变量
  • 行为:对应类中的成员方法

2.3 类的语法格式

修饰符 class 类名{属性声明;方法声明;}

说明:修饰符public:类可以被任意访问。类的正文要用{}括起来

package oop.Demo06;public class Person {//属性,成员变量,类的成员变量可以先声明,不用初始化,类的成员变量是有默认值String name;  //姓名,String的默认值是nullint age;  //年龄,int的默认值是0/*** 打印姓名*///行为,方法,也叫函数public  void showName(){ //方法的名称如果是多个单词,首个单词的首字母小写,其他单词首字母大写,这样就像严格驼峰一样,所以叫驼峰命名法。System.out.println("名字:"+name); }/*** 获取年龄* @return*/public int getAge(){  //如果是一个有返回值的方法,那么方法的最后一行一定是返回相应的数据,使用关键字,返回的数据类型与方法定义的一致return age;}}
  • 类是一种抽象的数据类型,它是对某一类事物整体描述/定义,但是并不能代表某一个具体的事物
    1.动物、植物、手机、电脑…
    2.Person类、Pet类、Car类等,这些类都是用来描述/定义某一类具体的事物应该具备的特点和行为
  • 对象是抽象概念的具体实列
    1.张三就是人的应该具体实列,张三家里的旺财就是狗的一个拘役实列。
    2.能够体现出特点,展现出功能的是具体的实列,而不是一个抽象的概念。

3 创建与初始化对象

  • Java类的实例化,即创建类的对象
  • 使用new关键字创建对象
  • 使用new关键字创建的时候,除了分配内存空间之外,还会给创建好的对象进行默认初始化以及对类中构造器的调用。
  • 类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的。并且构造器有以下两个特点:
    1.必须和类的名字相同
    2.必须没有返回类型,也不能写void
  • 构造器必须要掌握

3.1 类的成员之一:属性

  • 语法格式:
    修饰符 类型 属性名=初值;
    说明
    修饰符private:该属性只能由该类的方法访问。
    修饰符public:该属性可以被该类以外的方法访问。
    类型:任何基本类型,如int、boolean或任何类。
  • 举例
public class Person1 {public String name="张三";  //public 公有的,这样的类变量可以在类的外部使用,也可以在本类的方法使用private int age;   //private私有的,不能在类的外部使用   
}

3.2 类的成员之二:方法

  • 语法格式
修饰符 返回值类型 方法名(参数列表){方法体语句;
}
  • 说明:
    修饰符:public、private、protected等。
    返回值类型:return语句传递返回值。没有返回值:void.

3.3 类的成员之三:构造器(构造方法)

  • 构造器的特征
    1.它具有与类相同的名称
    2.它不声明返回值类型。(与声明void不同)
    3.不能被static、final、synchronized、abstract、native修饰,不能有return语句返回值。

  • 构造器的作用:创建对象;给对象进行初始化
    如:Order o = new Order();Person p=new Person(Peter,15);

package oop.Demo02;public class Person {//一个类既是什么都不写,它也会存在一个方法//显示的定义构造器String name;int age;//1.使用new关键字,必须要有构造器//2.构造器用来初始化值public Person(){}//有参构造:一旦定义了有参构造,无参就必须显示定义public Person(String name){this.name=name;}//alt+insert  快捷键public Person(int age) {this.age = age;}
}/*
//测试类
public class Application {public static void main(String[] args) {//new 实列化一个对象Person person=new Person("小言");System.out.println(person.name);}构造器:1.和类名相同2.没有返回值作用:1.new本质是在调用构造方法2.初始化对象的值注意点:1.定义了有参构造之后,如果想使用无参构造,显示的定义一个无参构造生成构造方法的快捷键:alt+insert*/

3.3.1 无参构造方法

  • 每一个类都有一个默认的无参构造方法;
  • 无参构造方法的特点:
    • 方法没有返回类型;
    • 修饰符必须是public;
    • 方法名必须与类名保持一致;
    • 语法:public 类名(){}
  • 构造方法什么时候执行:创建对象的时候就会执行一次构造方法!
  • 自定义一个构造方法,可以覆盖它默认的无参构造!

3.3.2 有参构造方法

  • 有参构造方法,在定义构造方法时可以给定参数
  • 为了方便、在创建对象的时候就进行赋值,可以定义类的有参构造方法;
  • 将传递过来参数值赋给成员变量,可以通过 this 关键字 区分:是成员变量还是局部变量;
  • 语法:public 类名(参数类型 参数名…) { }

3.4 类的成员之四:初始化块

  • 非静态代码块:没有static修饰的代码块
    1.可以有输出语句。
    2.可以对类的属性声明进行初始化操作。
    3.可以调用静态和非静态的变量和方法。
    4.若有多个非静态的代码块,那么按照从上到下的顺序依次执行。
    5.每次创建对象的时候,都会执行一次。且先于构造器执行。

  • 静态代码块:用static修饰的代码块
    1.可以有输出语句。
    2.可以对类的属性声明进行初始化操作。
    3.不可以对非静态的属性初始化。即:不可以调用非静态的属性和方法。
    4.若有多个静态代码块,那么按照从上到下的孙旭依次执行。
    5.静态代码块的执行要先于非静态代码块。
    6.静态代码块只执行一次。

Person类

package oop.Demo08;public class Person {String name;static int age;public Person(){this.name="张三";System.out.println("执行的是构造方法");}//非静态的代码块{System.out.println("执行的是非静态的代码块");}//静态代码块static{//这里只能使用静态修饰的属性和方法age=18;System.out.println("执行静态的代码块");showAge();}public static void showAge(){System.out.println(age);}
}/*** 在程序的运行过程中,非静态代码块每次new对象都有重新执行* 静态代码块只执行一次*/

测试类

package oop.Demo08;public class Test {public static void main(String[] args) {new Person();new Person();}
}

测试结果
在这里插入图片描述

3.5 final关键字

  1. 在Java中声明类、属性和方法时,可使用关键字final来修饰,表示“最终”。
  2. final标记的类不能被继承。提高安全性,提高程序的可读性。
  3. final标记的方法不能被子类重写。
  4. final标记的变量(成员变量或局部变量)即称为常量。名称大写,且只能被赋值一次。
  5. final标记的成员变量必须在声明的同时或在每个构造方法中或代码块中显示赋值,然后才能使用。(如:final double PI=3.14)

4 四种访问权限修饰符

在这里插入图片描述

Java权限修饰符public、protected、private置于类的成员定义前,用来限定对该类成员的访问权限。

修饰符类内部同一个包子类任何地方
privateyes
friendlyyesyes
protectedyesyesyes
publicyesyesyesyes

对于class的权限只可以用public和默认(friendly)。
public类可以在任何地方被访问
默认(friendly)类只能被同一个包内部的类访问。

5 三大特性

5.1 封装

5.1.1 基本概念

  • 我们程序设计要追求”高内聚,低耦合“。高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量方法给外部使用。

  • 封装(数据的隐藏)
    通常,应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,这称为信息隐藏。

  • 记住这句话就够了:属性私有,get/set

  • 封装的意义:
    1.提高程序的安全性,保护数据
    2.隐藏代码的实现细节
    3.同一接口
    4.增加了系统的可维护性

5.1.2 封装的步骤

  • 将变量设置为私有化;目的就是为了让其他类(外界的程序)不能直接访问。
/*** 成员变量* 封装第一步:将变量修饰为 private 私有的*/private String nikeName;    //昵称private String strain;  //品种private int health; //健康值private int love;   //亲密度
  • 提供get/set方法;目的是为让其他类通过 get/set 进行访问和赋值。
/*** 封装的第二步:* 给私有变量提供 get/set方法*///get 用来返回成员变量的值public String getNikeName() {return nikeName;}//set 用来接收变量的值public void setNikeName(String nikeName) {this.nikeName = nikeName;}//通过快捷键 alt + insert 生成 get/set方法public String getStrain() {return strain;}public void setStrain(String strain) {this.strain = strain;}public int getHealth() {return health;}/*** 通过set 方法,可以让变量变得更安全,这里可以校验值的合法性* @param health*/public void setHealth(int health) {if(health < 1 || health > 100) {System.err.println("健康值是1 ~ 100之间,请输入合法的健康值");return;}this.health = health;}public int getLove() {return love;}public void setLove(int love) {this.love = love;}

5.1.3 this关键字

  1. this:代表当前类;
  2. this关键可以用来访问 变量、访问、构造方法;
  3. this关键字的用法:
  • 调用属性
his.health = 100; 
this.name = "小明";
  • 调用方法
  this.print();
  • 调用构造方法
  //调用当前类的无参构造this();//调用当前类的有参构造this("小黑",10);

:使用this关键字调用构造方法的话,必须在构造方法调用,必须在构造方法第一行调用!

5.1.4 方法的重载

在这里插入图片描述

  1. 重载就是在一个类中,有相同的函数名称,但形参不同的函数。
  2. 实现理论:
    方法名称相同时,编译器会根据调用方法的参数个数、参数类型等去逐个匹配,以选择对应的方法,如果匹配失败,则编译器报错。
  • 方法的重载:同一个类里面,同名方法,参数不同(参数的个数,数据类型,顺序不同)
package method;public class Demo01 {//main方法public static void main(String[] args) {int sum= add(1,2);System.out.println(sum);int sum1=add(1,2,3);System.out.println(sum1);}//加法public static int add(int a,int b){return a+b;}//方法的重载public static int add(int num1,int num2,int num3){return num1+num2+num3;}}

5.2 继承

  • 语法
//1.编写父类
public class Pet {共享的属性和方法
}//2.编写子类,子类使用extens关键字继承父类
public class Dog extens Pet{//子类继承了父类,就拥有父类的所有成员变量和方法
}

5.2.1 基本概念

  • 继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模。
  • extends的意思是"扩展"。子类是父类的扩展
  • Java中类只有单继承,没有多继承!
  • 继承是类和类之间的一种关系。除此之外,类和类之间还有以来、组合、聚合等。
  • 继承关系的两个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用extends来表示。
  • 子类和父类之间,从意义上讲应该具有"is a"的关系。
  • 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。
  • 子类继承了父类,就继承了父类的方法和属性。
  • 关于继承的规则:
    子类不能直接访问父类中私有的(private)的成员变量和方法
  • 作用
    继承的出现提高了代码的复用性。
    继承的出现让类与类之间产生了关系,提供了多态的前提。
    不要仅为了获取其他类中某个功能而去继承。

5.2.2 案例

一个Person类

package oop.Demo06;public class Person {int age;String name;int sex;public  void showInfo(){System.out.println(this.age);System.out.println(this.name);System.out.println(this.sex);}}

一个学生类,继承Person类

package oop.Demo06;public class Student extends Person{String school;public void showInfo(){System.out.println(this.age);System.out.println(this.sex);System.out.println(this.name);System.out.println(this.school);}
}

一个测试类

package oop.Demo06;public class test {public static void main(String[] args) {Student stu1=new Student();stu1.age=18;stu1.name="小言";stu1.sex="女";System.out.println(stu1.name+"今年"+stu1.age+"岁了。");}
}

测试结果

在这里插入图片描述

5.2.3 super关键字

  • 在Java类中使用super来调用父类中指定操作:
  1. super可用于访问父类中定义的属性
super.nikeName
  1. super可用于调用父类中定义的成员方法
super.showInfo();
  1. super可用于在子类构造方法中调用父类的构造器
//访问父类无参构造方法
super();
//访问父类的有参构造方法
super(args..);
  • super注意点:
    1.super调用父类的构造方法,必须在构造方法的第一个
    2.super必须只能出现在子类的方法或者构造方法中!
    3.super和this不能同时调用构造方法!

  • super&this
    1.代表的对象不同:
    this:本身调用者的这个对象
    super:代表父类对象的应用
    2.前提
    this:没有继承也可以使用
    super:只能在继承条件小才可以使用
    3.构造方法
    this();本类的构造方法
    super();父类的构造!

  • 子类可以调用由父类声明的构造方法。但是必须在子类的构造方法中使用super关键字来调用

5.2.4 方法重写

在这里插入图片描述

  1. 定义
    在子类中可以根据需要对从父类中继承来的方法进行改造,也称方法的重置、覆盖。在程序执行时,子类的方法将覆盖父类的方法

  2. 要求
    2.1 重写方法必须和被重写方法具有相同的方法名称、参数列表和返回值类型。
    2.2 重写方法不能使用比被重写方法更严格的访问权限。
    2.3 重写和被重写的方法必须同时为static的,或同时为非static的
    2.4 子类方法抛出的异常不能大于父类被重写方法的异常

  3. 前提:需要有继承关系,子类重写父类的方法!
    3.1 方法名必须相同
    3.2 参数列表必须相同
    3.3 修饰符:范围可以扩大但不能缩小:public>protected>default>private
    3.4 抛出异常:范围,可以被缩小,但不能扩大

  4. 重写:子类的方法和父类必须一致:方法体不同!

5.3 多态

多态指的是:父类对象引用指向不同的子类。
在这里插入图片描述

5.3.1 基本概念

  • 即同一方法可以根据发送对象的不同而采用多种不同的行为方式。

  • 一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多

  • 多态存在的条件:

    • 有继承关系
    • 子类重写父类的方法
    • 父类引用指向子类对象
  • 注意:多态是方法的多态,属性没有多态性。

5.3.2 为什么使用多态

问题:如果再领养XXX宠物,并需要给XXX喂食,怎么办?

  • 添加XXX类,继承Pet类,实现吃食方法;
  • 修改Master类,添加给XXX喂食的方法。
    在这里插入图片描述:从这个问题中可以看到,主人给宠物喂食,每次新加一个宠物,主人类都要新加一个喂食的方法。
    这种情况会导致:需要频繁修改代码,代码可扩展性、可维护性差!
  1. 使用多态解决上述问题;
    • 将主人喂食的方法,参数改成父类 Pet;通过多态的方式传递参数。
package com.oop.test3;/*** 主人类* 多态:父类的对象引用指向不同的子类对象*/
public class Master {private String name;        //主人名字public String getName() {return name;}public void setName(String name) {this.name = name;}/*** 使用多态优化后的喂食方法*/public void feed(Pet pet) {pet.eat();}}
  1. 测试
    • 创建子类对象,调用 喂食方法,将子类作为参数传递过去,结果是可行的!
package com.oop.test3;
public class Test {public static void main(String[] args) {//1.创建一个狗狗对象Dog dog = new Dog("小黑","拉不多", 50, 20);//2.主人给狗狗小黑喂食Master master = new Master();master.setName("yoyo");master.feed(dog);//2.喂企鹅Penguin p = new Penguin("QQ", Penguin.sex_FEMALE, 30, 10);master.feed(p);//3、喂鹦鹉Yingwu yingwu = new Yingwu("咿呀");master.feed(yingwu);}
}

5.3.3 instanceof操作符

x instanceof A:检验x是否为类A的对象,返回值boolean型。

  • 要求x所属的类与类A必须是子类和父类的关系,否则编译错误,
  • 如果x属于类A的子类B,x instanceof A值也为true。

5.3.4 Object类

  • Object类是所有Java类的根父类
  • 如果在类的声明中未使用extends关键字指明父类,则默认父类为Object类。

6 抽象类和抽象方法

在这里插入图片描述

6.1 基本概念

  1. 用abstract关键字来修饰一个类时,这个类叫做抽象类;
  2. 用abstract来修饰一个方法时,该方法叫做抽象方法。
  3. 抽象方法:只有方法的声明,没有方法的实现。以分号结束:abstract int abstractMethod(int a)。
  4. 含抽象方法的类必须声明未抽象类。
  5. 抽象类不能被实例化。抽象类是用来作父类被继承的,抽象类的子类必须重写父类的方法,并提供方法体。若没有重写全部的抽象方法,任为抽象类。
  6. 不能用abstract修饰属性、私有方法、构造器、静态方法、final方法。

6.2 案例

一个抽象类

  • 一般会将父类修饰为抽象类, 使用 abstract 修饰的类就是抽象类
package oop.Demo07;
//abstract 抽象类 本质是类 extends  单继承
//接口可以实现多继承
public abstract class Action {//约束~有人帮我们实现~//abstract,抽象方法,只有方法名字,没有方法的实现!public abstract void doSomething();//1.不能new这个抽象类,只能靠子类去实现它:约束!//2.抽象类中可以写普通方法//3.抽象方法必须在抽象类中//抽象的抽象:约束
}

一个子类去继承此抽象类

package oop.Demo07;//抽象类的所有方法,继承了它的子类,都必须要实现它的方法
public abstract class A extends Action{@Overridepublic void doSomething() {}
}

7 接口

在这里插入图片描述

7.1 基本概念

  • 有时必须从几个类中派生除一个子类,继承它们所有的属性和方法。但是,Java不支持多重继承。有了接口,就可以得到多重继承的效果。

  • 接口(interface)是抽象方法和常量值定义的集合。

  • 从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,从而没有变量和方法的实现。

  • 实现接口类:
    class SubClass implements interfaceA{}

  • 一个类可以实现多个接口,接口也可以继承其它接口。

7.2 接口的特点

  1. 用interface来定义。
  2. 接口中所有成员变量都默认是由public static final 修饰的。
  3. 接口中的所有方法都默认由public abstract修饰的。
  4. 接口没有构造器。
  5. 接口采用多层继承机制。

接口的定义举例:

package oop.Demo08;//interface 定义的关键字  接口都需要实现类
public interface UserService {//常量 public static finalint age=99;//接口中的所有定义的方法其实都是抽象的 public abstractvoid add(String name);void delete(String name);void update(String name);void query(String name);
}
  • 实现接口的类中必须提供接口中所有方法的具体实现内容,方可实例化。否则,任为抽象类。
  • 接口的主要用途就是被实现类实现(面向接口编程)
  • 与继承关系类似,接口与实现类之间存在多态性。
  • 如果实现接口的类中没有实现接口中的全部方法,必须将此类定义为抽象类

相关文章:

【JavaSE学习专栏】第04篇 Java面向对象

文章目录 1 面向过程&面向对象2 类和对象2.1 对象的特征2.2 java类及类的成员2.3 类的语法格式 3 创建与初始化对象3.1 类的成员之一&#xff1a;属性3.2 类的成员之二&#xff1a;方法3.3 类的成员之三&#xff1a;构造器&#xff08;构造方法&#xff09;3.3.1 无参构造方…...

sCrypt 在英国伦敦 Exeter 大学讲学

6月5日&#xff0c;sCrypt CEO晓晖和他的两位同事在英国伦敦Exeter大学举行了一场精彩的讲座。刘晓晖向听众们详细介绍了sCrypt智能合约开平台&#xff0c;并演示了如何使用sCrypt来开发基于比特币的智能合约。他用生动形象的语言&#xff0c;深入浅出地解释了这个领域复杂而又…...

人工智能基础创新的第二增长曲线

编者按&#xff1a;2023年是微软亚洲研究院建院25周年。借此机会&#xff0c;我们特别策划了“智启未来”系列文章&#xff0c;邀请到微软亚洲研究院不同研究领域的领军人物&#xff0c;以署名文章的形式分享他们对人工智能、计算机及其交叉学科领域的观点洞察及前沿展望。希望…...

华为OD机试真题-分割均衡字符串-2023年OD统一考试(C卷)

题目描述&#xff1a; 均衡串定义&#xff1a;字符串只包含两种字符&#xff0c;且两种字符的个数相同。 给定一个均衡字符串&#xff0c;请给出可分割成新的均衡子串的最大个数。 约定字符串中只包含大写的X和Y两种字符。 输入描述&#xff1a; 均衡串&#xff1a;XXYYXY 字符…...

基于SpringBoot的图书推荐系统的

摘 要 网络信息技术的高速发展&#xff0c;使得高校图书馆的服务空间日益扩大&#xff0c;依据个人特点的针对性服务逐渐成为新服务模式的主导趋势。对于大多数用户而言&#xff0c;很难在大量的学术图书馆中快速找到他们想要的材料。另外&#xff0c;随着时代的不断发展&…...

02_学习使用javax_ws_rs_下载文件

文章目录 1 前言2 Maven 依赖3 下载接口4 如何返回文件&#xff1f;5 感谢 1 前言 专栏上一篇&#xff0c;写了如何使用 javax.ws.rs 上传文件&#xff0c;那么必然的&#xff0c;我们得再学习学习如何下载文件&#x1f600; 2 Maven 依赖 这个就不赘述了&#xff0c;和上一篇…...

js校验多个时间段的时间是否有交叉

参考博客&#xff1a; Java日期时间API系列37-----时间段是否有重叠&#xff08;交集&#xff09;的计算方法 Java 最优雅方式校验时间段重叠 判断是否有交叉数据 let timePeriod [{start: dateList[0].value, //时间段1的开始时间 时间格式为1130&#xff08;代表11&#xf…...

Python Spyder开发的应用项目

Python是一种功能强大且受欢迎的编程语言&#xff0c;被广泛应用于科学计算、数据分析和机器学习等领域。而Spyder则是一款专为科学计算和数据分析而设计的Python集成开发环境&#xff08;IDE&#xff09;。本文将介绍Spyder的特点、功能以及如何使用。 特点 Spyder具有以下主…...

ES6知识点

ES6 知识点及常考面试题 var、let 及 const 区别 涉及面试题&#xff1a;什么是提升&#xff1f;什么是暂时性死区&#xff1f;var、let 及 const 区别&#xff1f;对于这个问题&#xff0c;我们应该先来了解提升&#xff08;hoisting&#xff09;这个概念。 console.log(a)…...

数据结构详解各种算法

1、设有两个整型顺序表L1&#xff0c;L2&#xff0c;其元素值递增有序存放&#xff0c;请定义该顺序表的元素类型及表类型,设计以下自定义函数&#xff1a; &#xff08;1&#xff09;录入顺序表中所有元素的值。 &#xff08;2&#xff09;将顺序表L1&#xff0c;L2合并为到…...

Qt实现右键菜单

一、实现方法 QWidget提供了虚函数: virtual void contextMenuEvent(QContextMenuEvent*event);覆写该函数&#xff0c;即可。 二、Example 创建一个基本的mainwindow项目&#xff0c; 头文件&#xff1a; class MainWindow : public QMainWindow {Q_OBJECTpublic:MainWin…...

MySQL基础篇一

基础篇 通用语法及分类 DDL: 数据定义语言&#xff0c;用来定义数据库对象&#xff08;数据库、表、字段&#xff09; DML: 数据操作语言&#xff0c;用来对数据库表中的数据进行增删改 DQL: 数据查询语言&#xff0c;用来查询数据库中表的记录 DCL: 数据控制语言&#xff…...

深入了解Java8新特性-日期时间API:OffsetDateTime类

阅读建议 嗨&#xff0c;伙计&#xff01;刷到这篇文章咱们就是有缘人&#xff0c;在阅读这篇文章前我有一些建议&#xff1a; 本篇文章大概24000多字&#xff0c;预计阅读时间长需要20分钟。本篇文章的实战性、理论性较强&#xff0c;是一篇质量分数较高的技术干货文章&…...

企业微信http协议接口开发,发送位置消息

产品说明 一、 hook版本&#xff1a;企业微信hook接口是指将企业微信的功能封装成dll&#xff0c;并提供简易的接口给程序调用。通过hook技术&#xff0c;可以在不修改企业微信客户端源代码的情况下&#xff0c;实现对企业微信客户端的功能进行扩展和定制化。企业微信hook接口…...

CSS——基础选择器、文字控制属性

1、CSS定义 层叠样式表&#xff08;Cascading Style Sheets&#xff0c;缩写为CSS&#xff09;&#xff0c;是一种 样式表 语言&#xff0c;用来描述 HTML 文档的呈现&#xff08;美化内容&#xff09;。 书写位置&#xff1a;title 标签下方添加style双标签&#xff0c;styl…...

08-中介者模式-C语言实现

中介者模式&#xff1a; Define an object that encapsulates how a set of objects interact.Mediator promotes loose coupling by keeping objects from referring to each other explicitly,and it lets you vary their interaction independently.&#xff08;用一个中介对…...

【开源】基于JAVA的医院门诊预约挂号系统

项目编号&#xff1a; S 033 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S033&#xff0c;文末获取源码。} 项目编号&#xff1a;S033&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 功能性需求2.1.1 数据中心模块2.1.2…...

NodeJs(一):初识nodejs、模块化、CommonJS、ESModule等

目录 (一)Nodejs简介 1.nodejs是什么 2.nodejs架构 3.nodejs的应用场景 (二)准备工作 1.安装nodejs 2.nodejs版本管理工具 (三)nodejs的使用 1.node的输入 2.node的输出 3.其他的console方法 (四)全局对象 1.常见的全局对象 2.特殊的全局对象 3.global和window的…...

hive 命令记录(随时更新)

1.进入 hive 数据库&#xff1a; hive 2.查看hive中的所有数据库&#xff1a; show databases; 3.用 default 数据库 use default; 4.查看所有的表 show tables; 5.查询 book 表结构&#xff1a; desc book ; 6.查询 book 表数据 select * from book; 7.创建 shop 数据库 creat…...

java实战(五):理解多线程与多线程实现冒泡排序及可视化

多线程 1.多线程理解1.1线程概念1.2线程的创建和启动1.3线程的同步与互斥1.4线程的状态和生命周期1.5线程间的通信1.6处理线程的异常和错误1.7实践 2.效果3.代码 1.多线程理解 1.1线程概念 线程&#xff1a;计算机中能够执行独立任务的最小单位。在操作系统中&#xff0c;每个…...

mysql-binlog,redolog 和 undolog区别

binlog MySQL的binlog&#xff08;二进制日志 或 归档日志&#xff09;是一种记录数据库的更改操作的日志。它包含了对数据库进行的插入、更新和删除操作的详细信息。binlog是以二进制格式存储&#xff0c;可以用于恢复数据库、数据复制和数据同步等操作。具体来说&#xff0c…...

Redis SDS 源码

struct sdshdr {int len;int free;char buf[]; }; 底层数据结构的好处&#xff1a; 杜绝缓冲区溢出。减少修改字符串长度时所需的内存重分配次数。二进制安全。兼容部分C字符串函数。 常用命令&#xff1a; set key value、get key 等 应用场景&#xff1a;共享 session、分…...

肖sir__mysql之单表练习题2__(2)

mysql之单表练习题 一.建表语句 create table grade(class int(4),chinese int(8),english int(4),math int(8),name varchar(20),age int(8),sid int(4)primary key auto_increment) DEFAULT charsetutf8; insert into grade(class,chinese,english,math,name,age)values(1833…...

nuxt、vue实现PDF和视频文件的上传、下载、预览

上传 上传页面 <el-form-item :label"(form.ququ3 1 ? 参培 : form.ququ3 2 ? 授课 : ) 证明材料" prop"ququ6"><PdfUpload v-model"form.ququ6" :fileType"[pdf, mp4, avi, ts]"></PdfUpload> </el-form-i…...

c++ 写成.h .cpp main.cpp 多文件形式

1 .h 声明方法/函数 用于连接定义和实例使用 // max.h #ifndef MAX_H #define MAX_Hint max(int a, int b);#endif /* 在#ifndef和#define中使用的MAX_H就是指的max.h这个头文件的名字。具体来说,#ifndef MAX_H中MAX_H代表了max.h这个头文件的一个唯一的标识符。#define MAX_H…...

组合总和(回溯)

题目描述 找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次&#xff0c;组合可以以任何顺序返回。 样例输入 示例 1: 输入: k 3, n 7 …...

【代码】微电网两阶段鲁棒优化经济调度方法(完美复现)matlab-yalmip-cplex/gurobi

程序名称&#xff1a;两阶段鲁棒优化—微电网两阶段鲁棒优化经济调度方法_刘一欣 实现平台&#xff1a;matlab-yalmip-cplex/gurobi 简介&#xff1a;针对微电网内可再生能源和负荷的不确定性&#xff0c;建立了 min-max-min 结构的两阶段鲁棒优化模型&#xff0c;可得到最恶…...

关于无线测温系统在海上石油平台的应用探讨-安科瑞 蒋静

摘要&#xff1a;海上石油平台的封闭式中高压配电盘在平台电力系统起着十分重要的作用&#xff0c;通过统计其配电盘的 大部分故障为前期的热效应引起&#xff0c;由于配电盘内部空间封闭狭小&#xff0c;所以无法进行人工巡查测温&#xff0c;这给油田的供电系统埋下了一定的潜…...

CSS 滚动捕获 scroll-padding

scroll-padding 非滚动捕获容器滚动捕获容器语法兼容性 CSS 滚动捕获 scroll-padding 设置元素的滚动内边距, 就像 padding 所做的那样. 但并不影响布局. 非滚动捕获容器 我们先来看看不影响布局到底是什么意思. 我们平时会见到左侧是内容, 右侧是内容导航的页面, 比如下图 这…...

asp.net core webpi 结合jwt实现登录鉴权

1.安装jwt nuget包 <PackageReference Include"Microsoft.AspNetCore.Authentication.JwtBearer" Version"6.0.25" /><PackageReference Include"System.IdentityModel.Tokens.Jwt" Version"7.0.3" />1.1创建jwt配置类 n…...