目录
一、成员变量
1.1 变量的默认值
二、 get,set方法
三、Java中对象占用的内存大小
四、继承
4.1 继承的作用
五、多态
六、值传递和引用传递
七、直接打印对象
八、static
static的缺点
static的作用
1. 静态变量和成员变量
2. 静态方法(类方法)
3. 静态导入
4. 静态块和实例块、构造函数的执行顺序
5. 静态内部类
九、重载和重写
1. 重载(Overload)
2. 重写(Override)
3. 静态方法不能被重写
4. 静态方法不能实现多态
十、this和super
1. this
2. super
面试题
1. 静态块、实例块、构造方法的执行顺序。
2. 子类构造方法中隐藏的第一句代码:调用父类的无参构造。
3. 使用转型后的null来使用静态成员变量
4. 继承中同名变量访问的特点
十一、 抽象
1. 抽象方法的特点
2. 抽象类
十二、接口
1. 概念
2. 接口和类的区别
3. 特性
面试题1】抽象类和接口的区别
面试题2】什么时候用抽象类什么时候用接口
一、成员变量
成员变量有两类:静态变量和实例变量,可以从存储位置,生命周期,默认值,作用域,使用方法(静态变量能直接使用)等方面来说。
- 静态变量被所有对象共享,一个对象修改,其他对象也会受到影响。
1.1 变量的默认值
局部变量没有默认值,因为它在栈中;成员变量和引用类型变量有默认值,因为它们在堆中。
所以局部变量不初始化不能使用,引用类型变量可以。
基本的类型默认值都为0,其中boolean的0是指false,char的0是指ASCII中的0 。
二、 get,set方法
get方法也叫访问器或获取器,set方法也叫做修改器。方法名有固定格式。
为什么需要写get、set方法?
因为往后学的一些框架/组件是通过调用get、set方法来获取和修改对象属性的。
三、Java中对象占用的内存大小
Java中也存在内存对其机制,通过对象的padding字段。
四、继承
4.1 继承的作用
提高代码复用性,减少代码冗余。
继承也是多态的基础条件。
Java中不允许多继承。
五、多态
多态就是一个方法可以有不同的表现形式。
在这个例子中,
Animal
是父类,Dog
是子类。main
方法中创建了一个Animal
类型的引用a,然后让这个引用指向一个Dog
对象,并调用simulateSound()
方法。由于多态性,实际调用的是Dog
类中重写的simulateSound()
方法。
这就是多态性的基本实现:通过父类引用接收子类对象,并在运行时确定实际调用的方法。这使得我们可以编写更加通用和灵活的代码,因为父类引用可以指向任何继承自该父类的子类对象,并调用相应的方法。
静态多态:方法重载,可变参数。
六、值传递和引用传递
- 自定义类型和数组是引用类型,存储的是地址;基本类型的变量,存储的数值。
- 所以引用传递就是使用自定义类型或数组做形参,传的是地址。值传递就是用基本类型变量做形参,传的是数值。
以上只是为了方便记忆,以下是官方说法:
在Java中,所有的参数传递,无论是引用类型还是基本类型,都是通过值传递的。这里的“值”对于基本类型来说就是具体的数值,而对于引用类型来说就是对象引用的地址值。
七、直接打印对象
直接打印对象时会默认调用其tostring方法,类中不重写tostring方法,就调用从Object类继承来的tostring方法,打印内容为 类型@hashcode值。
八、static
static的缺点
随着类加载创建,但要到类卸载时才销毁,所以一旦一个类不再被使用,其静态成员依旧会消耗内存。(Java如何避免内存泄漏?)
static的作用
1. 静态变量和成员变量
一个对象修改其成员变量不会影响到其他对象, 一个对象修改静态变量会影响到其他对象。
2. 静态方法(类方法)
好处是可以通过类直接调用,无需创建实例,还可以实现静态导入。
虽然类方法不需要创建对象调用,更节约内存,但不要把所有方法都写成静态方法,因为这不符合面向对象的封装设计原则、会导致线程安全问题。
3. 静态导入
a. 普通导入:
不在同一个包下的A类和B类,如果A类想使用B类的成员:必须先导入B类,再保证该成员的访问权限。(import 包名.类名)
b. 静态导入:
如果想不加类名就使用其他类的静态成员,那么我们可以在开头,静态导入该类的静态成员。(import static 包名.类名.成员)
4. 静态块和实例块、构造函数的执行顺序
a. 静态块:
静态代码块(static Block):在代码加载到方法区时就会执行。
静态代码块在类第一次被加载到JVM时执行,仅执行一次。这一过程发生在任何对象创建之前,以及任何静态方法调用之前。
b. 实例块:
实例代码块(Instance Block):实例代码块在每次创建类的实例时执行。
它们在构造方法之前执行,但在任何静态代码块之后,因为实例的创建总是在类加载之后。
c. 构造方法:
构造方法在实例代码块之后执行,每次创建类的新实例时执行。
【面试题】静态块和实例块、构造函数的执行顺序:
5. 静态内部类
静态内部类(Static Inner Class)是定义在另一个类(外部类)内部的类,并且这个内部类被声明为
static
。由于它是静态的,因此它不依赖于外部类的实例,并且可以通过外部类名直接访问。public class P {static class A {public int a;} }P.A a = new P.A(); //创建静态内部类的对象不需要先创建外部类的实例。
九、重载和重写
1. 重载(Overload)
方法名相同,参数列表不同。在同一作用域中。
对方法权限、返回值类型、抛出的异常不做要求。
2. 重写(Override)
方法名和参数列表要相同,权限不能比父类更严格,返回值类型和父类一样或是父类中返回值类型的子类。抛出的异常不能大于父类。
3. 静态方法不能被重写
在Java等面向对象的编程语言中,子类无法直接重写(override)父类的静态方法。这是因为静态方法与类的实例无关,而是与类本身相关。静态方法属于类本身,而非类的实例。因此,在子类中定义与父类同名的静态方法,实际上是在子类中隐藏了父类的静态方法,而不是重写了它。
子类会继承父类的静态成员,也能通过子类的类名访问,但子类无法重写父类的静态方法。
另外,子类可以通过自己的静态方法来隐藏父类的静态方法。当子类和父类有相同名称的静态方法时,子类的静态方法会隐藏父类的静态方法。但这并不是重写,而是隐藏。隐藏后,通过子类的实例无法调用父类的静态方法,只能通过父类名来调用。
4. 静态方法不能实现多态
- 子类和父类中如果有一样的静态方法的签名,这不是重写,而是隐藏。
- 因为静态方法是与类关联的,而不是与对象关联的,所以它们不会表现出多态性。当子类有一个与父类相同的静态方法时,我们说子类的静态方法隐藏了父类的静态方法。这意味着如果你使用子类名来调用该方法,你会得到子类的版本;但如果你使用父类名(或子类的父类引用)来调用该方法,你会得到父类的版本。
静态方法不能实现多态,用哪个类型来调用,就得到哪个类型的版本:
十、this和super
1. this
- 使用this调用构造方法,必须放在方法体的第一行。
- 用来区分成员变量和其他变量,避免重名问题。
- 使用this或super调用构造函数时,都必须放在方法体的第一行。
2. super
- 子类构造方法中隐藏的第一句代码:调用父类的无参构造。(如果父类有无参构造的话,没有就必须通过super关键字主动调用父类的构造方法)
- 创建子类时会先创建一个父类对象,所以必须先调用父类的构造方法。
面试题
1. 静态块、实例块、构造方法的执行顺序。
2. 子类构造方法中隐藏的第一句代码:调用父类的无参构造。
3. 使用转型后的null来使用静态成员变量
以下代码的输出?是输出10还是报错?为什么?
输出10,不会报空指针异常,因为静态成员变量是属于类的,我们甚至可以不通过对象,而使用类名来直接调用。
null 是 Java 中的一个关键字,表示“没有值”或“空”。它用于表示对象变量不引用任何对象
4. 继承中同名变量访问的特点
就近原则
以下代码的结果是10,20,还是30?
答案为30 。
十一、 抽象
抽象就是将一些类的方法抽离出来,只要声明而没有实现,而继承它的实现类必须实现这些方法,相对于对类的一种行为规范。
- 只有声明没有实现的方法叫抽象方法,要用abstract来修饰。
- 类中有抽象方法,这个类也必须是抽象类,所以该类也要使用abstract来修饰。
1. 抽象方法的特点
2. 抽象类
抽象类中可以有自己的成员变量和成员方法和构造方法。 但是抽象类不能有实例对象。
抽象类中的非抽象方法,是希望子类继承一些必要的方法但不希望子类重写该方法。
十二、接口
1. 概念
接口相当于干爹可以有多个,继承相当于亲爹只能有一个。
接口的实现也是多态,即接口引用指向子类对象。
2. 接口和类的区别
3. 特性
接口中所有的属性都是公共静态常量:
jdk1.8前接口中只有抽象方法,jdk1.8后可以在接口中写默认方法。
jdk1.8后可以在接口中写静态方法。
面试题1】抽象类和接口的区别
面试题2】什么时候用抽象类什么时候用接口
------------------------END-------------------------
才疏学浅,谬误难免,欢迎各位批评指正。