继承中构造方法的访问特点代码块
十:继承中构造方法的访问特点1。1问题提问1继承中构造方法的访问特点有哪些2super()的如何使用3一个类如果没有显示的继承一个类默认是什么1。2视频时长13分41秒1。3问题答案1继承中构造方法的访问特点有哪些子类的构造方法都会默认访问父类的无参构造方法子类在初始化的时候有可能会使用到父类中的数据,如果父类没有完成初始化子类将无法使用2super()的如何使用通过构造super(。。。)访问父类的构造方法完成父类成员的初始化3一个类如果没有显示的继承一个类默认是什么Object类是所有类直接或者间接父类如果编写的类没有指定父类那系统会默认继承Object类也就是说Object类的所有能被继承的属性和方法在其他类中都会有一份这也就是我写一个类没有写任何方法但是我创建对象之后,通过对象就有能调用的方法十一:父类没有空参数构造方法super用法详细super的用法:1第一个用法super。classSuper{inta10;publicvoidprint1(){System。out。println(fu);}}classSubextendsSuper{inta50;publicvoidprint(){inta40;System。out。println(a);40System。out。println(this。a);50System。out。println(super。a);10print1();zisuper。print1();fu}publicvoidprint1(){System。out。println(zi);}}2第二个用法super()publicclassTest{publicstaticvoidmain(String〔〕args){newDog();1打印结果是Animal()Dog()默认行为当创建子类对象的时候首先要初始化父类调用父类的构造方法newDog(abc);2打印结果是Animal()Dog(String)}}classAnimal{publicAnimal(){System。out。println(Animal());}publicAnimal(Stringstr){3我这个有参数的构造方法什么时候能用System。out。println(Animal(String));}}classDogextendsAnimal{publicDog(){super(abc);4和this相似用爱构造方法中用来指定调用父类的哪个构造方法默认是super()调用父类无参的构造方法默认写在构造方法第一行System。out。println(Dog());}publicDog(Stringstr){System。out。println(Dog(String));}}总结:构造方法的第一句话有三种情况this()super()或者是一个其他的语句所以如果一个构造方法中的第一个语句不是this也不是super系统会默认添加super()无参。默认调用父类的无参构造方法通过super给父类属性赋值publicclassTest{publicstaticvoidmain(String〔〕args){newDog(大黄);1调用子类的有参构造方法}}classAnimal{privateStringname;子类如何给这个父类的私有属性赋值,publicAnimal(){System。out。println(Animal());}publicAnimal(Stringstr){System。out。println(Animal(String));namestr;3给父类的私有属性赋值}}classDogextendsAnimal{publicDog(){System。out。println(Dog());}publicDog(Stringstr){super(str);2初始化父类调用父类的有参构造System。out。println(Dog(String));}}例子:猜对错classSuper{publicSuper(Stringstr){}}classSubextendsSuper{}这个例子是错误的虽然看上去没有啥毛病但是类中是有好多系统帮你添加的代码是你看不见的classSuper{publicSuper(Stringstr){}}classSubextendsSuper{}publicSub(){super();}子类sub中默认有一个无参构造方法方法的第一句话是一个super()默认调用的是父类的无参构造而父类有一个有参构造系统不会默认添加无参数的构造方法这个super()找不到父类的无参构造方法所以报错所以super常常用来把构造参数传给父类去设置父类的属性总结super的作用1引用:父类对象在子类中访问父类被子类遮盖的属性或者被覆盖重写的方法2在子类构造方法中指定调用父类的哪一个构造方法超类,基类点击菜单Navigate,然后选择TypeHierarchy,或者直接使用快捷键F4更为方便ctrlh1如果没显示的声明一个类的父类,则此类默认继承java。lang。Object类2所有的java类除了(Object)都直接或者间接的继承自java。lang。Object类3所有的java的类都具有java。lang。Object类中声明的功能十二。代码优化和内存图解子类继承自父类的成员属性赋值的时候通过子类有参构造方法把参数通过super(参数表)传递给父类进行初始化本类的自己初始化1子类中所有的构造方法都会通过super()访问父类中的无参数构造方法2每个子类的构造方法默认第一句都是super();3this()super()都必须放在构造方法的第一句并且二者不能共存子类是可以继承到父类的私有的属性和方法的
十三:代码块1。1问题提问1什么是普通代码块有什么作用2什么是静态代码块有什么作用1。2视频时长12分01秒1。3问题答案1什么是普通代码块有什么作用局部代码块位置:定义在方法中作用:限定变量的声明周期,及早释放,提高内存的利用率构造代码块:位置:定义在类中方法外特点:每次构造方法执行时,都会执行该代码块中的代码并且在构造方法执行之前执行。作用:将多个构造方法中相同的代码,抽取到构造代码块中,提高代码的复用性2什么是静态代码块有什么作用位置:类中方法外特点:通过static关键字修饰,随着类的加载而加载并且只执行一次作用:在类加载的时候做一些数据初始化的操作1。4问题补充publicclassdemo{publicstaticvoidmain(String〔〕args){ZiznewZi(光头哥,26);我是父类中的静态代码块我是子类静态代码块我是父类中的成员代码块我是父类中的无参构造方法我是子类构造代码块我是子类构造方法光头哥261,因为new用到了Zi。class,并且子类继承了父类。所以会先找到Fu。class,再找到Zi。class文件并加载到内存中2,执行父类静态代码块3,执行子类静态代码块4,在堆内存中开辟空间,分配内存地址对父类属性默认初始化显式初始化5,执行父类的构造代码块6,执行父类的无参构造方法父类执行完毕7,在堆内存中建立对象的特有属性,并进行子类对象的默认初始化8,对子类对象的属性显式初始化9,执行子类构造代码块10,执行子类构造方法11,将内存地址赋值给栈内存中的z变量}}classFu{成员属性Stringname李四;intage6;成员方法publicvoidmethod(){System。out。println(我是父类的普通成员方法);}静态方法publicstaticvoidstaticFu(){System。out。println(我是父类中的静态成员方法);}静态代码块static{System。out。println(我是父类中的静态代码块);}构造代码块{System。out。println(我是父类中的构造代码块);}构造方法publicFu(){System。out。println(我是父类中的无参构造方法);}}classZiextendsFu{成员属性Stringaddress北京;成员方法publicvoidmethod2(){System。out。println(我是子类中的普通成员方法);}静态方法publicstaticvoidstaticZi(){System。out。println(我是子类中的静态方法);}静态代码块static{System。out。println(我是子类静态代码块);}构造代码块{System。out。println(我是子类构造代码块);}publicZi(Stringname,intage){this。namename;this。ageage;System。out。println(我是子类构造方法);System。out。println(nameage);}}