JAVA基础常考知识点整理
1.transient
- 用transient修饰的属性,在实现接口(implements Serializable)时,不会被序列化
2.static
- 用static修饰的方法、变量、代码块称为类方法、类变量、类代码块被所有对象共享,存在方法区中;被static修饰的部分,在类第一次被加载是执行(分配内存)
- 执行顺序:
- 父类的静态变量----->静态代码块
- 子类的静态变量----->静态代码块
- 父类的普通变量----->普通代码块---->构造函数
- 子类的普通变量----->普通代码块---->构造函数
- **调用方式:**用static修饰的类、方法、变量、代码块在调用时不需要通过对象调用(也可以通过实例对象调用),可以直接通过类名调用。
- 静态方法的使用:
- 静态方法只能调用静态方法,非静态可以调用静态方法和非静态方法
- 静态方法中不能有this和super关键字
- 静态变量和成员变量的区别:
- 成员变量是随着对象的创建和销毁来创建和销毁,静态变量随着类的加载和销毁而存在
- 成员变量只能被对象调用,静态变量可以被对象和类调用
- 成员变量也叫实例变量,静态变量也叫类变量
- 成员变量存储在堆内存的对象中,静态变量存储在方法区(JVM中共享数据的区域)的静态区中
3.this关键字的几种用法
- 在一个类中,一个方法调用本类属性和方法可以使用this(但没必要)
- 当成员变量和静态变量重名时,在方法中使用this表示的是该方法所在类的成员变量或成员方法
- this当做当前参数进行传递(可以是一个或多个)
- 在匿名内部类中,表示匿名内部类本身
- 在构造方法中,this调用同一类中的其他构造函数(主要是在父子类的继承中)
- this()调用动作必须放在第一位
- 不能在构造方法以外的任何位置调用构造方法
- 一个构造方法中只能调用一个构造方法
4.super
- 访问父类的方法
- 调用父类的构造方法
- 父类只有带参数的构造方法时,子类也必须有相同的带参构造方法,并调用super(参数)
- 访问父类中的隐藏成员变量
5.final
- 修饰类:类不可继承
- 修饰方法:方法不可被覆盖
- 修饰变量:
- 修饰类变量:只能在静态初始化块中初始化
- 修饰成员变量:可以在非静态代码块,变量声明,构造器中赋初值
- 修饰局部变量:可以在刚开始定义的时候赋初值,也可以在之后的代码中赋值,但只能赋值一次
- 修饰基本数据类型:一旦被赋值就不可以以再修改
- 修饰引用数据类型:可以修改其内容,不可修改其引用
- 局部内部类和匿名内部类只能访问局部final变量
6.abstract和interface(抽象类和接口的区别)
语法 | 抽象类 | 接口 |
---|---|---|
是否可以有方法实现 | 可以 | 不可以,JDK8后可以有default实现 |
访问控制符 | 任意 | public、abstract |
属性访问控制符 | 任意 | public static final |
静态方法和静态代码块 | 可以有 | 不能有 |
继承关系 | 单继承 | 多继承 |
7.A instanceof B
- 判断A是否是B的实例
- 判断A是否是B子类的实例
- 判断A是否是B接口实现类的实例
8.内部类
无论什么样的内部类都会编译成单独的**.class**文件,即每个类都有单独的.class文件,外部类和内部类之间用$分隔;内部类 对象可以访问创建它的对象的实现,包括私有 数据;内部类不为同一 包的其他类所见,具有很好的 封装性;
- 成员内部类:
- 它可以无限制的访问外部类的所有 成员属性和方法(包括private)但是外部类要访问内部类的成员属性和方法则需要通过内部类实例来访问。
- 成员内部类中不能存在任何static的变量和方法(final修饰的除外);
- 成员内部类是依附于外部类的,所以只有先创建了外部类才能够创建内部类。
- 静态内部类:
- 它可以访问外部类的所有的静态变量和方法(包括private)
- 它可以定义静态变量、方法和构造方法
- 访问方式:
- 静态内部类里有非静态方法:外部类名.内部类名 对象名 = new 外部类名.内部类对象;
- 静态内部类里有静态方法:外部类名.内部类名 对象名 = new 外部类名.内部类名;
- 局部内部类:
- 它只能在该方法和属性中被使用,出了该方法和属性就会失效。
- 匿名内部类:
- 只能继承一个父类或者实现一个接口
- 不能存在任何的静态成员变量和静态方法。
- 直接使用new来生成一个对象,这个类首先是要存在的。如果我们将那个InnerClass接口注释掉,就会出现编译出错。
- 匿名内部类是没有访问修饰符的。
- **当所在的方法的形参需要被内部类里面使用时,该形参必须为final。**注意getInnerClass()方法的形参,第一个形参是用final修饰的,而第二个却没有。同时我们也发现第二个形参在匿名内部类中没有使用过,所以当所在方法的形参需要被匿名内部类使用,那么这个形参就必须为final。
- 匿名内部类是没有构造方法的。因为它连名字都没有何来构造方法。
9. == 和 equals()的区别
基本数据类型:一定是用==比较,因为equals()是函数比较的是对象,比较的是值
引用数据类型:比较的是地址(引用);如果equals()没有重写,那么它和没有区别,如果重写equals()后,那么equals()比较的是内容