java 继承
继承
package com.epilogue.blog; class Person {//不添加public修饰符 private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } void print() { System.out.println("name:" + name + "\nage:" + age); } }
package com.epilogue.blog; public class Women extends Person { void print() {
//此处可以用super.父类的非私有方法和非私有属性 System.out.println("class women"); } }
package com.epilogue.blog2中创建一个Man类(继承Person类)
这个时候就报错了,因为Person类是默认default控制修饰符的,而我们在不同包时,它Person类要被继承,就必须定义为public的。
public class Demo { public static void main(String[] args) { N n=new N(); } } class M{ static{ System.out.println("父类的静态块"); } { System.out.println("父类的初始化块"); } public M(){ System.out.println("父类的构造块"); } } class N extends M{ static{ System.out.println("子类的静态块"); } { System.out.println("子类的初始化块"); } public N(){ System.out.println("子类的构造块"); } }
执行结果为:
父类的静态块
子类的静态块
父类的初始化块
父类的构造块
子类的初始化块
子类的构造块
可以看出,static块会最先被执行,且只执行一次;创建一个子类对象时,会自动调用父类的构造方法。
在main方法中创建对象
S s = new S();
则输出结果为
“父类的构造方法”
然后,我们将子类构造方法的代码注释掉,可以发现。仍然会输出“父类的构造方法”,这是因为子类的构造方法的第一句会默认调用父类的无参构造,所以父类的构造方法会优于子类执行。我们修改父类的构造方法,为其添加一个参数
这时,就会报这样一个错误
3.可以在子类构造方法的第一句自己调用super(参数),来调用父类的有参构造,前提是父类提供了相同参数的构造方法
错误提示我们需要为子类添加一个有参数的构造方法来继承父类,即:
4.super()或者是super(参数)必须是子类构造的第一行代码
5.super()或者super()参数只能调用一次
super
1.如果子类中有和父类相同的属性,可以在子类的方法中通过super.属性的方式访问父类继承的属性
package com.epilogue.blog; public class Demo1 { public static void main(String[] args) { S s = new S(); s.p();//调用p()方法 } } class S extends F { void p() {//子类中定义方法p() super.name = "epilogue";//通过super.属性/方法调用父类的属性方法 super.age = 22; super.print(); } } class F { String name;//定义2个变量 int age; void print() { System.out.print("name:" + name + "\nage:" + age); } }
输出结果为
name:epilogue
age:22
2.super只能在子类的内部调用父类的属性和方法,不能应用在静态方法中
方法的覆盖:方法的重写
1.子类中的方法和父类的方法同名同参同返回值
2.重写方法后,子类对象调用的是重写后的方法
3.重写方法时,子类方法的访问权限不能低于父类方法的访问权限
public---protecter--default---private
重写方法时,子类不能将父类的静态方法覆盖成非静态
方法的重载和方法的重写
重载指的是,同一个类中,同名方法,有不同的参数
final关键字
1.修饰局部变量,局部变量必须初始化,值不能被修改了;
2.修饰非静态成员变量,成员变量也必须修饰初始化,初始化后值不能再被修改了。
3.非静态成员变量初始化:
1)int b=0;
2)在非静态初始化块中
3)在构造方法中
3.修饰静态成员变量,也必须初始化,初始化后值不能再被修改了
静态成员变量初始化:
1)定义的同时
2)静态块
4.修饰方法:可以被继承,不能被子类覆盖
5.修饰类:这个类就不能被继承