模块十 面向对象

模块十 重点

  1. 知道继承的好处
  2. 会使用继承
  3. 知道继承之后成员变量以及成员方法的访问特点
  4. 会方法重写以及知道方法重写的使用场景
  5. 会使用 this 关键字调用当前对象中的成员
  6. 会使用super关键字调用父类中的成员
  7. 会定义抽象类方法以及抽象类
  8. 会重写抽象方法

第一章 继承

1.1 什么是继承

  1. 父类怎么形成的

    我们定义了多个类,发现这些类中有很多重复性的代码,我们就定义了一个父类,将相同的代码抽取出来放到父类中,其他的类直接继承这个父类,就可以直接使用父类中的内容了

  2. 怎么去继承:extends

    子类 extends 父类
    
  3. 注意:

    a. 子类可以继承父类中私有和非私有成员,但是不能使用父类中私有成员

    b. 构造方法不能继承

  4. 继承怎么学

    a. 继承不要从是否“拥有”方面来学习

    ​ 要从是否能“使用”方面来学习

image-20240329140644221

1.2 继承的基本使用

  1. 定义一个父类,在其中定义重复性代码

  2. 定义一个子类继承父类 → extends

    子类 extends 父类
    
  3. 创建子类对象,直接使用父类中非私有成员

public class Employee {String name;int age;public void work() {System.out.println("工作");}private void eat() {System.out.println("员工要干饭");}
}
public class Teacher extends Employee {}
public class Manager extends Employee {}
public class Test01 {public static void main(String[] args) {Teacher teacher = new Teacher();teacher.name = "涛哥";teacher.age = 18;System.out.println(teacher.name+"..."+teacher.age);teacher.work();// teacher.eat(); // 子类继承父类之后不能使用父类私有成员,只能使用父类非私有成员System.out.println("=============================");Manager manager = new Manager();manager.name = "金莲";manager.age = 26;System.out.println(manager.name+"..."+manager.age);manager.work();}
}

1.3 继承中成员(成员变量和成员方法)访问特点

1.3.1 成员变量

1.3.1.1 子类和父类中成员变量不重名
public class Fu {int numFu = 100;
}
public class Zi extends Fu {int numZi = 10;
}
public class Test01 {public static void main(String[] args) {// 创建父类对象Fu fu = new Fu();System.out.println(fu.numFu); // 父类中的numFu// System.out.println(fu.numZi); // 父类中不能直接调用子类特有(子类有父类没有)的成员System.out.println("============================");// 创建子类Zi zi = new Zi();System.out.println(zi.numZi);System.out.println(zi.numFu); // 继承了父类,可以使用父类中非私有成员}
}

总结:看等号左边是谁,先调用谁中的成员

​ 如果等号左边是父类类型,只能调用父类中的成员变量,如果等号左边是子类类型,既能调用子类的,还能调用父类中继承过来的非私有成员。

1.3.1.2 子类和父类中的成员变量重名
public class Fu {int numFu = 100;int num = 10000;
}
public class Zi extends Fu {int numZi = 10;int num = 1000;
}
public class Test01 {public static void main(String[] args) {// 创建父类对象Fu fu = new Fu();System.out.println(fu.numFu); // 父类中的numFu// System.out.println(fu.numZi); // 父类中不能直接调用子类特有(子类有父类没有)的成员System.out.println(fu.num); // 父类的 10000System.out.println("============================");// 创建子类Zi zi = new Zi();System.out.println(zi.numZi);System.out.println(zi.numFu); // 继承了父类,可以使用父类中非私有成员System.out.println(zi.num); // 子类的 1000}
}

总结:继承前提下,成员变量访问特点口诀:

​ 看等号左边是谁,先调用谁中的成员,子类没有找父类。(同样适用与多态)

1.3.2 成员方法

1.3.2.1 子类和父类中的成员方法不重名
public class Fu {public void methodFu() {System.out.println("我是父类中的methodFu");}
}
public class Zi extends Fu {public void methodZi() {System.out.println("我是子类中的methodZi");}
}
public class Test01 {public static void main(String[] args) {Fu fu = new Fu();fu.methodFu();// fu.methodZi(); // 不能调用子类特有的方法System.out.println("============================");Zi zi = new Zi();zi.methodZi();zi.methodFu(); // 继承过来之后,能调用父类的非私有成员}
}
1.3.2.2 子类和父类中的成员方法重名
public class Fu {public void methodFu() {System.out.println("我是父类中的methodFu");}public void method() {System.out.println("我是父类中的method");}
}
public class Zi extends Fu {public void methodZi() {System.out.println("我是子类中的methodZi");}public void method() {System.out.println("我是子类中的method");}
}
public class Test01 {public static void main(String[] args) {Fu fu = new Fu();fu.methodFu();// fu.methodZi(); // 不能调用子类特有的方法fu.method(); // 父类中的method方法System.out.println("============================");Zi zi = new Zi();zi.methodZi();zi.methodFu(); // 继承过来之后,能调用父类的非私有成员zi.method(); // 子类中的method方法System.out.println("============================");Fu fu1 = new Zi();fu1.method(); // 调用的是子类中的method方法}
}

成员方法:看new的是谁,先调用谁中的方法,子类没有,找父类。

继承中,成员变量访问特点:看等号左边是谁,先调用谁中的变量。

​ 成员方法访问特点:看new的是谁,先调用谁中的方法。

1.4 方法的重写

  1. 概述:子类中有一个和父类方法名以及参数列表相同的方法
  2. 前提:继承
  3. 访问:看new的是谁,先调用谁中的,如果new的是子类,调用子类重写的方法,子类没有,找父类。
  4. 检测是否为重写方法,在该方法上写@override
public class Fu {public void methodFu(){System.out.println("我是父类中的methodFu方法");}public void method(){System.out.println("我是父类中的method方法");}
}
public class Zi extends Fu {public void methodZi() {System.out.println("我是子类中的methodZi方法");}@Overridepublic void method() {System.out.println("我是子类中的method方法");}
}
public class Test01 {public static void main(String[] args) {Fu fu = new Fu();fu.methodFu(); // 自己的methodFu方法fu.method(); // new的是父类对象,那么调用的就是父类中的method方法System.out.println("==========================");Zi zi = new Zi();zi.methodZi();zi.methodFu();zi.method(); // 子类中的method方法}
}

1.4.1 注意事项

  1. 子类重写父类之后,权限必须保证大于或等于父类权限(权限指的是访问权限)

    publicprotected → 默认(不写任何权限修饰符)private
    
  2. 子类方法重写父类方法,方法名和参数列表要一样

  3. 私有方法不能被重写,构造方法不能被重写,静态方法不能被重写

  4. 子类重写父类方法之后,返回值类型应该是父类方法返回值类型的子类类型

public class Fu {public void methodFu(){System.out.println("我是父类中的methodFu方法");}public void method(){System.out.println("我是父类中的method方法");}public void method01() {}public static void method02() {}public Fu method03() {return null;}
}
public class Zi extends Fu {public void methodZi() {System.out.println("我是子类中的methodZi方法");}@Overridepublic void method() {System.out.println("我是子类中的method方法");}// 子类重写父类之后,权限必须保证大于或等于父类权限(权限指的是访问权限)/*@Overridevoid method01() {}*/// 私有方法不能被重写,构造方法不能被重写,静态方法不能被重写/*@Overridepublic static void method02() {}*/// 子类重写父类方法之后,返回值类型应该是父类方法返回值类型的子类类型@Overridepublic Zi method03() {return null;}
}

1.4.2 使用场景

  1. 使用场景:功能升级改造,子类需要对父类中已经实现好的功能进行重新改造

    image-20240331035847199

public class OldPhone {public void call() {System.out.println("打电话");}public void message() {System.out.println("发短信");}public void show() {System.out.println("显示手机号");}
}
public class NewPhone extends OldPhone {@Overridepublic void show() {System.out.println("显示手机号");System.out.println("显示归属地");}
}
public class Test01 {public static void main(String[] args) {NewPhone newPhone = new NewPhone();newPhone.call();newPhone.message();newPhone.show();}
}

第二章 super和this

2.1 继承中构造方法的特点

  1. 注意:new对象时,会先初始化父类(先走父类无参构造方法)

  2. 原因:

    每个构造方法的第一行,默认都会有一个 super(),不写jvm(虚拟机)自动提供一个

    super()代表的是父类无参构造

public class Fu {public Fu() {System.out.println("我是父类无参构造");}
}
public class Zi extends Fu{public Zi() {// super();System.out.println("我是子类无参构造");}public Zi(int i) {// super();System.out.println("我是子类中的有参构造");}
}
public class Test01 {public static void main(String[] args) {Zi zi = new Zi();System.out.println("=================");Zi zi1 = new Zi(10);}
}

image-20240331110001360

2.2 super和this的具体使用

2.2.1 super的具体使用

  1. 概述:代表的时父类引用

  2. 作用:可以调用父类中的成员

  3. 使用:

    a. 调用父类构造方法 → 在子类中的构造方法

    super() → 调用父类无参构造
    super(实参) → 调用父类有参构造
    

    b. 调用父类成员变量

    super.成员变量名
    

    c. 调用父类成员方法

    super.成员方法名(实参)
    
public class Fu {int num = 10;public Fu() {System.out.println("我是父类中的无参构造");}public Fu(int data) {System.out.println("我是父类中的有参构造");}public void method() {System.out.println("我是父类中的method方法");}
}
public class Zi extends Fu {int num = 100;public Zi() {super(); // 调用父类中的无参构造(不写也有)System.out.println("我是子类中的无参构造");}public Zi(int num) {super(10); //  调用父类的有参构造System.out.println("我是子类中的有参构造");}public void method() {super.method(); // 调用父类的方法System.out.println("我是子类中的method方法");System.out.println(num); // 子类自己的System.out.println(super.num); // 父类的}
}
public class Test01 {public static void main(String[] args) {Zi zi = new Zi();System.out.println("==============");Zi zi1 = new Zi(10);System.out.println("==============");Zi zi2 = new Zi();zi2.method();}
}

image-20240331112415825

2.2.2 this的具体使用

  1. this概述:代表的是当前对象(哪个对象调用的this所在的方法,this就代表哪个对象)

  2. 作用

    a. 区分重名的成员变量和局部变量

    b. 调用当前对象中的成员

  3. 使用

    a. 调用当前对象的构造:在构造中写

    this(): 调用当前对象的无参构造
    this(实参):调用当前对象的有参构造
    

    b. 调用当前对象的成员变量

    this.成员变量名
    

    c. 调用当前对象的成员方法

    this.成员方法名(实参)
    
  4. 注意:

    不管是super还是this,只要在构造中使用,都必须在第一行,所以二者不能同时手写出来

public class Person {int num = 10;public Person() {// this(10); // 无参构造调用有参构造System.out.println("我是Person中的无参构造");}public Person(int data) {// super(); // super和this不能同时在构造中出现this();// 有参构造调用无参构造System.out.println("我是Person中的有参构造");}public void method() {int num = 20;System.out.println(num); // 20System.out.println(this.num); // 10method01();System.out.println("我是Person类中的method方法");}public void method01() {System.out.println("我是Person类中的method01方法");}
}
public class Test01 {public static void main(String[] args) {Person person = new Person();System.out.println("===============");Person person1 = new Person(10);System.out.println("===============");Person person2 = new Person();person2.method();}
}

image-20240331120606949

2.3 继承的特点

  1. 继承只支持单继承,不能多继承

    public class A extends B,C{} → 错误
    
  2. 继承支持多层继承

    public class A extends B{}
    public class B extends C{}
    
  3. 一个父类可以有多个子类

    public class A extends C{}
    public class B extends C{}
    
  4. 构造方法不能继承,也不能重写

    私有方法可以继承,但是不能被重写

    静态方法可以继承,但是不能被重写

public class Fu {public void method01() {System.out.println("method01方法");}private void method02() {System.out.println("method02方法");}public static void method03() {System.out.println("method03方法");}
}
public class Zi extends Fu{@Overridepublic void method01() {System.out.println("重写的method01方法");}// 私有方法不能被重写/*@Overrideprivate void method02() {System.out.println("method02方法");}*/// 静态方法不能被重写,但是能被使用/*@Overridepublic static void method03() {System.out.println("method03方法");}*/
}
public class Test01 {public static void main(String[] args) {Zi zi = new Zi();zi.method03();// 或者Zi.method03();}
}

2.4 如何为父类中private的成员变量赋值

2.4.1 利用set赋值

public class Employee {private String name;private int age;public Employee() {}public Employee(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public void work() {System.out.println("工作");}
}
public class Teacher extends Employee{}
public class Test01 {public static void main(String[] args) {/*利用set为private的成员变量赋值*/Teacher teacher = new Teacher();teacher.setName("涛哥");teacher.setAge(18);System.out.println(teacher.getName()+"..."+teacher.getAge());}
}

2.4.2 利用构造方法赋值

public class Employee {private String name;private int age;public Employee() {}public Employee(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public void work() {System.out.println("工作");}
}
public class Manager extends Employee{public Manager() {}public Manager(String name, int age) {super(name, age);}
}
public class Test01 {public static void main(String[] args) {/*利用set为private的成员变量赋值*/Teacher teacher = new Teacher();teacher.setName("涛哥");teacher.setAge(18);System.out.println(teacher.getName()+"..."+teacher.getAge());System.out.println("==========================");/*利用构造方法为private的成员变量赋值*/Manager manager = new Manager("金莲", 26);System.out.println(manager.getName()+"..."+manager.getAge());}
}

image-20240331125651732

第三章 抽象

image-20240331152435966

3.1 抽象的介绍

  1. 抽象类怎么来的?

    抽取共性方法,放到父类中,发现方法没法实现,因为每个子类对此方法的实现方式细节不一样,此时方法体说不清道不明,可以定义成抽象方法。

    抽象方法所在的类一定是抽象类

  2. 关键字:abstract

  3. 抽象方法

    修饰符 abstract 返回值类型 方法名(参数);
    
  4. 抽象类

    public abstract class 类名{}
    
  5. 注意

    a. 抽象方法所在类一定是抽象类

    b. 抽象类中不一定非得有抽象方法

    c. 子类继承抽象父类时,需要重写父类中所有的抽象方法,不然编译报错

    d. 抽象类不能new对象,只能通过new子类对象调用重写方法。

  6. 可以将抽象类看成是一类事物的标准,要求只要是属于这一类的,都必须要拥有抽象类中的方法,必须要给我实现,怎么证明拥有了,怎么证明实现了呢?→ 重写

    至于这个方法怎么实现,就看子类重写之后怎么写方法体了

public abstract class Animal {public abstract void eat();public abstract void drink();
}
public class Dog extends Animal{@Overridepublic void eat() {System.out.println("狗啃骨头");}@Overridepublic void drink() {System.out.println("狗喝水");}
}
public class Cat extends Animal {@Overridepublic void eat() {System.out.println("猫吃鱼");}@Overridepublic void drink() {System.out.println("猫喝水");}
}
public class Test01 {public static void main(String[] args) {Dog dog = new Dog();dog.eat();dog.drink();System.out.println("=================");Cat cat = new Cat();cat.eat();cat.drink();}
}

3.2 抽象类的注意事项

  1. 抽象类不能直接new对象,只能创建非抽象的子类对象。

  2. 抽象类中不一定非得有抽象方法,但是抽象方法所在的类一定是抽象类。

  3. 抽象类的子类,必须重写父类中的抽象方法,否则,编译报错;除非该子类也是抽象类。

  4. 抽象类中可以有成员变量、构造方法、成员方法等

  5. 抽象类中可以有构造方法,是供子类创建对象时,初始化父类属性使用的。

    public abstract class Employee {private String name;private int age;public Employee() {}public Employee(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public abstract void work();
    }
    
    public class Teacher extends Employee {public Teacher() {}public Teacher(String name, int age) {super(name, age);}@Overridepublic void work() {System.out.println("涛哥在讲Java");}
    }
    
    public class Test01 {public static void main(String[] args) {Teacher teacher = new Teacher("涛哥", 18);System.out.println(teacher.getName()+"..."+teacher.getAge());}
    }
    

第四章 综合案例

某IT公司有多名员工,按照员工负责的工作不同,进行了部门的划分(研发部、运维部)。

研发部(Developer)根据所需研发的内容不同,又分为JavaEE工程师、Android工程师;

运维部(Maintainer)根据所需维护的内容不同,又分为网络维护工程师(Network)、硬件维护工程师(Hardware)。

公司的每名员工都有自己的员工编号、姓名、并要做他们所负责的工作。

工作内容:

  • JavaEE工程师:员工号为xxx的xxx员工正在研发电商网站
  • Android工程师:员工号为xxx的xxx员工,正在研发电商的手机客户端软件
  • 网络维护工程师:员工号为xxx的xxx员工,正在检查网络是否畅通
  • 硬件维护工程师:员工号为xxx的xxx员工,正在修复电脑主板

请根据描述,完成员工体系中所有类的定义,并指定类之间的继承关系,进行xx工程师的对象创建,完成工作方法的调用。

image-20240331163327884

4.1 方式一 利用set赋值

public abstract class Employee {private int id;private String name;public Employee() {}public Employee(int id, String name) {this.id = id;this.name = name;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public abstract void work();
}
public abstract class Developer extends Employee {
}
public class JavaEE extends Developer{@Overridepublic void work() {// System.out.println("员工号为:"+getId()+"的"+getName()+"员工正在研发电商网站");// 或者System.out.println("员工号为:"+this.getId()+"的"+this.getName()+"员工,正在研发电商网站");}
}
public class Android extends Developer{@Overridepublic void work() {// System.out.println("员工号为:"+getId()+"的"+getName()+"员工正在开发APP");// 或者System.out.println("员工号为:"+this.getId()+"的"+this.getName()+"员工,正在开发APP");}
}
public abstract class Maintainer extends Employee {
}
public class Network extends Maintainer {@Overridepublic void work() {// System.out.println("员工号为:"+getId()+"的"+getName()+"员工正在检查网络是否畅通");// 或者System.out.println("员工号为:"+this.getId()+"的"+this.getName()+"员工,正在检查网络是否畅通");}
}
public class Hardware extends Maintainer {@Overridepublic void work() {// System.out.println("员工号为:"+getId()+"的"+getName()+"员工,正在修复电脑主板");// 或者System.out.println("员工号为:"+this.getId()+"的"+this.getName()+"员工,正在修复电脑主板");}
}
public class Test01 {public static void main(String[] args) {JavaEE javaEE = new JavaEE();javaEE.setId(1);javaEE.setName("涛哥");javaEE.work();System.out.println("=================");Android android = new Android();android.setId(2);android.setName("金莲");android.work();System.out.println("=================");Network network = new Network();network.setId(3);network.setName("张三");network.work();System.out.println("=================");Hardware hardware = new Hardware();hardware.setId(4);hardware.setName("李四");hardware.work();}
}

image-20240331170229647

4.2 利用构造方法赋值

public abstract class Employee {private int id;private String name;public Employee() {}public Employee(int id, String name) {this.id = id;this.name = name;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public abstract void work();
}
public abstract class Developer extends Employee {public Developer() {}public Developer(int id, String name) {super(id, name);}
}
public class JavaEE extends Developer{public JavaEE() {}public JavaEE(int id, String name) {super(id, name);}@Overridepublic void work() {// System.out.println("员工号为:"+getId()+"的"+getName()+"员工正在研发电商网站");// 或者System.out.println("员工号为:"+this.getId()+"的"+this.getName()+"员工,正在研发电商网站");}
}
public class Android extends Developer{public Android() {}public Android(int id, String name) {super(id, name);}@Overridepublic void work() {// System.out.println("员工号为:"+getId()+"的"+getName()+"员工正在开发APP");// 或者System.out.println("员工号为:"+this.getId()+"的"+this.getName()+"员工,正在开发APP");}
}
public abstract class Maintainer extends Employee {public Maintainer() {}public Maintainer(int id, String name) {super(id, name);}
}
public class Network extends Maintainer {public Network() {}public Network(int id, String name) {super(id, name);}@Overridepublic void work() {// System.out.println("员工号为:"+getId()+"的"+getName()+"员工正在检查网络是否畅通");// 或者System.out.println("员工号为:"+this.getId()+"的"+this.getName()+"员工,正在检查网络是否畅通");}
}
public class Hardware extends Maintainer {public Hardware() {}public Hardware(int id, String name) {super(id, name);}@Overridepublic void work() {// System.out.println("员工号为:"+getId()+"的"+getName()+"员工,正在修复电脑主板");// 或者System.out.println("员工号为:"+this.getId()+"的"+this.getName()+"员工,正在修复电脑主板");}
}
public class Test02 {public static void main(String[] args) {/*利用构造方法赋值*/JavaEE javaEE = new JavaEE(1, "涛哥");javaEE.work();System.out.println("=================");Android android = new Android(2, "金莲");android.work();System.out.println("=================");Network network = new Network(3, "李四");network.work();System.out.println("=================");Hardware hardware = new Hardware(4, "王五");hardware.work();}
}

image-20240331171315389

第五章 总结

img

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

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

相关文章

遥感影像处理利器:PyTorch框架下CNN-Transformer,地物分类、目标检测、语义分割和点云分类

目录 专题一 深度卷积网络知识详解 专题二 PyTorch应用与实践(遥感图像场景分类) 专题三 卷积神经网络实践与目标检测 专题四 卷积神经网络的遥感影像目标检测任务案例【FasterRCNN】 专题五 Transformer与遥感影像目标检测 专题六 Transformer的遥…

Qt:窗口、按钮类、行编辑器、标签类

作业&#xff1a;QQ登录界面 mywidget.h #ifndef MYWIDGET_H #define MYWIDGET_H#include <QWidget> #include <QIcon> #include<QMovie> #include <QLabel> #include <QPushButton> #include <QLineEdit> class MyWidget : public QWid…

系统监测工具-tcpdump的使用

一个简单的tcpdump抓包过程。主要抓包观察三次握手&#xff0c;四次挥手的数据包 有两个程序&#xff1a;客户端和服务器两个程序 服务器端的ip地址使用的是回环地址127.0.0.1 端口号使用的是6000 tcpdump -i 指定用哪个网卡等&#xff0c;dstip地址端口指定抓取目的地址…

如何在 iPhone 15/14/13/12/11/XS/XR 上恢复误删除的短信?

无论你的iPhone功能多么强大&#xff0c;数据丢失的情况仍然时有发生&#xff0c;所以当你发现一些重要的消息有一天丢失了。别担心&#xff0c;让自己冷静下来&#xff0c;然后按照本页的方法轻松从 iPhone 中检索已删除的短信。 在这里&#xff0c;您需要奇客数据恢复iPhone…

烤羊肉串引来的思考--命令模式

1.1 吃羊肉串&#xff01; 烧烤摊旁边等着拿肉串的人七嘴八舌地叫开了。场面有些混乱&#xff0c;由于人实在太多&#xff0c;烤羊肉串的老板已经分不清谁是谁&#xff0c;造成分发错误&#xff0c;收钱错误&#xff0c;烤肉质量不过关等。 外面打游击烤羊肉串和这种开门店做烤…

甘特图/横道图制作技巧 - 任务组

在甘特图中通过合理的任务分组可以让项目更加清晰&#xff0c;修改也更方便。 列如下面的甘特图一眼不太容易看清楚整体的进度。或者需要把所有的任务整体的延迟或者提前只能这样一个一个的任务调整&#xff0c;就比较麻烦。 通过给任务分组&#xff0c;看这上面整体的进度就…

Django项目定时任务django-crontab

首先定义一个定时任务函数tasks.py&#xff08;见文章末尾示例&#xff09;&#xff0c;编写函数&#xff0c;然后在setting.py中配置定时任务 1、首先安装django-crontab pip install django-crontab 2、在setting.py中添加应用 (在所有自定义注册app之上) INSTALLED_APPS …

webpack环境配置分类结合vue使用

文件目录结构 按照目录结构创建好文件 控制台执行: npm install /config/webpack.common.jsconst path require(path) const {merge} require(webpack-merge) const {CleanWebpackPlugin} require(clean-webpack-plugin) const { VueLoaderPlugin } require(vue-loader); c…

【Linux系列】“dev-node1“ 运行的操作系统分析

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

充电桩项目,开源啦!

好&#xff0c;我是田哥 很多人&#xff0c;最近都在关注我的充电桩项目&#xff0c;之前建了一个微服务架构的项目&#xff0c;也有单体项目的代码开源。 今天&#xff0c;我把最新版微服务架构的充电桩项目源代码开源。 充电桩的输入端与交流电网直接连接&#xff0c;输出端都…

B2985A是德科技B2985A静电计

181/2461/8938产品概述&#xff1a; B2985A 静电计/高阻表具有 0.01 fA&#xff08;0.01 x 10-15 A&#xff09;的分辨率&#xff0c;可帮助您信心十足地测量小电流和最高可达 10 PΩ&#xff08;10 x 1015 Ω&#xff09;的大电阻。 它拥有 4.3 英寸 LCD 彩色液晶屏并配有图形…

UE5俯视角游戏案例代码查看

对于初学者来说&#xff0c;UE的项目案例是我们入手的最佳途径&#xff0c;首先代码量少&#xff0c;思路清晰&#xff0c;还能给你提供一个清晰的结构。所以&#xff0c;我创建了一个俯视角的官方案例&#xff0c;来查看一下官方的代码学习一下。 首先打开引擎&#xff0c;启…