面向对象(高级)知识点强势总结!!!

文章目录

  • 一、知识点复习
    • 1-关键字:static
      • 1、知识点
      • 2、重点
    • 2-单例模式(或单子模式)
      • 1、知识点
      • 2、重点
    • 3-理解main()方法
      • 1、知识点
      • 2、重点
    • 4-类的成员之四:代码块
      • 1、知识点
      • 2、重点
    • 5-关键字:final
      • 1、知识点
      • 2、重点
    • 6-关键字:abstract
      • 1、知识点
      • 2、重点
    • 7-关键字:interface
      • 1、知识点
      • 2、重点
    • 8-类的成员之五:内部类
      • 1、知识点
      • 2、重点
    • 9-枚举类:enum
      • 1、知识点
      • 2、重点
    • 10-注解:Annotation
      • 1、知识点
      • 2、重点
    • 11-包装类的使用
      • 1、知识点
      • 2、重点
    • 12-IDEA:快捷键和debug
      • 1、知识点
      • 2、重点
  • 二、企业真题
    • 1- static关键字
      • 题1
      • 题2
      • 题3
      • 题4
    • 2- 设计模式
      • 题1
      • 题2
    • 3- main()
      • 题1
      • 题2
    • 4- 代码块
      • 题1
      • 题2
    • 5- final关键字
      • 题1
      • 题2
      • 题3
      • 题4
    • 6- 抽象类与接口
      • 题1
      • 题2
      • 题3
      • 题4
      • 题5
      • 题6
    • 7- 内部类
      • 题1
      • 题2
      • 题3
    • 8- 枚举类
      • 题1
    • 9- 包装类
      • 题1
    • 10- 综合
      • 题1
      • 题2

一、知识点复习

1-关键字:static

文章链接:
Java面向对象(高级)-- static关键字的使用-CSDN博客

1、知识点

【static关键字的使用】

  1. static: 静态的

  2. static 用来修饰的结构:属性、方法; 代码块、内部类;(构造器不能够用static修饰)

  3. static修饰属性
    3.1 复习:变量的分类
    方式1:按照数据类型:基本数据类型、引用数据类型
    方式2:按照类中声明的位置:
    成员变量:按照是否使用static修饰进行分类:
    使用static修饰的成员变量:静态变量、类变量
    不使用static修饰的成员变量:非静态变量、实例变量

    局部变量:方法内、方法形参、构造器内、构造器形参、代码块内等。

3.2 静态变量:类中的属性使用static进行修饰。
对比静态变量与实例变量:
① 个数
>静态变量:在内存空间中只有一份,被类的多个对象所共享。
>实例变量:类的每一个实例(或对象)都保存着一份实例变量。
② 内存位置
>静态变量:jdk6及之前:存放在方法区。 jdk7及之后:存放在堆空间
>实例变量:存放在堆空间的对象实体中。
③ 加载时机
>静态变量:随着类的加载而加载,由于类只会加载一次,所以静态变量也只有一份。
>实例变量:随着对象的创建而加载。每个对象拥有一份实例变量。
④ 调用者
>静态变量:可以被类直接调用,也可以使用对象调用。
>实例变量:只能使用对象进行调用。
⑤ 判断是否可以调用 —> 从生命周期的角度解释
类变量 实例变量
类 yes no
对象 yes yes

⑥ 消亡时机
>静态变量:随着类的卸载而消亡
>实例变量:随着对象的消亡而消亡

  1. static修饰方法:(类方法、静态方法)
    随着类的加载而加载
    可以通过“类.静态方法”的方式,直接调用静态方法
    静态方法内可以调用静态的属性或静态的方法。(属性和方法的前缀使用的是当前类,可以省略)
    不可以调用非静态的结构。(比如:属性、方法)

                  类方法         实例方法类            yes            no对象          yes            yes
    

    static修饰的方法内,不能使用this和super

补充:在类的非静态方法中,可以调用当前类中的静态结构(属性、方法)或非静态结构(属性、方法)

  1. 开发中,什么时候需要将属性声明为静态的?
    判断当前类的多个实例是否能共享此成员变量,且此成员变量的值是相同的。
    开发中,常将一些常量声明是静态的。比如:Math类中的PI

    什么时候需要将方法声明为静态的?
    方法内操作的变量如果都是静态变量(而非实例变量)的话,则此方法建议声明为静态方法
    开发中,常常将工具类中的方法,声明为静态方法。比如:Arrays类、Math类

2、重点

  • static:静态的,随着类的加载而加载、执行。
  • static用来修饰:属性、方法、代码块、内部类 (不能用来修饰构造器
  • 熟悉:static修饰的类变量、类方法与不使用static修饰的区别。
    • 类变量:类的生命周期内,只有一个。被类的多个实例共享。
  • 掌握:我们遇到属性或方法时,需要考虑是否声明为static的。

2-单例模式(或单子模式)

文章链接:
Java面向对象(高级)-- 单例(Singleton)设计模式-CSDN博客

1、知识点

  1. 设计模式概述:
    设计模式是在大量的实践中总结理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。设计模式免去我们自己再思考和摸索。
    就像是经典的棋谱,不同的棋局,我们用不同的棋谱。“套路”
    经典的设计模式一共有23种。

  2. 何为单例模式(Singleton):
    所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。

  3. 如何实现单例模式(掌握):
    饿汉式
    懒汉式

  4. 对比两种模式(特点、优缺点)
    特点:
    饿汉式:“立即加载”,随着类的加载,当前的唯一实例就创建了
    懒汉式:“延迟加载”,在需要使用的时候,进行创建。

优缺点:

饿汉式:(优点)写法简单,由于内存中较早加载,使用更方便、更快。是线程安全的。 (缺点)内存中占用时间较长。

懒汉式:(缺点)线程不安全 (放到多线程章节时解决)(优点)在需要的时候进行创建,节省内存空间。

2、重点

  • 经典的设计模式有23种
  • 解决的问题:在整个软件系统中,只存在当前类的唯一实例
  • 实现方式:饿汉式、懒汉式、枚举类等
  • 对比饿汉式和懒汉式
    • 饿汉式:“立即加载”,线程安全的。
    • 懒汉式:“延迟加载”,线程不安全。
  • 需要会手写饿汉式和懒汉式

3-理解main()方法

文章链接:
Java面向对象(高级)-- 单例(Singleton)设计模式-CSDN博客

1、知识点

【main()方法的剖析】

public static void main(String args[]){}

  1. 理解1:看做是一个普通的静态方法
    理解2:看做是程序的入口,格式是固定的。

  2. 与控制台交互
    如何从键盘获取数据?
    方式1:使用Scanner
    方式2:使用main()的形参进行传值。

2、重点

  • public static void main(String[] args){}
  • public:公共的 、static:由类进行调用 (拿对象来调用不合适,因为这是程序入口,造对象也需要通过入口进去) 、void:不需要返回值 、String[] args:形参,可以传递参数,之前演示了通过命令行、IDEA来传递参数
  • 理解1:作为程序的入口;普通的静态方法
  • 理解2:如何使用main()与控制台进行数据的交互。
    • 命令行:java 类名 “Tom” “Jerry” “123”

4-类的成员之四:代码块

文章链接:
Java面向对象(高级)-- 类的成员之四:代码块-CSDN博客

1、知识点

【类的成员之四:代码块】

回顾:类中可以声明的结构:属性、方法、构造器;代码块(或初始化块)、内部类

代码块:从长的样子来看的(就是封装了一下代码)

初始化块:从它的作用的角度

  1. 代码块(或初始化块)的作用:
    用来初始化类或对象的信息(即初始化类或对象的成员变量)

  2. 代码块的修饰:
    只能使用static进行修饰。

  3. 代码块的分类:
    静态代码块:使用static修饰
    非静态代码块:没有使用static修饰

  4. 具体使用:
    4.1 静态代码块:
    随着类的加载而执行(它没有名字,就不能显示地调用它)
    由于类的加载只会执行一次,进而静态代码块的执行,也只会执行一次
    作用:用来初始化类的信息
    内部可以声明变量、调用属性或方法、编写输出语句等操作。
    静态代码块的执行要先于非静态代码块的执行
    如果声明有多个静态代码块,则按照声明的先后顺序执行
    静态代码块内部只能调用静态的结构(即静态的属性、方法),不能调用非静态的结构(即非静态的属性、方法)

4.2 非静态代码块:
随着对象的创建而执行
每创建当前类的一个实例,就会执行一次非静态代码块
作用:用来初始化对象的信息
内部可以声明变量、调用属性或方法、编写输出语句等操作。
如果声明有多个非静态代码块,则按照声明的先后顺序执行
非静态代码块内部可以调用静态的结构(即静态的属性、方法),也可以调用非静态的结构(即非静态的属性、方法)

2、重点

  • 分类:静态代码块、非静态代码块
  • 使用频率上来讲:用的比较少。
  • 静态代码块:随着类的加载而执行
  • 非静态代码块:随着对象的创建而执行

【属性赋值的过程】

文章链接:

Java面向对象(高级)-- 类中属性赋值的位置及过程_java 给属性赋值-CSDN博客

  1. 可以给类的非静态的属性(即实例变量)赋值的位置有:
    ① 默认初始化
    ② 显式初始化 或 ⑤ 代码块中初始化
    ③ 构造器中初始化
    ####################################
    ④ 有了对象以后,通过"对象.属性"或"对象.方法"的方法进行赋值

  2. 执行的先后顺序:
    ① - ②/⑤ - ③ - ④

  3. (超纲)关于字节码文件中的的简单说明:(通过插件jclasslib bytecode viewer查看)
    方法在字节码文件中可以看到。每个方法都对应着一个类的构造器。(类中声明了几个构造器就会有几个)
    编写的代码中的构造器在编译以后就会以方法的方式呈现
    方法内部的代码包含了实例变量的显示赋值、代码块中的赋值和构造器中的代码。
    方法用来初始化当前创建的对象的信息的。

  4. 给实例变量赋值的位置很多,开发中如何选?
    显示赋值:比较适合于每个对象的属性值相同的场景
    构造器中赋值:比较适合于每个对象的属性值不相同的场景

5-关键字:final

文章链接:
Java面向对象(高级)-- final关键字的使用-CSDN博客

1、知识点

【final关键字的使用】

  1. final的理解:最终的

  2. final可以用来修饰的结构:类、方法、变量

  3. 具体说明:
    3.1 final修饰类:表示此类不能被继承。
    比如:String、StringBuffer、StringBuilder类

3.2 final修饰方法:表示此方法不能被重写
比如:Object类中的getClass()

3.3 final修饰变量:既可以修饰成员变量,也可以修饰局部变量。
此时的"变量"其实就变成了"常量",意味着一旦赋值,就不可更改。

3.3.1 final修饰成员变量: 有哪些位置可以给成员变量赋值?
显式赋值

代码块中赋值

构造器中赋值

3.3.2 final修饰局部变量:一旦赋值就不能修改
方法内声明的局部变量:在调用局部变量前,一定需要赋值。而且一旦赋值,就不可更改
方法的形参:在调用此方法时,给形参进行赋值。而且一旦赋值,就不可更改

  1. final与static搭配:修饰成员变量时,此成员变量称为:全局常量。
    比如:Math的PI

2、重点

  • 最终的
  • 用来修饰:类、方法、变量(成员变量、局部变量)
    • 类:不能被继承
    • 方法:不能被重写
    • 变量:是一个“常量”,一旦赋值不能修改。
  • 成员变量能赋值的位置:显示初始化、代码块中初始化、构造器中初始化 (在造对象结束之前需要把实例变量赋上值)
  • 静态修饰的成员变量能赋值的位置:显示初始化、静态代码块中赋值(构造器中就不要赋值了,因为静态变量不一定调构造器造对象)
  • 局部变量:在调用之前赋值就可以了,一旦赋值就不要修改了。

6-关键字:abstract

文章链接:
Java面向对象(高级)-- 抽象类与抽象方法(或abstract关键字)-CSDN博客

1、知识点

【抽象类与抽象方法】

  1. 案例引入
    举例1:GeometricObject-Circle-Rectangle
abstract class GeometricObject{  //几何图形//求面积 (只能考虑提供方法的声明,而没有办法提供方法体。所以,此方法适合声明为抽象方法)//求周长(只能考虑提供方法的声明,而没有办法提供方法体。所以,此方法适合声明为抽象方法)}class Circle extends GeometricObject{//求面积 (必须重写(或实现)父类中的抽象方法)//求周长(必须重写(或实现)父类中的抽象方法)
}class Rectangle extends GeometricObject{//求面积 (必须重写(或实现)父类中的抽象方法)//求周长(必须重写(或实现)父类中的抽象方法)
}

举例2:Account-SavingAccount-CheckAcount

abstract class Account{double balance;//余额//取钱 (声明为抽象方法)//存钱 (声明为抽象方法)}class SavingAccount extends Account{ //储蓄卡//取钱 (需要重写父类中的抽象方法)//存钱(需要重写父类中的抽象方法)
}
class CheckAccount extends Account{ //信用卡//取钱(需要重写父类中的抽象方法)//存钱(需要重写父类中的抽象方法)
}
//....
  1. abstract的概念:抽象的

  2. abstract可以用来修饰:类、方法

  3. 具体的使用:
    4.1 abstract修饰类:
    此类称为抽象类
    抽象类不能实例化。
    抽象类中是包含构造器的,因为子类对象实例化时,需要直接或间接的调用到父类的构造器。
    抽象类中可以没有抽象方法。反之,抽象方法所在的类,一定是抽象类。

4.2 abstract修饰方法:
此方法即为抽象方法
抽象方法只有方法的声明,没有方法体。
抽象方法其功能是确定的(通过方法的声明即可确定),只是不知道如何具体实现(体现为没有方法体)
子类必须重写父类中的所有的抽象方法之后,方可实例化。否则,此子类仍然是一个抽象类。

  1. abstract不能使用的场景:
    5.1 abstract 不能修饰哪些结构?
    属性、构造器、代码块等。

5.2 abstract 不能与哪些关键字共用?(自洽)

不能用abstract修饰私有方法、静态方法、final的方法、final的类。

私有方法不能重写

避免静态方法使用类进行调用

final的方法不能被重写

final修饰的类不能有子类

2、重点

  • 抽象的
  • 用来修饰:类、方法
    • 类:抽象类:不能实例化。
    • 方法:抽象方法:没有方法体,必须由子类实现此方法。

7-关键字:interface

文章链接:
Java面向对象(高级)-- 接口(interface)-CSDN博客

1、知识点

【接口的使用】

  1. 接口的理解:接口的本质是契约、标准、规范,就像我们的法律一样。制定好后大家都要遵守。

  2. 定义接口的关键字:interface

  3. 接口内部结构的说明:
    可以声明:
    属性:必须使用public static final修饰
    方法:jdk8之前:声明抽象方法,修饰为public abstract
    jdk8:声明静态方法、默认方法
    jdk9:声明私有方法

    不可以声明:构造器、代码块等

  4. 接口与类的关系 :实现关系

  5. 格式:class A extends SuperA implements B,C{}
    A相较于SuperA来讲,叫做子类
    A相较于B,C来讲,叫做实现类。

  6. 满足此关系之后,说明:
    类可以实现多个接口。
    类针对于接口的多实现,一定程度上就弥补了类的单继承的局限性。
    类必须将实现的接口中的所有的抽象方法都重写(或实现),方可实例化。否则,此实现类必须声明为抽象类。

  7. 接口与接口的关系:继承关系,且可以多继承

  8. 接口的多态性: 接口名 变量名 = new 实现类对象;

  9. 面试题:区分抽象类和接口
    共性:都可以声明抽象方法
    都不能实例化

不同:① 抽象类一定有构造器。接口没有构造器
② 类与类之间继承关系,类与接口之间是实现关系,接口与接口之间是多继承关系

2、重点

  • interface:接口,用来定义一组规范、一种标准。
  • 掌握:接口中可以声明的结构。
    • 属性:使用public static final修饰 (可以省略)
    • 方法:jdk8之前:只能声明抽象方法,使用public abstract修饰
      jdk8中:声明static方法、default方法。
      jdk9中:声明private方法。
  • 笔试题:抽象类、接口的对比。

8-类的成员之五:内部类

文章链接:
Java面向对象(高级)-- 类的成员之五:内部类(InnerClass)-CSDN博客

1、知识点

【类的成员之五:内部类】

  1. 什么是内部类?
    将一个类A定义在另一个类B里面,里面的那个类A就称为内部类(InnerClass),类B则称为外部类(OuterClass)

  2. 为什么需要内部类?
    具体来说,当一个事物A的内部,还有一个部分需要一个完整的结构B进行描述,而这个内部的完整的结构B又只为外部事物A
    提供服务,不在其他地方单独使用,那么整个内部的完整结构B最好使用内部类。
    总的来说,遵循高内聚、低耦合的面向对象开发原则。

  3. 内部类使用举例:
    Thread类内部声明了State类,表示线程的生命周期
    HashMap类中声明了Node类,表示封装的key和value

  4. 内部类的分类:(参考变量的分类)
    成员内部类:直接声明在外部类的里面。
    使用static修饰的:静态的成员内部类
    不使用static修饰的:非静态的成员内部类

    局部内部类:声明在方法内、构造器内、代码块内的内部类
    匿名的局部内部类
    非匿名的局部内部类

  5. 内部类这节要讲的知识:
    成员内部类的理解
    如何创建成员内部类的实例
    如何在成员内部类中调用外部类的结构
    局部内部类的基本使用

  6. 关于成员内部类的理解:
    从类的角度看:
    - 内部可以声明属性、方法、构造器、代码块、内部类等结构
    - 此内部类可以声明父类,可以实现接口
    - 可以使用final修饰
    - 可以使用abstract修饰

    从外部类的成员的角度看:
    - 在内部可以调用外部类的结构。比如:属性、方法等
    - 除了使用public、缺省权限修饰之外,还可以使用private、protected修饰
    - 可以使用static修饰

  7. 关于局部内部类的说明:

2、重点

成员内部类的理解

如何创建成员内部类的实例

如何在成员内部类中调用外部类的结构

局部内部类的基本使用(关注:如何在方法内创建匿名局部内部类的对象)

9-枚举类:enum

文章链接:
Java面向对象(高级)-- 枚举类的使用-CSDN博客

1、知识点

【枚举类的使用】

  1. 枚举类的理解:
    枚举类型本质上也是一种类,只不过是这个类的对象是有限的、固定的几个,不能让用户随意创建。

  2. 举例:

  • 星期:Monday(星期一)…Sunday(星期天)
  • 性别:Man(男)、Woman(女)
  • 月份:January(1月)…December(12月)
  • 季节:Spring(春节)…Winter(冬天)
  • 三原色:red(红色)、green(绿色)、blue(蓝色)
  • 支付方式:Cash(现金)、WeChatPay(微信)、Alipay(支付宝)、BankCard(银行卡)、CreditCard(信用卡)
  • 就职状态:Busy(忙碌)、Free(空闲)、Vocation(休假)、Dimission(离职)
  • 订单状态:Nonpayment(未付款)、Paid(已付款)、Fulfilled(已配货)、Delivered(已发货)、Checked(已确认收货)、Return(退货)、Exchange(换货)、Cancel(取消)
  • 线程状态:创建、就绪、运行、阻塞、死亡
  1. 开发中的建议:
    开发中,如果针对于某个类,其实例是确定个数的。则推荐将此类声明为枚举类。
    如果枚举类的实例只有一个,则可以看做是单例的实现方式。

  2. JDK5.0 之前如何自定义枚举类 (了解)
    见代码

  3. JDK5.0中使用enum定义枚举类
    见代码

  4. Enum中的常用方法:
    6.1 使用enum关键字定义的枚举类,默认其父类是java.lang.Enum类
    使用enum关键字定义的枚举类,不要再显示的定义其父类。否则报错。
    6.2 熟悉Enum类中常用的方法
    String toString(): 默认返回的是常量名(对象名),可以继续手动重写该方法!
    (关注)static 枚举类型[] values():返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值,是一个静态方法
    (关注)static 枚举类型 valueOf(String name):可以把一个字符串转为对应的枚举类对象。要求字符串必须是枚举类对象的“名字”。如不是,会有运行时异常:IllegalArgumentException。
    String name():得到当前枚举常量的名称。建议优先使用toString()。
    int ordinal():返回当前枚举常量的次序号,默认从0开始

  5. 枚举类实现接口的操作
    情况1:枚举类实现接口,在枚举类中重写接口中的抽象方法。当通过不同的枚举类对象调用此方法时,执行的是同一个方法。
    情况2:让枚举类的每一个对象重写接口中的抽象方法。当通过不同的枚举类对象调用此方法时,执行的是不同的实现的方法。

2、重点

  • 掌握:使用enum关键字定义枚举类即可。

10-注解:Annotation

文章链接:
Java面向对象(高级)-- 注解(Annotation)-CSDN博客

1、知识点

【注解的使用】

  1. Annotation的理解
    注解(Annotation)是从JDK5.0开始引入,以“@注解名”在代码中存在。
    Annotation 可以像修饰符一样被使用,可用于修饰包、类、构造器、方法、成员变量、参数、局部变量的声明。
    还可以添加一些参数值,这些信息被保存在 Annotation 的 “name=value” 对中。
    注解可以在类编译、运行时进行加载,体现不同的功能。

  2. 注解的应用场景:
    示例1:生成文档相关的注解
    示例2:在编译时进行格式检查(JDK内置的三个基本注解)
    示例3:跟踪代码依赖性,实现替代配置文件功能

  3. Java基础涉及到的三个常用注解
    @Override: 限定重写父类方法,该注解只能用于方法
    @Deprecated: 用于表示所修饰的元素(类,方法等)已过时。通常是因为所修饰的结构危险或存在更好的选择
    @SuppressWarnings: 抑制编译器警告

  4. 自定义注解
    以@SuppressWarnings为参照,进行定义即可。

  5. 元注解的理解:
    元注解:对现有的注解进行解释说明的注解。

讲4个元注解:
(1)@Target:用于描述注解的使用范围
可以通过枚举类型ElementType的10个常量对象来指定
TYPE,METHOD,CONSTRUCTOR,PACKAGE…

(2)@Retention:用于描述注解的生命周期
可以通过枚举类型RetentionPolicy的3个常量对象来指定s
SOURCE(源代码)、CLASS(字节码)、RUNTIME(运行时)
唯有RUNTIME阶段才能被反射读取到。

(3)@Documented:表明这个注解应该被 javadoc工具记录。
(4)@Inherited:允许子类继承父类中的注解

拓展: 元数据。
String name = “Tom”;

框架 = 注解 + 反射 + 设计模式

2、重点

  • 框架 = 注解 + 反射 + 设计模式
  • Java基础阶段:简单。@Override 、 @Deprecated、@SuppressWarnings
  • 元注解:对现有的注解进行解释说明。
    • @Target:表明可以用来修饰的结构
    • @Retation:表明生命周期
  • 如何自定义注解。

11-包装类的使用

文章链接:
Java面向对象(高级)-- 包装类(wrapper)的使用-CSDN博客

1、知识点

【包装类的使用】

  1. 为什么要使用包装类?
    为了使得基本数据类型的变量具备引用数据类型变量的相关特征(比如:封装性、继承性、多态性),我们给各个基本数据
    类型的变量都提供了对应的包装类。

  2. (掌握)基本数据类型对应的包装类类型
    byte -> Byte
    short -> Short
    int -> Integer
    long -> Long
    float -> Float
    double ->Double

char -> Character
boolean -> Boolean

  1. 掌握基本数据类型 与 包装类之间的转换。
    3.1 为什么需要转换
    一方面,在有些场景下,需要使用基本数据类型对应的包装类的对象。此时就需要将基本数据类型的变量转换为
    包装类的对象。比如:ArrayList的add(Object obj);Object类的equals(Object obj)
    对于包装类来讲,既然我们使用的是对象,那么对象是不能进行+ - * /等运算的。为了能够进行这些运算,就
    需要将包装类的对象转换为基本数据类型的变量。

    3.2 如何转换:
    (装箱)基本数据类型 —> 包装类:① 使用包装类的构造器 ② (建议)调用包装类的valueOf(xxx xx)
    (拆箱)包装类 —> 基本数据类型:调用包装类的xxxValue()

    注意:原来使用基本数据类型变量的位置,改成包装类以后,对于成员变量来说,其默认值变化了!
    jdk5.0新特性:自动装箱、自动拆箱。

  2. String 与 基本数据类型、包装类之间的转换。
    基本数据类型、包装类 —> String类型:① 调用String的重载的静态方法valueOf(xxx xx) ; ② 基本数据类型的变量 + “”

    String类型 —> 基本数据类型、包装类: 调用包装类的静态方法:parseXxx()

2、重点

  • 掌握:基本数据类型对应的包装类都有哪些?
  • 掌握:基本数据类型、包装类、String三者之间的转换
    • 基本数据类型 <-> 包装类:自动装箱、自动拆箱
    • 基本数据类型、包装类 <-> String (转换成谁,就在谁里面找方法)
      • String的valueOf(xxx)
      • 包装类的parseXxx(String str)

12-IDEA:快捷键和debug

文章链接:
IntelliJ IDEA快捷键及调试-CSDN博客

1、知识点

【IDEA常用快捷键】

第1组:通用型
说明             快捷键
--------------------------------
复制代码-copy     ctrl + c
粘贴-paste       ctrl + v
剪切-cut         ctrl + x
撤销-undo        ctrl + z
反撤销-redo      ctrl + shift + z
保存-save all    ctrl + s
全选-select all  ctrl + a第2组:提高编写速度(上)
说明                                                快捷键
-------------------------------------------------------------------
智能提示-edit                                       alt + enter
提示代码模板-insert live template                    ctrl+j
使用xx块环绕-surround with ...                      ctrl+alt+t
调出生成getter/setter/构造器等结构-generate ...       alt+insert
自动生成返回值变量-introduce variable ...             ctrl+alt+v
复制指定行的代码-duplicate line or selection          ctrl+d
删除指定行的代码-delete line                          ctrl+y
切换到下一行代码空位-start new line                   shift + enter
切换到上一行代码空位-start new line before current    ctrl +alt+ enter
向上移动代码-move statement up                       ctrl+shift+↑
向下移动代码-move statement down                     ctrl+shift+↓
向上移动一行-move line up                            alt+shift+↑
向下移动一行-move line down                          alt+shift+↓
方法的形参列表提醒-parameter info                     ctrl+p第3组:提高编写速度(下)
说明                                         快捷键
---------------------------------------------------------
批量修改指定的变量名、方法名、类名等-rename        shift+f6
抽取代码重构方法-extract method ...            ctrl+alt+m
重写父类的方法-override methods ...            ctrl+o
实现接口的方法-implements methods ...          ctrl+i
选中的结构的大小写的切换-toggle case             ctrl+shift+u
批量导包-optimize imports                     ctrl+alt+o第4组:类结构、查找和查看源码
说明                                                      快捷键
-----------------------------------------------------------------------------------------
如何查看源码-go to class...                             ctrl + 选中指定的结构 或 ctrl+n
显示当前类结构,支持搜索指定的方法、属性等-file structure     ctrl+f12
退回到前一个编辑的页面-back                               ctrl+alt+←
进入到下一个编辑的页面-forward                            ctrl+alt+→
打开的类文件之间切换-select previous/next tab             alt+←/→
光标选中指定的类,查看继承树结构-Type Hierarchy             ctrl+h
查看方法文档-quick documentation                        ctrl+q
类的UML关系图-show uml popup                            ctrl+alt+u
定位某行-go to line/column                              ctrl+g
回溯变量或方法的来源-go to implementation(s)              ctrl+alt+b
折叠方法实现-collapse all                                ctrl+shift+ -
展开方法实现-expand all                                  ctrl+shift+ +第5组:查找、替换与关闭
说明                                               快捷键
--------------------------------------------------------------
查找指定的结构                                        ctrl+f
查找与替换-replace                                   ctrl+r
直接定位到当前行的首位-move caret to line start        home
直接定位到当前行的末位 -move caret to line end         end
全项目搜索文本-find in path ...                      ctrl+shift+f第6组:调整格式
说明                                          快捷键
--------------------------------------------------------------
格式化代码-reformat code                        ctrl+alt+l
使用单行注释-comment with line comment          ctrl + /
使用/取消多行注释-comment with block comment     ctrl + shift + /
选中数行,整体往后移动-tab                        tab
选中数行,整体往前移动-prev tab                   shift + tab

【IDEA中调试程序】

  1. 为什么需要Debug?
    编好的程序在执行过程中如果出现错误,该如何查找或定位错误呢?简单的代码直接就可以看出来,
    但如果代码比较复杂,就需要借助程序调试工具(Debug)来查找错误了。

  2. Debug的步骤
    1、添加断点
    2、启动调试
    3、单步执行
    4、观察变量和执行流程,找到并解决问题

2、重点

  • 掌握如何调试

二、企业真题

1- static关键字

题1

🌋1、静态变量和实例变量的区别?(保*丰、*软国际、软华、北京明**信)

类似问题:
> 说明静态变量和实例变量之间的区别和使用场景(上海*动)

🍺答:
【区别】
① 个数
>静态变量:在内存空间中只有一份,被类的多个对象所共享。
>实例变量:类的每一个实例(或对象)都保存着一份实例变量。
② 内存位置
>静态变量:jdk6及之前:存放在方法区。 jdk7及之后:存放在堆空间
>实例变量:存放在堆空间的对象实体中。
③ 加载时机
>静态变量:随着类的加载而加载,由于类只会加载一次,所以静态变量也只有一份。
>实例变量:随着对象的创建而加载。每个对象拥有一份实例变量。
④ 调用者
>静态变量:可以被类直接调用,也可以使用对象调用。
>实例变量:只能使用对象进行调用。
⑤ 判断是否可以调用 —> 从生命周期的角度解释
类变量 实例变量
类 yes no
对象 yes yes

⑥ 消亡时机
>静态变量:随着类的卸载而消亡
>实例变量:随着对象的消亡而消亡

【使用场景】
什么时候需要将属性声明为静态的?
> 判断当前类的多个实例是否能共享此成员变量,且此成员变量的值是相同的。
> 开发中,常将一些常量声明是静态的。比如:Math类中的PI
什么时候需要将方法声明为静态的?
> 方法内操作的变量如果都是静态变量(而非实例变量)的话,则此方法建议声明为静态方法
> 开发中,常常将工具类中的方法,声明为静态方法。比如:Arrays类、Math类


题2

🌋2、静态属性和静态方法是否可以被继承?是否可以被重写?以及原因?(*度)

类似问题:
> 在java中,可以重载一个static方法吗?可以覆盖一个static方法吗?(Vi*o)答:静态方法可以重载,可以重载一个static方法。
不能覆盖一个static方法(重写)。

🍺答:

静态属性和静态方法可以被继承,子类当中可以使用父类中静态的结构(条件允许的情况下可以直接调用),拿子类.调用。

静态方法不能被重写,因为和对象没有关系。不存在多态性。

这里稍微说一下这个问题,举个例子。

【StaticTest.java】

package yuyi03;/*** ClassName: StaticTest* Package: yuyi03* Description:** @Author 雨翼轻尘* @Create 2023/12/27 0027 11:13*/
public class StaticTest {public static void main(String[] args) {Person p1=new Student();p1.eat();}
}class Person{public void eat(){System.out.println("人吃饭");}
}class Student extends Person{@Overridepublic void eat() {System.out.println("学生吃饭");}
}

输出:

image.png

此时没有任何问题,接下来让父类中的方法为静态方法。

父类中的方法是静态的,那么子类不能与父类定义同名同参数的。如下:

image.png

若子类中出现了同名同参数的,就说明它想重写,父类中是静态的,那么需要保证子类中也是静态。

image.png

但此时也不能叫重写了。

若子类、父类中出现了同名同参数的方法,那么这两个方法要么都是static,要么全不是static。

不是static的时候叫重写,是static的时候仅仅是这两个方法同名而已。

image.png

静态方法随着类的加载而加载,两个同名的static方法就是相当于是两个不同的方法。

那么有什么影响呢?

看一下现在的代码:

package yuyi03;/*** ClassName: StaticTest* Package: yuyi03* Description:** @Author 雨翼轻尘* @Create 2023/12/27 0027 11:13*/
public class StaticTest {public static void main(String[] args) {Person p1=new Student();p1.eat();}
}class Person{public static void eat(){System.out.println("人吃饭");}
}class Student extends Person{public static void eat() {System.out.println("学生吃饭");}
}

现在还是一个多态场景,调用了eat()方法,注意这里是拿对象p1调用的。(其实和对象没有关系)

这时候结果就是父类里面的了,如下:

image.png

其实此时这样写也不会报错:

Person p2=null; //没有空指针异常
p2.eat();

输出结果和对象没有关系,根本不看是谁的对象,只看是什么类型。由类发起对方法的调用

image.png

多态只是对象的事,现在是静态的方法,跟多态没有关系。

所以静态的方法不能被重写,也不能被覆盖。也不存在多态性

静态方法可以重载,重载只和方法名、参数有关。比如:

class Person{public static void eat(){System.out.println("人吃饭");}public static void food(String food){System.out.println("人喜欢吃"+food);}
}

题3

🌋3、是否可以从一个static方法内部发出对非static方法的调用?(同*顺)

🍺答:

只能通过对象来对非静态方法调用

比如main方法,它是静态方法,所以在main方法里面要对非静态方法调用的时候,需要使用对象来调用。


题4

🌋4、被static修饰的成员(类、方法、成员变量)能否再使用private进行修饰?(联*优势)

🍺答:

完全可以。除了代码块(代码块本身不能用权限修饰符来修饰)。

被static修饰的类肯定是内部类,private体现封装性(能不能被调用)。

被static修饰的成员随着类的加载而加载,该被修饰的可以被修饰。

2- 设计模式

题1

🌋1、知道哪些设计模式?(*通快递、蚂**服)

🍺答:

单例模式、模板方法设计模式、享元设计模式


题2

🌋2、开发中都用到了那些设计模式?用在什么场合? (久*国际物流)

🍺答:

略(目前无法回答,后续学到再说)

3- main()

题1

🌋1、main()方法的public能不能换成private,为什么(凡科技、顺

🍺答:

可以改。

但是改完以后就不是程序入口了,就是一个普通的静态方法,权限是私有的。


题2

🌋2、main()方法中是否可以调用非静态方法?(浩*科技)

🍺答:

只能通过对象来对非静态方法调用。

4- 代码块

题1

🌋1、类的组成和属性赋值执行顺序?(航*拓普)

类似问题:
> Java中类的变量初始化的顺序?(*壳)

🍺答:

可以给类的非静态的属性(即实例变量)赋值的位置有:

① 默认初始化

② 显式初始化 或 ⑤ 代码块中初始化

③ 构造器中初始化

###############################

④ 有了对象以后,通过"对象.属性"或"对象.方法"的方法进行赋值

执行的先后顺序:

① - ②/⑤ - ③ - ④

这里拿实例变量来说的,实际上类变量(不考虑构造器)也可以。


题2

🌋2、静态代码块,普通代码块,构造方法,从类加载开始的执行顺序?(恒*电子)

类似问题:
> 类加载成员变量、静态代码块、构造器的加载顺序(*科软、软**力、同*顺)
> static代码块(静态代码块)是否在类的构造函数之前被执行(联*优势)

🍺答:

静态代码块(类加载) --> 普通代码块 --> 构造器

在字节码文件中,会将“普通代码块”和“构造器”合在一起形成方法,关于变量的显示赋值也会放到里面。

其实“静态代码块”也会以一种方法的形式呈现。

比如:

package yuyi03;/*** ClassName: BlockTest* Package: yuyi03* Description:** @Author 雨翼轻尘* @Create 2023/12/27 0027 21:49*/
public class BlockTest {//静态代码块static{System.out.println("abc");}//普通代码块{System.out.println("hello");}//无参构造器public BlockTest(){}//有参构造器public BlockTest(int id){}
}

字节码文件:

image.png

5- final关键字

题1

🌋1、描述一下对final理解(华**博普)

🍺答:

  • 最终的
  • 用来修饰:类、方法、变量(成员变量、局部变量)
    • 类:不能被继承
    • 方法:不能被重写
    • 变量:是一个“常量”,一旦赋值不能修改。

题2

🌋2、判断题:使用final修饰一个变量时,是引用不能改变,引用指向的对象可以改变?(*米)

🍺答:

引用不能改变

引用指向的对象实体中的属性,如果没有使用final修饰,则可以改变。


题3

🌋3、判断题:final不能用于修饰构造方法?(联*优势)

🍺答:

是的。若用final修饰方法就是不能变,不能重写,但修饰构造器没有意义。


题4

🌋4、final或static final 修饰成员变量,能不能进行++操作?(佳*贸易)

🍺答:

不能进行++操作。但是可以进行+1操作,因为变量本身没有变。

6- 抽象类与接口

题1

🌋1、什么是抽象类?如何识别一个抽象类?(易*支付)

🍺答:

使用abstract修饰的就是一个抽象类。


题2

🌋2、为什么不能用abstract修饰属性、私有方法、构造器、静态方法、final的方法?(止**善)

🍺答:

为了语言的自洽。这些都不能被重写,而abstract修饰则必须重写其内容。

abstract 不能与哪些关键字共用?(自洽)

不能用abstract修饰私有方法、静态方法、final的方法、final的类。

  • 私有方法不能重写

  • 避免静态方法使用类进行调用

  • final的方法不能被重写

  • final修饰的类不能有子类


题3

🌋3、接口与抽象类的区别?(字跳动、阿校招、度校招、**计算机技术及应用研究所、航拓普、纬*、招晟、汇*云通、数信科技、北京永鼎力、上海连科技)

🍺答:

image.png


题4

🌋4、接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承实现类(concrete class)?(航*拓普、蝶、深圳德科技)

类似问题:
> 接口A可以继承接口B吗?接口A可以实现接口B吗?(久*国际物流)

🍺答:

是;是;是。

接口可以继承接口;

抽象类可以实现接口(比如一个类实现了一个接口,这个接口里面有两个抽象方法,它就重写了一个方法,另一个没有重写,那么这个类就是抽象类);

抽象类可以继承实现类(即非抽象类,没有写父类就是abstract,abstract就是非抽象的)。


题5

🌋5、接口可以有自己属性吗?(华*中盛)

🍺答:

可以。必须是public static final的。


题6

🌋6、访问接口的默认方法如何使用(上海*思)

🍺答:

使用实现类的对象进行调用。而且实现类还可以重写此默认方法。

7- 内部类

题1

🌋1、内部类有哪几种?(华油**普、来*科技)

🍺答:

内部类的分类:(参考变量的分类)

成员内部类:直接声明在外部类的里面。
使用static修饰的:静态的成员内部类
不使用static修饰的:非静态的成员内部类

局部内部类:声明在方法内、构造器内、代码块内的内部类
匿名的局部内部类
非匿名的局部内部类

题2

🌋2、内部类的特点说一下(招通**)

类似问题:
> 说一下内部类的好处(北京楚*龙)
> 使用过内部类编程吗,有什么作用(软**力)

🍺答:
关于成员内部类的理解:
从类的角度看:
- 内部可以声明属性、方法、构造器、代码块、内部类等结构
- 此内部类可以声明父类,可以实现接口
- 可以使用final修饰
- 可以使用abstract修饰

从外部类的成员的角度看:
- 在内部可以调用外部类的结构。比如:属性、方法等
- 除了使用public、缺省权限修饰之外,还可以使用private、protected修饰
- 可以使用static修饰


题3

🌋3、匿名类说一下(阿校招、上海立网络)

🍺答:

有的时候不想显示地造一个实现类,就像临时拿一个用,就可以使用匿名类。

8- 枚举类

题1

🌋1、枚举可以继承吗?(顺*)

🍺答:

使用enum定义的,其父类就是Enum类,就不要再继承其他的类了。(如果要写就会报错)

如果是自定义(不使用enum),是自己写的class,想继承啥都可以啦。

9- 包装类

题1

🌋1、Java基本类型与包装类的区别(凡*科技)

🍺答:

包装类可以造对象、调方法,Java基本类型就不行。

10- 综合

题1

🌋1、谈谈你对面向对象的理解(君科技、航拓普、…)。

🍺答:

  • 面向对象的两个要素:类(抽象的 概念上的定义)、对象(类创造出来的实打实的对象实体,具体存在的一个一个的个体) —> 面向对象编程(在完成具体功能的时候,通常由对象出发,对类中声明的方法进行调用)。“万事万物皆对象”。
  • 面向对象的三大特征
  • 接口,与类并列的结构,作为一个补充:类可以实现多个接口,弥补单继承的局限性。

题2

🌋2、面向对象的特征有哪些方面? (北京楚龙、深圳德科技、直科技、米奇网络、航*拓普)

类似问题:
> 面向对象核心是什么?(平**服)答:面向对象的编程的核心思想是,将程序中的实体、数据和功能抽象为单独的对象,并在这些对象之间建立联系。

🍺答:封装、继承、多态

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

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

相关文章

新建虚拟环境并与Jupyter内核连接

第一步:在cmd里新建虚拟环境,shap38是新建的虚拟环境的名字 ,python=3.x conda create -n shap38 python=3.8第二步,安装ipykernel,打开anconda powershell prompt: 虚拟环境的文件夹位置,我的如图所示: 进入文件夹并复制地址: 输入复制的文件夹地址更改文件夹:…

交换域系数的选择:图像处理与编码的关键策略

在图像处理和编码领域&#xff0c;选择适当的交换域系数对于实现高效的图像处理和编码至关重要。交换域系数是指在特定的数学变换下产生的频域系数。通过选择合适的交换域系数&#xff0c;可以实现图像的压缩、增强和重构。本文将深入探讨交换域系数的选择在图像处理和编码中的…

你好!Apache Seata

北京时间 2023 年 10 月 29 日&#xff0c;分布式事务开源项目 Seata 正式通过 Apache 基金会的投票决议&#xff0c;以全票通过的优秀表现正式成为 Apache 孵化器项目&#xff01; 根据 Apache 基金会邮件列表显示&#xff0c;在包含 13 个约束性投票 (binding votes) 和 6 个…

Qt学习:Qt的意义安装Qt

Qt 的简介 QT 是一个跨平台的 C图形用户界面应用程序框架。它为程序开发者提供图形界面所需的所有功能。它是完全面向对象的&#xff0c;很容易扩展&#xff0c;并且允许真正地组件编程。 支持平台 xP 、 Vista、Win7、win8、win2008、win10Windows . Unix/Linux: Ubuntu 等…

【ARMv8M Cortex-M33 系列 2.1 -- Cortex-M33 使用 .hex 文件介绍】

文章目录 HEX 文件介绍英特尔十六进制文件格式记录类型hex 示例Cortex-M 系列hex 文件的使用 HEX 文件介绍 .hex 文件通常用于微控制器编程&#xff0c;包括 ARM Cortex-M 系列微控制器。这种文件格式是一种文本记录&#xff0c;用于在编程时传递二进制信息。.hex 文件格式最常…

docker学习笔记02-安装mysql

1.安装mysql8 下载MySQL镜像 docker pull mysql:8.0创建并启动容器 docker run -itd --name mysqltest -p 9999:3306 -e MYSQL_ROOT_PASSWORD123456 mysql其中-it是交互界面 -d是后台执行 -name 指定容器名称 -p指定映射端口 -e设置环境变量 最后mysql是镜像名或者用镜像id如…

Flask 日志

flask 日志 代码源码源自编程浪子flask点餐小程序代码 记录用户访问日志 和 错误日志 这段代码是一个基于Flask框架的日志服务类&#xff0c;用于 记录用户访问日志 和 错误日志。代码中定义了一个名为LogService的类&#xff0c;其中包含了两个静态方法&#xff1a;addAcc…

XUbuntu22.04之删除多余虚拟网卡和虚拟网桥(二百零四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

用Xshell连接虚拟机的Ubuntu20.04系统记录。虚拟机Ubuntu无法上网。本机能ping通虚拟机,反之不能。互ping不通

先别急着操作&#xff0c;看完再试。 如果是&#xff1a;本机能ping通虚拟机&#xff0c;反之不能。慢慢看到第8条。 如果是&#xff1a;虚拟机不能上网&#xff08;互ping不通&#xff09;&#xff0c;往下一直看。 系统是刚装的&#xff0c;安装步骤&#xff1a;VMware虚拟机…

【Linux】 last 命令使用

last 命令 用于检索和展示系统中用户的登录信息。它从/var/log/wtmp文件中读取记录&#xff0c;并将登录信息按时间顺序列出。 著者 Miquel van Smoorenburg 语法 last [-R] [-num] [ -n num ] [-adiox] [ -f file ] [name...] [tty...]last 命令 -Linux手册页 选项及作用…

vue项目表单使用正则过滤ip、手机号

import useFormValidate from /hooks/useFormValidatesetup(props, { emit }) {const { validateName, validateIPAndPort } useFormValidate()const state reactive({workFaceInfo: props.info?.id ? props.info : {},sysTypeData: props.sysType,formRules: {name: [{req…

SpringBoot 在IDEA中实现热部署 (JRebel实用版)

JRebel简介&#xff1a; JRebel是与应用程序服务器集成的JVM Java代理&#xff0c;可使用现有的类加载器重新加载类。只有更改的类会重新编译并立即重新加载到正在运行的应用程序中&#xff0c;JRebel特别不依赖任何IDE或开发工具&#xff08;除编译器外&#xff09;。但是&am…

『Linux升级路』冯诺依曼体系结构与操作系统

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;Linux &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、冯诺依曼体系结构 &#x1f4d2;1.1为什么要有体系结构 &#x1f4d2;1.2…

虚函数的讲解

文章目录 虚函数的声明与定义代码演示基类Person派生类Man派生类Woman 测试代码动态绑定静态绑定访问私有虚函数总结一下通过成员函数指针调用函数的方式 虚函数的声明与定义 虚函数存在于C的类、结构体等中&#xff0c;不能存在于全局函数中&#xff0c;只能作为成员函数存在…

C# MVC +Layui侧边导航栏的收缩及展开

目录 1、头部代码 2、侧边栏&#xff08;例子只写了一级导航&#xff0c;需要多级可自行添加&#xff09; 3、body内容填充 4、 JS 1、头部代码 <div class"layui-layout layui-layout-admin"> <div class"layui-header"> …

MAVLINK生成自定义消息

git clone https://github.com/mavlink/mavlink.gitcd mavlinkgit submodule update --init --recursivepython -m mavgenerate出现以下界面 XML填写自定义xml路径&#xff0c;内容可以参考mavlink/message_definitions/v1.0 Out为输出路径 <?xml version"1.0"…

如何用Python批量计算Word中的算式

一、问题的提出 到了期末&#xff0c;大家都在忙着写总结、改试卷、算工作量&#xff0c;写总结可以借助于ChatGPT&#xff0c;改试卷可以用星火的自动批阅功能&#xff0c;算工作量就是一项比较棘手的问题&#xff0c;因为它涉及很多算式&#xff0c;有时需要老师用计算器算来…

Linux操作系统极速入门[常用指令](安装jdk,MySQL,nginx),以及在linux对项目进行部署。

linux概述&#xff1a; Linux是一套免费使用和自由传播的操作系统 我们为什么要学&#xff0c;Linux&#xff1f; 主流操作系统&#xff1a; linux系统版本&#xff1a; 内核版&#xff1a; 由linux核心团队开发&#xff0c;维护 免费&#xff0c;开源 负责控制硬件 发行版&…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之线性布局容器Row组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之线性布局容器Row组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Row组件 沿水平方向布局容器。 子组件 可以包含子组件。 接口 Row(…

机器学习深度学习面试笔记

机器学习&深度学习面试笔记 机器学习Q. 在线性回归中&#xff0c;如果自变量之间存在多重共线性&#xff0c;会导致什么问题&#xff1f;如何检测和处理多重共线性&#xff1f;Q. 什么是岭回归(Ridge Regression)和Lasso回归(Lasso Regression)&#xff1f;它们与普通线性回…