JavaSE-06 [面向对象OOP + 封装]

news2024/10/5 17:15:55

JavaSE-06 [面向对象OOP + 封装]

第一章 面向对象思想

1.1 面向过程和面向对象

  • 面向过程: 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了
  • 面向对象: 面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为
  • 总结
    • 都是解决问题的思维方式,都是代码的组织方式
    • 解决简单问题可以使用面向过程
    • 解决复杂问题,宏观上使用面向对象把握,微观处理上仍然使用面向过程处理

面向对象编程的三大特征(抽象)

  • 封装:需要让用户知道的暴露出来,不需要用户知道的隐藏起来,这就是封装–“该露的露,该藏的藏”
  • 继承:一方面,继承的本质是对某一批类的抽象,从而实现对现实世界更好的封装。另一方面,代码的重用
  • 多态:为了提高处理问题的灵活性,原始的抽象的事务,可以出现多种不同的形态展现

1.2 类和对象

什么是类

  • 类: 类是一组相关属性和行为的集合,可以看成是一类事物的模板,使用事务特征和行为特征来描述该类事物
  • 显示中,描述一类事物
    • 属性:就是事物的状态信息
    • 行为:就是事物的功能

什么是对象

  • 对象:对象是一类事物的具体体现,对象是类的一个实例,必然具备该事物的属性和行为
  • 现实中。一类事物的一个实例,就是一个对象

类和对象的关系

  • 关系:
    • 类可以看做是一个模板,或者图纸,系统根据类的定义来创造出对象
    • 类是对一类事物的描述,是抽象的
    • 对象是一类事物的实例,是具体的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pE6p14Iz-1682213113040)(photo/JavaSE06_面向对象之封装.assest/1664605398568.png)]

1.3 类的定义

事物与类的对比

  • 显示世界的一类事物
    • 属性:事物的状态信息
    • 行为:事物的功能和作用
  • Java中用class描述事物也是如此
    • 成员变量:对应事物的属性
    • 成员方法:对应事物的行为

类的定义格式

public class 类的名称{
    //成员变量
    //成员方法
}
  • 定义类:就是定义类的成员,包括成员属性和成员方法
  • 成员变量:定义在类中,方法外
  • 成员方法:定义在类中,与之前的方法不一致的是,去掉了static
/**
 * 类的定义
 *  定义一个类,用于模拟学生事物,由两部分组成
 *      学生属性:年龄。升高。体重...
 *      学生行为:学习、运动、睡觉...
 *  对应在Java中:
 *      成员变量:数据类型 变量名;
 *      成员方法:修饰符 返回值类型 方法名(){}
 *  注意事项:
 *      成员变量在类中,方法外
 *      成员方法不需要写static关键字
 */
public class Student{
    //成员变量
    String name; //姓名
    int age;//年龄
    String address;//地址

    //成员方法
    public void study(){
        System.out.println("好好学习");
    }
    public void paly() {
        System.out.println("多运动多锻炼");
    }
    public void sleep(){
        System.out.println("中午午休");
    }
}

1.4 对象的使用

对象的使用格式

  • 一般情况下,一个类并不能直接使用,需要根据类创建一个对象,才能使用
  • 创建对象的步骤:
    • 1、导包:指出使用的类存放的位置,如果在同包中,导包省略
    • 2、创建:类名称 对象名 = new 类名称();
    • 3、使用:两种情况
      • 使用成员变量:对象名.成员变量;
      • 使用成员方法:对象名.成员方法();
  • 注意事项
    • 如果成员变量没有赋值,那么就会出现默认值
    • 整数类型的默认值是0,引用数据类型的默认值是null
**
 * 对象的使用:
 *  一般情况下,一个类并不能直接使用,需要根据类创建一个对象,才能使用
 * 创建对象步骤:
 *  1、导包:指出使用的类存放的位置,如果在同包中,导包省略
 *  2、创建:类名称 对象名 = new 类名称();
 *  3、使用:两种情况
 *      使用成员变量:对象名.成员变量;
 *      使用成员方法:对象名.成员方法();
 *  注意事项:如果成员变量没有赋值,那么就会出现默认值,
 *          整数类型的默认值是0,引用数据类型的默认值是null
 */
public class StudentTest {
    public static void main(String[] args) {
        //1、导包:和测试类在同包,可以省略

        //2、创建对象:类名称 对象名 = new 类名称();
        Student stu1 = new Student();

        //3、使用:
        //使用成员变量: 对象名.成员变量;
        System.out.println(stu1.name);//numm
        System.out.println(stu1.age);//0
        System.out.println(stu1.address);//null
        System.out.println("------------------------");
        //改变对象中的成员变量的属性值
        stu1.name="Tom";
        stu1.age=33;
        stu1.address="北京";
        System.out.println(stu1.name);//Tom
        System.out.println(stu1.age);//33
        System.out.println(stu1.address);//北京

        //使用成员方法: 对象名.成员方法();
        stu1.study();
        stu1.paly();
        stu1.sleep();
    }
}

成员变量的默认值

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yZCJt9EG-1682213113041)(photo/JavaSE06_面向对象之封装.assest/1664606932784.png)]

1.5 类与对象的练习

  • 定义一个类,用来模拟”电脑“事物
/**
 * 类和对象的练习
 */
public class ComputerTest {
    public static void main(String[] args) {
        //创建对象格式:类名称 对象名称 = new 类名称();
        Computer computer = new Computer();
        //输出成员变量的默认值
        System.out.println(computer.brand);//null
        System.out.println(computer.price);//0.0
        System.out.println(computer.color);//null

        //修改成员变量的属性值
        computer.brand = "华为";
        computer.price = 5000.0;
        computer.color = "pink";

        System.out.println(computer.brand);
        System.out.println(computer.price);
        System.out.println(computer.color);

        //调用成员方法: 对象名称.方法名();
        computer.playGame();
        computer.lookMovie();
        computer.chart();
    }
}

1.6 对象内存图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wi7Di0gu-1682213113041)(photo/JavaSE06_面向对象之封装.assest/1664705217813.png)]

  • 1、单个对象内存图

    • 成员变量

    img

    • 成员方法

    img

  • 2、多个对象内存图

    • 内存指向

    img

    • 成员变量

    img

    • 成员方法

    img

  • 总结:

    • 先加载Computer类信息`:属性与方法
    • 进行默认初始化,再显示初始化(double price = 5000.0)最后执行构造方法初始化`
    • 把堆中的地址赋给computer,computer就指向对象,computer是对象的引用`,或者叫对象名
    • 当执行到方法时,就会开辟独立的空间(栈)`
    • 方法执行完毕/执行到return就会返回到调用方法的地方`
    • 继续执行后续代码
    • 当main方法(栈)`执行完毕,程序退出

使用对象类型作为方法的参数

/**
 * 类和对象的关系
 *  使用对象类型作为方法额参数
 */
public class ComputerTest2 {
    public static void main(String[] args) {
        Computer c1 = new Computer();
        c1.brand = "苹果";
        c1.price = 10000.0;

        getFieldsFromC1(c1);
    }

    private static void getFieldsFromC1(Computer c1) {
        System.out.println(c1.brand);//苹果
        System.out.println(c1.price);//10000.0
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N4zh6Bnn-1682213113045)(photo/JavaSE06_面向对象之封装.assest/1664710589356.png)]

使用对象类型作为方法的返回值

/**
 * 类和对象的关系---内存图
 *  使用对象类型作为方法的返回值
 */
public class ComputerTest3 {
    public static void main(String[] args) {
        Computer c2 = getComputer();
        System.out.println(c2.brand);//戴尔
        System.out.println(c2.price);//6000.0
    }

    private static Computer getComputer() {
        Computer c3 = new Computer();
        c3.brand = "戴尔";
        c3.price = 6000.0;
        return c3;
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vw0gjpNa-1682213113045)(photo/JavaSE06_面向对象之封装.assest/1664710456591.png)]

1.7 成员变量和局部变量

  • 局部变量和成员变量的区别
  • 1、定义的位置不一样
    • 局部变量:定义在方法的内部
    • 成员变量:定义在类的内部,方法的外部
  • 2、作用域不一样
    • 局部变量:只有在方法中才能使用,出了方法不能使用
    • 成员变量:在整个类中通用
  • 3、默认值不一样
    • 局部变量:没有默认值,必须手动赋值
    • 成员变量:默认会有初始值
  • 4、内存的位置不一样
    • 局部变量:存储在栈内存
    • 成员变量:存储在堆内存
  • 5、生命周期不一样
    • 局部变量:随着方法的进栈而诞生,随着方法的出栈而消失
    • 成员变量:随着对象被创建而诞生,随着对象被垃圾回收器回收被销毁
/**
 * 局部变量和成员变量的区别
 *  1、定义的位置不一样
 *      局部变量:定义在方法的内部
 *      成员变量:定义在类的内部,方法的外部
 *  2、作用域不一样
 *      局部变量:只有在方法中才能使用,出了方法不能使用
 *      成员变量:在整个类中通用
 *  3、默认值不一样
 *      局部变量:没有默认值,必须手动赋值
 *      成员变量:默认会有初始值
 *  4、内存的位置不一样
 *      局部变量:存储在栈内存
 *      成员变量:存储在堆内存
 *  5、生命周期不一样:
 *      局部变量:随着方法的进栈而诞生,随着方法的出栈而消失
 *      成员变量:随着对象被创建而诞生,随着对象被垃圾回收器回收被销毁
 */
public class VariableDemo01 {
    //成员变量
    String username;

    //成员方法
    public void sleep(){
        //局部变量
        int num;//局部变量没有默认值,要使用,需需要手动赋值
        //System.out.println(num);//Variable 'num' might not have been initialized

        //作用域:局部变量只在方法中可以使用
        int num1 = 20;
        System.out.println(num1);
        //成员变量在整个类中可以被使用
        System.out.println(username);//成员变量存在默认值 null
    }

    //成员方法传参(参数属于方法的一部分,是局部变量)
    public void eat(int num2){
        //此时输出变量num2不报错
        //原因是,方法被定义之后,需要调用才能被执行
        //在调用时必须要传参数值,也就是变量接收到数据值,属于手动赋值
        //所以编译不报错
        System.out.println(num2);
    }
}

第二章 封装

2.1 封装的定义

面向对象的三大特征:封装、继承、多态

封装的定义:就是将一些细节信息隐藏起来,对外界不可见

封装性在Java中的体现:方法是一种封装、private关键字也是一种封装

2.2 private关键字

private关键字:是用于对需要保护的成员变量进行修饰。

一旦使用了private关键字,那么在本类当中仍可以随意访问,但是在本类之外就不能访问。

如果想访问private关键字修饰的成员变量,就需要定义一对setter/和getter方法

注意:

  • 方法名:必须使用setXxx或者getXxx命名规则
  • 对于getter来说,不能有参数,返回值类型和成员变量对应
  • 对于setter来说,不能有返回值,参数类型和成员变量对应
  • 对于基本数据类型的boolean型,setter方法同上,但是获取的方法是使用isXxx()
public class Person {

    String name;//姓名
    private int age;//年龄

    public void info(){
        System.out.println(name+":"+age);
    }

    //此方法专门用于向age设置值
    public void setAge(int age) {
        if (0<=age && age>=100 ){
            this.age = age;
        }else {
            System.out.println("输入的年龄错误");
        }
    }

    //此方法专门获取age的值
    public int getAge() {
        return age;
    }
}
/**
 * private关键字的使用
 */
public class Demo01_Private {
    public static void main(String[] args) {
        Person p = new Person();
        p.name = "张曼玉";
        //p.age = 22; 被private关键字修饰的成员变量不能在其他类直接访问
        //System.out.println(p.age);

        //基于逻辑的合理性,可以在setAge()方法中进行对参数判断
        p.setAge(-22);
        System.out.println(p.getAge());
    }

2.3 this关键字

this关键字的使用

  • 1、当方法的局部变量和类的成员变量名称相同时,就遵循就近原则,优先使用局部变量
  • 2、如果必须使用成员变量,则需要使用this关键字,即:this.成员变量
  • 3、this关键字:指向调用方法的对象,即通过谁调用的方法,this就是谁
public class Student {
    String name;
    //成员变量的名称与局部变量的名称没有重名
    public void sayName1(String str){
        System.out.println(name +"---"+str);
    }
    //成员变量的名称和局部变量的名称一致
    //当方法的局部变量和类的成员变量名称相同时,跟进就近原则,优先使用局部变量
    public void sayName2(String name){
        System.out.println(name+"==="+name);
    }
    //成员变量和局部变量名称一致时,如果必须使用成员变量,则需要使用this关键字,即:this.成员变量
    public void sayName3(String name){
        System.out.println(this.name+"+++"+name);
        //验证this的身份
        System.out.println(this);
    }
}
/**
 * this关键字的使用
 *  1、当方法的局部变量和类的成员变量名称相同时,就遵循就近原则,优先使用局部变量
 *  2、如果必须使用成员变量,则需要使用this关键字,即:this.成员变量
 *  3、this关键字:指向调用方法的对象,即通过谁调用的方法,this就是谁
 */
public class Demo01_This {
    public static void main(String[] args) {
        Student s1 = new Student();
        s1.name = "巩俐";
        //成员变量的名称与局部变量的名称没有重名
        s1.sayName1("章子怡");
        //成员变量的名称和局部变量的名称一致
        //当方法的局部变量和类的成员变量名称相同时,就遵循就近原则,优先使用局部变量
        s1.sayName2("关之琳");
        //成员变量和局部变量名称一致时,如果必须使用成员变量,则需要使用this关键字,即:this.成员变量
        s1.sayName3("邱淑贞");

        //验证this是否是当前调用者--即当前对象
        System.out.println(s1);//打印对象地址值
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-as3ipz6Y-1682213113047)(photo/JavaSE06_面向对象之封装.assest/1664723526567.png)]

2.4 构造方法

  • 1、构造方法作用

    • 1、是用来专门创建对象的方法
    • 2、当我们通过关键字new来创建对象时,其实就是在调用构造方法
  • 2、构造方法格式:

    //无参构造
    public 类名称(){
        
    }
    
    //有参构造
    public 类名称(参数类型 参数名,参数类型 参数名){
        方法体
    }
    
  • 3、注意事项:

    • 1、构造方法的名称必须和类的名称一致,包含大小写一致
    • 2、构造方法不需要写返回值类型,包括void
    • 3、构造方法没有返回值
    • 4、如果没有声明任何构造方法,编译器会默认提供一个无参数的构造方法供使用
    • 5、一旦编写任意构造方法,编译器将不提供无参构造方法
    • 6、如果已经创建有参构造,那么无参构造默认不存在,需要手动定义无参构造
public class User {
    //成员变量
    private String name;
    private int age;

    //无参构造
    public User() {
        System.out.println("无参构造方法执行了");
    }

    //全参构造
    public User(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("有参构造方法执行了");
    }

    //获取属性值
    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;
    }
}
/**
 * 构造方法:
 *      1、是用来专门创建对象的方法
 *      2、当我们通过关键字new来创建对象时,其实就是在调用构造方法
 *  构造方法格式:
 *      无参构造:public 类名称(){}
 *      有参构造:public 类名称(参数类型 参数名,参数类型 参数名){方法体}
 *  注意事项:
 *      1、构造方法的名称必须和类的名称一致,包含大小写一致
 *      2、构造方法不需要写返回值类型,包括void
 *      3。构造方法没有返回值
 *      4、如果没有声明任何构造方法,编译器会默认提供一个无参数的构造方法供使用
 *      5、一旦编写任意构造方法,编译器将不提供无参构造方法
 *      6、如果已经创建有参构造,那么无参构造默认不存在,需要手动定义无参构造
 */
public class Demo01_ConstructorTest {
    public static void main(String[] args) {
        //无参构造创建对象
        User u1 = new User();
        //给对象的属性设置属性值
        u1.setName("周海媚");
        u1.setAge(22);
        //获取对象的属性值
        System.out.println(u1.getName());
        System.out.println(u1.getAge());

        System.out.println("--------------------");

        //有参构造创建对象
        User u2 = new User("邵美琪",22);
        //获取对象的属性值
        System.out.println(u2.getName());
        System.out.println(u2.getAge());
    }
}

2.5 定义标准的类

  • 定义一个标准的类
    • 1、所有的成员变量都需要使用private关键字修饰
    • 2、为每一个成员变量编写一朵setter和getter方法
    • 3、编写一个无参数的构造方法
    • 4、编写一个全参数的构造方法
    • 5、这样标准的类,也叫作JavaBean(Java豆子)
/**
 * 定义一个标准的类
 *  1、所有的成员变量都需要使用private关键字修饰
 *  2、为每一个成员变量编写一朵settrt和getter方法
 *  3、编写一个无参数的构造方法
 *  4、编写一个全参数的构造方法
 *  这样标准的类,也叫作JavaBean(Java豆子)
 */
public class Student {
    //成员变量
    private String username;
    private int age;
    private String address;
    //无参构造
    public Student() {
    }
    //全参构造
    public Student(String username, int age, String address) {
        this.username = username;
        this.age = age;
        this.address = address;
    }
    //setter和getter方法
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}
/**
 * 测试保准类
 */
public class Demo01_StudentTest {
    public static void main(String[] args) {
        //无参构造
        Student s1 =  new Student();
        s1.setUsername("古力娜扎");
        s1.setAge(22);
        s1.setAddress("新疆");
        System.out.println("姓名是:"+s1.getUsername()+",年龄是:"+s1.getAge()+",籍贯是:"+s1.getAddress());

        System.out.println("-------------------------------");

        //全参构造
        Student s2 = new Student("迪丽热巴",18,"新疆");
        System.out.println("姓名是:"+s2.getUsername()+",年龄是:"+s2.getAge()+",籍贯是:"+s2.getAddress());
        s2.setAge(19);
        System.out.println("姓名是:"+s2.getUsername()+",年龄是:"+s2.getAge()+",籍贯是:"+s2.getAddress());
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

博弈论(NIM游戏——取石子)相关的题目

1.异或的性质 &#x1f3f3;️‍&#x1f308;&#x1f3f3;️‍&#x1f308;&#x1f3f3;️‍&#x1f308;&#x1f3f3;️‍&#x1f308;&#x1f3f3;️‍&#x1f308;&#x1f3f3;️‍&#x1f308; 2.nim游戏 &#xff08;基础&#xff09; 891. Nim游戏 - AcWin…

直播软件app开发:如何处理直播延迟问题?

随着直播技术的发展&#xff0c;直播软件app的开发变得越来越普遍。然而&#xff0c;直播延迟问题一直是直播软件app开发中的一个挑战。在本文中&#xff0c;我们将探讨如何解决直播延迟问题&#xff0c;提高用户体验。 直播延迟的原因 直播延迟的原因是多方面的。其中最主要…

【Mycat2】介绍、安装、部署、配置、测试与 Bugs

文章目录 一、MyCat 概览1.1 简介1.2 官网网址1.3 仓库地址1.4 Mycat1.x 与 Mycat2 功能对比1.5 下载1.5.1 先决条件1.5.2 Mycat2 安装包&#xff08;以下二选一&#xff09; 1.6 Mycat2权威指南1.7 原型库什么是兼容性 SQL&#xff1f;什么是 Prototype 服务器&#xff1f;原型…

shell第二次作业

一、编写脚本for1.sh使用for循环创建20账户&#xff0c;账户名前缀由用户从键盘输入&#xff0c;账户初始密码由用户输入。 1、创建脚本for1.sh [rootlocalhost ~]# vim for1.sh2、编辑脚本内容 3.运行 [rootlocalhost ~]# bash for1.sh 请用户输入账户名的前缀&#xff1a…

WPS AI 再次引爆办公软件行业,以后写文档可由AI代笔

国内外办公软件两大巨头聚齐&#xff0c;使用AI助力再次成标配。 2023年3月16日&#xff0c;微软发布了 Microsoft 365 Copilot&#xff0c;Microsoft 365 这个名字听起来比较陌生&#xff0c;它集成了Office 365 企业版、Windows 10 企业版以及企业移动性安全性&#xff0c;以…

基于Jira的持续交付流水线实践方式

点击上方蓝字⭐️关注“DevOps云学堂”&#xff0c;接收最新技术实践 今天是「DevOps云学堂」与你共同进步的第 19 天 DevOps 为什么很重要&#xff1f; 软件和 Internet 改变了我们身处的世界&#xff0c;同时也改变了购物、娱乐、银行等行业的运营方式。软件不再仅仅是为业务…

【unity项目实战】3DRPG游戏开发03—— 绘制low poly风格的场景

搭建场景 拖入一颗树,按住V键,表示顶点吸附,点击树的底部,他就会自动吸附到相邻的平面上了 如果你的摄像机位置不是很好,我们可以场景移动到合适的位置,可以点击摄像机,按下键盘ctrl+shift+F同步调整摄像机位置 绘制low poly风格的环境 安装Ploybrush插件,并导入样…

linux安装南大通用数据库 GBase 8s V8.8

linux安装南大通用数据库 GBase 8s V8.8 1、操作系统、数据库2、下载链接3、安装文档4、安装前准备4.1、以root用户创建 gbasedbt 组和用户4.2、创建 GBase 8s 数据库安装目录4.3、上传并解压安装包 5、安装5.1、执行安装程序5.2、回车继续 直到接受许可条款5.3、输入安装目录绝…

Windows安装使用Redis,redis基本使用教程,python连接调用redis

文章目录 下载&#xff1a;安装&#xff1a;redis安装成Windows服务&#xff1a;修改密码&#xff1a;客户端连接&#xff1a;基本使用&#xff1a;python里调用redis&#xff1a; 下载&#xff1a; https://github.com/microsoftarchive/redis/releases/tag/win-3.2.100 安装…

机器学习:基于多项式贝叶斯对蘑菇毒性分类预测分析

基于多项式贝叶斯对蘑菇毒性分类预测分析 作者&#xff1a;i阿极 作者简介&#xff1a;Python领域新星作者、多项比赛获奖者&#xff1a;博主个人首页 &#x1f60a;&#x1f60a;&#x1f60a;如果觉得文章不错或能帮助到你学习&#xff0c;可以点赞&#x1f44d;收藏&#x1…

银行数字化转型导师坚鹏:银行业务数字化创新工作坊

银行业务数字化创新工作坊 课程背景&#xff1a; 很多银行存在以下问题&#xff1a; 不清楚如何进行业务数字化创新&#xff1f; 不知道如何开展银行数字化营销工作&#xff1f; 不知道零售业务数字化创新成功案例&#xff1f; 学员收获&#xff1a; 学习原创银行BLM…

【音视频】国际双向对讲方案

语音对讲的的整体流程为&#xff1a; 先拉流播放设备的视频&#xff1b;使用WebRTC推送语音流到ZLM服务&#xff1b;使用SIP协议下发Broadcast指令给设备&#xff1b;接收到设备的OK指令后&#xff0c;请求ZLM的startSendRtp接口&#xff0c;TCP协议请求startSendRtpPassive接口…

springboot集成webmagic和selenium,并部署到linux(问题坑)

springboot集成webmagic和selenium&#xff0c;并部署到linux&#xff08;问题坑&#xff09; 首先参考两个源代码spring boot集成找不到org.openqa.selenium.remote.AbstractDriverOptions的类文件代理ip--更换一个网页同时更换一个代理ip代理ip网址部署linux谷歌浏览器下载谷…

Python冒泡排序的实现

时间复杂度&#xff1a; 最坏时间复杂度O(n^2) 最优时间复杂度O(n):表遍历一次发现没有任何可以交换的元素&#xff0c;排序结束&#xff0c;这是最理想的 稳定性&#xff1a;稳定&#xff0c;&#xff08;执行前后没有对数据没有变化&#xff0c;位置等&#xff09; 原理和方…

供需两端催化口腔医疗服务市场增长 未来将呈现线上化、智能化、品质化三大趋势

一、口腔医疗服务行业概述 口腔由唇、颊、舌、腭、涎腺、牙和颌骨等部分组成。口腔疾病种类繁多&#xff0c;伴随人全生命周期&#xff0c;常见疾病有龋病、牙周疾病、牙髓病、根尖周病、牙齿缺损、错颌畸形等&#xff0c;多数口腔疾病的发病率高&#xff0c;诊疗需求大。除此…

深度强化学习——策略学习(3)

本文的重点&#xff1a;使用一个神经网络来近似策略函数Π 我们使用一个神经网络来近似策略函数&#xff0c;这个神经网络叫做策略网络&#xff0c;他可以用来控制agent运动&#xff0c;想要训练这个神经网络&#xff0c;就要用到policy gradient算法 策略函数Π的输入是当前…

苹果离开中国制造影响有多大?后果不堪设想,可能是灭顶之灾

由于苹果力推印度制造&#xff0c;各方都对苹果与中国制造的关系高度关注&#xff0c;那么苹果真的离开中国制造的话&#xff0c;结果会如何呢&#xff1f;对双方来说&#xff0c;影响会非常大&#xff0c;超出想象。 一、中国制造对苹果的依赖 苹果对产业链拥有巨大的影响力&a…

Python基础快速入门

一、中文编码问题 带大家过一遍菜鸟学python的基础内容 二、Python基础语法 1、Python 中的标识符是区分大小写的。 以下划线开头的标识符是有特殊意义的。以单下划线开头 _foo 的代表不能直接访问的类属性&#xff0c;需通过类提供的接口进行访问&#xff0c;不能用 from x…

用Socket API建立简易TCP服务端、客户端

//---------------------- //-- 用Socket API建立简易TCP客户端 // 1 建立一个Socket // 2 连接服务器 connect // 3 接收服务器信息 recv // 4关闭套接字 closesocket // -- 用Socket API建立简易TCP服务端 // 1 建立一个socket // 2 bind 绑…

JetBrains Gateway IDEA远程开发

为什么进行远程开发&#xff1f; 无论身处何处数秒内连接至远程环境 充分利用远程计算机的强大功能 在任何笔记本电脑上都可以轻松工作&#xff0c;无论其性能如何。借助远程计算机的计算资源&#xff0c;充分利用最大规模的数据集和代码库。在远程服务器上保护敏感代码 如果…