继承
子类继承父类,拥有了父类的功能,增加了新的功能,减少重复代码
成员变量、静态方法看左边;非静态方法,编译看左边,运行看右边
Fu f = new Zi();
当父类引用指向子类对象的时候,在这个引用变量f指向的对象中,他的成员变量和静态方法与父类是一致的;它的非静态方法,在编译时与父类是一致的,运行时与子类是一致的(复写)。
执行子类构造函数前,会先执行父类的构造函数。如果父类没有无参构造方法,则要求子类构造方法必须直接或者间接指定调用父类的哪个构造方法并且放在代码第一行,否则编译错误。此时编译错误 原因:
Base base=new Son(); 是多态的表示形式。父类对象调用了子类创建了Son对象。
base调用的method()方法就是调用了子类重写的method()方法。
而此时base还是属于Base对象,base调用methodB()时Base对象里没有这个方法,所以编译不通过。
要想调用的话需要先通过SON son=(SON)base;强制转换,然后用son.methodB()调用就可以了。
泛型
参数化类型。使用泛型时,在使用之前类型就确定了,不需要做强制类型转换。
自动装箱,拆箱
final
使用final修饰的变量,一旦赋值,不能被修改
方法,不能被重写
类,不能被继承
public,private,protected
private 本类内部 不能被继承
protected 本类内部、同包的类、不同包的子类 能被继承
重写和重载的区别
- 重载:同一个类中,方法名相同,参数列表(参数类型,个数,顺序)不同。与返回值类型无关
- 重写:子类重写父类方法,不同类中,方法名,参数列表,返回值类型都相同。
equals和==的区别
基本数据类型,==比较的是他们的值是否相等
复杂数据类型,==比较的是他们在内存中的存放地址,所以除非是同一个new出来的对象,比较后的结果为true
因为 Java 只有值传递,所以,对于 == 来说,不管是比较基本数据类型,还是引用数据类型的变量,其本质比较的都是值,只是引用类型变量存的值是对象的地址。
Object类中定义了equals方法,这个方法的初始行为是比较对象的内存地址,但是一些类(String,Integer)重写了equals方法,比较了对象内容是否相等。int和Integer的区别
java在进行编译时,Integer a = 130 会被编译成Integer.valueOf(130),这个可以通过反编译class文件看到。通过Integer源码可以看出,Integer.valueOf()方法会在数值-128~127之间会对Integer进行缓存,不会重新new一个。
当数值大于127或者小于-128,的时候则会重新new一个对象。所以比较大小要用equals方法。
所有的相同类型的包装类对象之间值的比较,全部使用 equals 方法比较。java元注解有哪些
元注解是注解的注解。
- Target:用来声明注解范围
- Retention:用来描述注解的生命周期,表示需要在什么级别保存该注解,即保留的时间长短。
- SOURCE:在源文件中有效(即源文件保留)
- CLASS:在class文件中有效(即class保留)
- RUNTIME:在运行时有效(即运行时保留)
String、StringBuffer、StringBuilder的区别
String的值是不可变的,每次对String对象操作都会生成新的String对象,这样效率低下,而且浪费大量内存空间。
和String类不同的是,StringBuffer和StringBuilder类的对象进行多次修改,不产生新对象
Stringbuilder不是线程安全的,效率高
StringBuffer是线程安全的,效率低
类加载顺序
- 执行父类的静态代码块和静态变量初始化,执行顺序只跟代码中出现的顺序有关。
- 执行子类的静态代码块和静态变量初始化。
- main方法
- 父类的成员变量和块(按照声明顺序)
- 父类的构造函数
- 子类的成员变量和块(按照声明顺序)
- 子类的构造函数
- 静态方法,实例方法只有在调用的时候才会执行。