梵克雅宝为什么那么贵,丹阳网站优化,帮朋友做网站,新闻热点事件2023final
[面试题]请简述final关键字final修饰类#xff08;最终的类#xff09;-太监类#xff1a;该类不能被继承。(比如#xff1a;String StringBuilder,....)
final修饰方法#xff08;最终的方法#xff09;#xff1a;不能被重写
final修饰的变量 #xff1a;值不…final
[面试题]请简述final关键字final修饰类最终的类-太监类该类不能被继承。(比如String StringBuilder,....)
final修饰方法最终的方法不能被重写
final修饰的变量 值不能被修改final修饰的属性没有默认值要求必须赋值赋值的方式 ①显示赋值 ②代码块赋值 ③构造器赋值-一定要保证无论调用哪个构造器都可以给该变量赋值
class Person{//final int id20;//直接给属性赋值 - 显示赋值final int id; {//id 10; //代码块赋值}public Person(){id 20;}public Person(int age){id 23;}
//构造器赋值-一定要保证无论调用哪个构造器都可以给该变量赋值public void test(){//因为通过方法给final修饰的变量进行赋值 无法保证该方法一定会被调用所以不能通过方法给final修饰的变量赋值//id 20;}
}
类和对象的初始化
类的初始化过程 就是给类变量赋值的过程哪些操作会触发类的初始化1.创建对象 先有类再有对象2.调用类中的静态资源说明1.对子类进行初始化时会先对父类进行类的初始化2.类的初始化只执行一次3.通过子类调用父类的静态资源时不会对子类进行类的初始化4.当我们进行类的初始化时底层会调用一个clinit方法该方法的数量和有几个父类没有关系-只有一个在clinit方法中将父类还有子类中的初始化操作全部合并到clinit方法中执行。注意静态代码块和类变量谁在上面先执行谁。 class Animal{int aid 10;static int said 20;static {System.out.println(animal static block1);}{System.out.println(animal block);}static {System.out.println(animal static block2);}public Animal(){System.out.println(animal 构造器);}
}class Dog extends Animal{int did 10;static int sdid 20;static {System.out.println(Dog static block1);}{System.out.println(Dog block);}static {System.out.println(Dog static block2);}public Dog(){System.out.println(dog 构造器);}
}
public class ClassObjectInitTest {public static void main(String[] args) {/*先是类的初始化 再是对象的初始化类的初始化只执行一次 对象的初始化每创建一次对象执行一次。*/new Dog();new Dog();}
}debug进行顺序执行
1.父类类变量、类方法静态方法、静态代码块父类类加载
2.子类类变量、类方法静态方法、静态代码块子类类加载
3. 父类 属性、代码块谁在上谁先 构造器对象的初始化
4.子类 属性、代码块谁在上谁先 构造器对象的初始化
5.再次对此类的对象初始化时不用执行1、2步类加载已完成直接3、4
先是类的初始化 再是对象的初始化
类的初始化只执行一次 对象的初始化每创建一次对象执行一次。
说明1.在继承关系中每个类都会对应一个init方法。2.init方法在程序的执行过程中 会将属性代码块构造器的操作全部合并到init方法中执行。注意前两个属性和代码块看顺序 最后一定是构造器。