面试知识点【java基础篇】

1、一个程序有且仅有一个main方法启动,main方法是作为java程序启动的唯一入口。

复制代码
  public static void main(String[] args) {
        Student student = new Student(11,"111");
        System.out.println(student);
    }
权限修饰符:
    
    public:修饰一个类是公开的 public修饰的类一定和文件名一致,一个类中有且仅有一个 public类
    protect 
    private:修饰类 私有类
    default:默认不写
​
修饰类 修饰方法 修饰域
public 公开类 都可以访问 都可以访问
private 私有类 该方法只能在本类中被访问不能被其他类访问 该方法只能在本类中被访问不能被其他类访问
protect 子类可以继承可以访问 同包下的类也可以访问 子类可以继承可以访问 同包下的类也可以访问
default 只有同包的可以访问 当前类可以访问 只有同包的可以访问

作用域 当前类 同包 子类 其他

public √ √ √ √

protected √ √ √ ×

default √ √ × ×

private √ × × ×

类的成员不写访问修饰时默认为default。默认对于同一个包中的其他类相当于公开(public),对于不是同一个包中的其他类相当于私有(private)。受保护(protected)对子类相当于公开,对不是同一包中的没有父子关系的类相当于私有。

2、static关键字

1、修饰类 静态类:静态内部类

2、修饰静态域:类的所有对象共享这个域

3、修饰方法 静态方法:不用创建对象直接 通过方法名加传参就可以调用 只能访问静态属性,不能访问非静态属性和对象

static修饰变量:static修饰的变量属于类变量,该变量被该类所产生的所有对象共享

static修饰的是方法,this修饰的是类

static修饰的方法属于类方法:

(1)this关键字不能在static方法中使用。

(2)静态方法不能使用非静态方法

(3)非静态方法能使用静态方法。

(4)静态方法可以调用静态方法

static代码块:static修饰的代码块在main方法之前执行,以便于优化程序,优化main方法

3、final

final修饰的变量:

final修饰的变量叫做常量,只能被赋值一次,值不能变化

基本数据类型:其数值一旦在初始化之后便不能更改

引用数据类型:在对其初始化之后便不能再让其指向另一个对象,但指向该对象的内容可以改变

final固定的是一个地址

final修饰全局变量:必须赋值,否则变量出栈时需要修改方法区中的值,这样不符合final得到特性

final修饰局部变量(存在方法区中):final修饰的局部变量可以不赋初始值,但是要想使用这个局部变量,就必须赋值

final修饰的方法:不能被重写,如果你有两个方法,该方法必须被子类重写,那么一定不能定义成final类型

final修饰的类:不能被继承

final的作用:防止变量被二次赋值防止方法重写,防止类被继承,防止指令重排序

4、基本数据类型:

整型:byte(-128~127 8位 1个字节)short int long

浮点型:float double 字符:char boolean

复制代码
    public static void main(String[] args) {
        byte c = 10;
        c = c+1;//会报错 需要强制类型转换 
        c+=1;//不会报错
        System.out.println(c);
​
    }

自动拆装箱:是一个编译器行为 是java编译器做的一个语法糖行为

装箱 valueOf

拆箱:对象.intvalue 对象.longValue()

复制代码
   Integer a = 1;
   int c = a.intValue();
   int intValue = 42;
   Integer integerValue = Integer.valueOf(intValue); // 将int转换为Integer对象

128陷阱 博客:

5、String类

string不可变 :我们对字符串做出的操作都会产生不同的字符串

string类型没有提供任何修改字符串的方法(防止他的值可以变)

final修饰string类 不能被继承 也就是没法通过重写父类方法的方式 修改值

final修饰了char类型数组(数组也是private修饰的) 保证一旦被赋值之后指向不可变 但是他的值可以变

好处:可以共享数据

提高处理字符串拼接的效率 :stringbuffer线程安全(对类中大部分方法都加了synchronized 锁) stringbuilder单线程下效率高

每一个数组都是java中的一个新创建的类型 比如int[] 数组 他的类型时 int数组类型

冒泡、快排、堆排序、要熟练掌握 Arrays.sort应用

6、抽象类和接口的区别

语义上:

继承抽象类是为了代码复用(提供一种模版)(描述事务本身的(特质)特点和属性)

实现接口更多是为了定义一个规范或者行为准则(接口更多是描述某种行为和能力比如我定义一个飞的接口,那么所有实现这个接口的类都具有飞的能力)

现实使用上区别不大。

java中是单继承多实现的

抽象类可以有普通方法、构造函数 普通域。

接口这些都没有。

7、面向对象编程的特点

封装、继承、多态

如何体现?

封装:把现实世界中的客观事物抽象成一个java类,然后在类中存放属性和方法,比如抽象一个汽车类其中有发动机、车轮等属性,又有启动、前进等方法。

多态:子类继承父类

子类重写父类方法

父类引用指向子类对象

8、程序执行第一步只是给静态变量和静态块赋初始值(0,null等)不会直接将对应的值给他

第二轮才是给对应的值 这个时候如果给静态的对象实例化 从上往下执行(先不管其他对象的实例化)非静态的初始语句初始化块执行

9、类加载的先后顺序

10、Object类所有类的基类

没重写调用的就是Object里面的equals就是==

equals和==区别

基本类型 == 比较值

引用类型 equals比较两个对象的值是否相同

重写equals就要重写hashCode

因为我们重写equals就是为了实现只要两个对象的值相同那么 返回就是true 比如在hashmap里面

如果我们重写了equals方法让他实现值相同就返回true,理论上euqals返回true说明值相同那么他们的hashCode值应该相同,如果不重写它是根据对象的地址生成的hashCode他的值不同,所以我们要重写hashcode保证他时根据对象内容生成的hashcode

基本方法:getClass 、toString、clone、notifyALL 、notify、equals hasCode

11、内部类:

局部内部类、

普通内部类

静态内部类

匿名内部类:匿名内部类不能定义任何静态成员、方法和类,只能创建匿名内部类的一个实例。一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。

复制代码
public class Test2 {
    public static void main(String[] args) {
        Thread a = new Thread(new Test3());
        a.start();
        Thread b = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("122223");
            }
        });
        b.start();
    }
​
}
class Test3 implements Runnable{
​
    @Override
    public void run() {
        System.out.println("123");
    }
}

new Runnable(){}; 代替了Test3实现Runnable接口的步骤,不用写实现类的类名,直接在小括号后面加大括号里面写实现相应的方法

lamndan表达式:

复制代码
public class Test2 {
    public static void main(String[] args) {
        Thread c = new Thread(()-> System.out.println("123457"),"c");
        c.start();
    }
​
}
//,后面的"c" 是起了一个名字有没有都可以
相关推荐
TT哇1 分钟前
*【每日一题 提高题】[蓝桥杯 2022 国 A] 选素数
java·算法·蓝桥杯
火烧屁屁啦24 分钟前
【JavaEE进阶】初始Spring Web MVC
java·spring·java-ee
w_312345438 分钟前
自定义一个maven骨架 | 最佳实践
java·maven·intellij-idea
岁岁岁平安40 分钟前
spring学习(spring-DI(字符串或对象引用注入、集合注入)(XML配置))
java·学习·spring·依赖注入·集合注入·基本数据类型注入·引用数据类型注入
武昌库里写JAVA43 分钟前
Java成长之路(一)--SpringBoot基础学习--SpringBoot代码测试
java·开发语言·spring boot·学习·课程设计
Q_19284999061 小时前
基于Spring Boot的九州美食城商户一体化系统
java·spring boot·后端
张国荣家的弟弟1 小时前
【Yonghong 企业日常问题 06】上传的文件不在白名单,修改allow.jar.digest属性添加允许上传的文件SH256值?
java·jar·bi
ZSYP-S1 小时前
Day 15:Spring 框架基础
java·开发语言·数据结构·后端·spring
yuanbenshidiaos1 小时前
C++----------函数的调用机制
java·c++·算法
是小崔啊2 小时前
开源轮子 - EasyExcel01(核心api)
java·开发语言·开源·excel·阿里巴巴