在Java中,当创建一个子类对象时,是不会先创建父类对象的。但是创建子类对象时,会去先调用父类的构造函数。
子类为什么能调用父类的方法?
子类会有一个父类的亚对象,拥有父类的完全属性和方法,但没有自己独立的空间,依赖于子类对象的空间,但不完全属于子类,可以通过super调用,注意:这里的super不是引用,因为亚对象不是真正意义的对象(没有自己的空间),而是一种标识符。
具体内容参考博客:
浅论创建子类对象时是否创建了父类对象_caoruntao_的博客-CSDN博客
2.怎么证明未显式定义构造方法时,编译器会自动生成无参的构造方法?当没有显式定义构造方法,编译器会自动提供一个没有参数的构造方法。
若类中显式定义了构造方法,则默认的无参构造不再产生。
具体证明参考博客(从字节码层面进行验证):
怎么证明未显式定义构造方法时,编译器会自动生成无参的构造方法?_一朵花花的博客-CSDN博客_如果没有定义任何构造方法系统会自动产生一个构造方法
3.String str=""与new String()有什么区别?String str ="aa":可能创建一个或者不创建对象。如果”abc”在字符串池中不存在,会在java字符串池中创建一个String对象(”abc”),然后str指向这个内存地址,无论以后用这种方式创建多少个值为”abc”的字符串对象,始终只有一个内存地址被分配;如果“abc” 在字符串池中存在, str直接指向这个内存地址。
String str = new String(“aa”):至少会创建一个对象,也有可能创建两个。因为用到new关键字,肯定会在堆中创建一个String对象,如果字符池中已经存在”abc”,则不会在字符串池中创建一个String对象,如果不存在,则会在字符串常量池中也创建一个对象。
具体解答参考知乎:
java 字符串常量池 - 知乎
4.在JAVA中为什么正最大数+1会等于负的最大数?涉及到原码、反码、补码的相关知识点。
例如 00000001表示10进制1,而10000001表示10进制-1
那么整数最大是01111111
+1=10000000
但是由于10000000和00000000 表示+0和-0都是0没区别,所以规定10000000=负数最大,为-128
5.重载相关知识点方法重载: 在同一个类中定义的方法,方法名称相同而形参列表不同。
重载和返回值类型无关。如果两个方法,参数一样,方法名一样,返回值类型不一样,这种不构成
重载,并且会编译出错。
构成重载的两个方法,必须在同一个作用域中。
final修饰的方法能否被重载?
可以。
6.final关键字final 修饰类: 不能被继承。
final 修饰方法: 不能被重写。
final 修饰变量: 不能被修改, 必须初始化。
final对象本身的引用(地址)不能改变, 里面的内容(值)是可以改变的。
7.java中变量必须初始化吗?成员变量可以不进行初始化,虚拟机也会确保它有一个默认的值。
初始化: 第一次赋值, 在第一次使用之前有值。
局部变量使用前有值, 就是直接赋值。
成员变量使用前有值, 就是在new完对象时, 保证有值。
8.创建对象的步骤第一次创建对象:
1.类加载 (在第二次开始创建对象时, 就不需要加载了)
2.new -> 分配内存空间
3.给直接初始化的变量赋值
4.调用代码块
5.选择一个构造器调用
9.子类继承父类继承了父类所有可见的属性和方法。
new 子类对象之前, 会先 new 父类对象。
new 子类对象会调用子类对象的构造方法, 第一行默认super()。
子类加载之前, 会先加载父类。
10.类加载的执行顺序静态的代码块 static {}
静态的成员变量 static int age = 1
静态的成员方法 加载到了内存中, 不执行
类什么时候会加载: 第一次使用类的时候
第一次被创建对象
调用静态方法
调用子类的静态方法
第一次创建子类对象
调用静态成员变量 / 子类的静态成员变量
主动加载 Class.forName("类的名字 java.lang.String")
类加载完成: (将类的信息 从 .class 文件中 读取到了 JVM 的方法区中),会在方法区中产生一个 字节码对象 Class 对象.getClass()。
13.接口的相关修饰关键字jdk1.8之前
public static final 成员变量
public abstract 方法
14.重写: 子类重写父类方法方法名相同, 参数列表也要一样。
返回值: 基本数据类型-必须一样,引用类型-子类方法的返回值只能是父类方法的返回值的子类。
访问控制符: 子类方法只能更开放。
异常: 子类方法的异常类型 不能多于 父类方法。
static 或者 final 的方法 不能被重写的。
FileNotFoundException extends IOException extends Exception
class Koo {
protected int method1() throws IOException { }
protected Animal method2() { }
public final void method3() { }
public static void method4() { }
}
class Foo extends Koo {
public int method1() { }
protected Cat method2() { }
public final void method3() { // 编译错误 }
public static void method4() { } // 编译没错, 但不是重写
}
15.成员变量和静态变量(类变量)的区别:
1、成员变量所属于对象。所以也称为实例变量。
静态变量所属于类。所以也称为类变量。
2、成员变量存在于堆内存中。
静态变量存在于方法区中。
3、成员变量随着对象创建而存在。随着对象被回收而消失。
静态变量随着类的加载而存在。随着类的消失而消失。
4、成员变量只能被对象所调用。
静态变量可以被对象调用,也可以被类名调用。
所以,成员变量可以称为对象的特有数据,静态变量称为对象的共享数据。



