继承的基本实现类的继承格式在JAVA中使用extends关键字完成类的继承关系,操作格式:·class 父类{} //定义父类·class 子类extends 父类{} //使用extends关键字实现继承继承:子类继承父类,可以扩展已有的功能.Extends关键字:称为扩展,子类扩展一个类,子类有时候也称为派生类。
继承的限制:在JAVA中只允许单继承,不能使用多重继承,即:一个子类只能继承一个父类,但是允许进行多层继承,即:一个子类可以有一个父类,一个父类还可以有一个父类。
继承的关系表示图:访问限制:在使用继承的时候要注意:子类是不能直接访问父类中的私有成员的,但是子类可以调用父类中的非私有化方法,但是不能直接调用父类中的私有成员。
继承的进一步研究:子类对象的实例化过程在继承的操作中,对于子类对象的实例化也是有要求的:子类对象在实例化前必须首先调用父类中的构造方法之后再调用子类自己的构造方法:public class Test{public static void main(String args[]){Students st=new Students();st.setName("zhangsan");st.setAge(30);st.setSchool("sichuan agriculture university");System.out.println("name is:"+st.getName()+",age is:"+st.getAge()+",school is:"+st.getSchool());}}class Person{private String name;private int age;public Person(){System.out.println("super's constractor method");}public void setName(String name){=name;}public void setAge(int age){this.age=age;}public String getName(){return name;}public int getAge(){return age;}}class Students extends Person{private String school;public Students(){System.out.println("the son's constractor mehod");}public void setSchool(String school){this.school=school;}public String getSchool(){return school;}}实际上,此时,对于子类的构造方法中,隐藏了一个“super”的语句,有时也将父类称为超类。
class Students extends Person{private String school;public Students(){super();//默认隐藏System.out.println("the son's constractor mehod");}public void setSchool(String school){this.school=school;}public String getSchool(){return school;}}方法的覆写:在继承的关系中也存在着方法覆写的概念,所谓的方法覆写就是指子类定义了与父类中同名的方法,但是在方法覆写时必须考虑到权限,即:被子类覆写的方法不能拥有比父类方法更加严格的访问权限。
已学过的三种访问权限:·private<default<publicpublic class Test{public static void main(String args[]){Students st=new Students();st.setName("zhangsan");st.setAge(30);st.setSchool("sichuan agriculture university");System.out.println("name is:"+st.getName()+",age is:"+st.getAge()+",school is:"+st.getSchool());st.print();}}class Person{private String name;private int age;public Person(){System.out.println("super's constractor method");}public void setName(String name){=name;}public void setAge(int age){this.age=age;}public String getName(){return name;}public int getAge(){return age;}void print(){//父类中的方法System.out.println("=====super=====");}}class Students extends Person{private String school;public Students(){super();//默认隐藏System.out.println("the son's constractor mehod");}public void setSchool(String school){this.school=school;}public String getSchool(){return school;}public void print(){//子类覆写父类的方法System.out.println("=====extends=====");}}从之前的正确操作中可以发现,如果现在子类将父类的方法覆写了,调用的时候肯定是调用了被覆写的方法,那么如果现在非要调用父类的方法该怎么办呢?----通过super关键字就可以完成功能,super关键字可以从子类访问父类中的内容。
如果要访问被覆写的方法:super.方法;public void print(){//子类覆写父类的方法super.print();//申明调用父类的方法,不一定放在首句,也可以放在下面System.out.println("=====extends=====");}如果要使用super不一定非要在方法覆写之后使用,也可以明确的表示某个方法是从父类中继承而来的,使用super只是更加明确的说,要从父类中查找,就不从子类中找了。
问题:如果现在在父类中使用private关键字什么申明了一个方法,那么在子类中使用default 权限算是扩大权限吗?否。
此时并没有被覆写,而是相当于在子类中又重新定义了一个新的方法出来。
属性的覆盖方法的覆写有很多要求,属性的覆盖,主要是指在子类中申明了与父类同名的属性。
但是此概念意义不大,很少使用。
public class Person{public static void main(String[] args){Students st=new Students();System.out.print();}}class st{public String name="xzl";}class Students extends st{public String name="mark";}方法的重载(overloading)与覆写(overriding)的区别:Super关键字Super表示的是从子类调用父类中的指定操作,例如:调用属性、方法、构造等。
因为在子类实例化的时候会默认调用父类中的无参构造,如果现在希望调用有参构造,则必须在子类中明确的申明。
public class Test{public static void main(String args[]){Students st=new Students("zhangsan",30,"sichuan agriculture university");System.out.print(st.getInfo());}}class Person{private String name;private int age;public Person(String name,int age){this.setName(name);this.setAge(age);}public void setName(String name){=name;}public void setAge(int age){this.age=age;}public String getName(){return name;}public int getAge(){return age;}public String getInfo(){return this.getName()+this.getAge();}}class Students extends Person{private String school;public Students(String name,int age,String school){super(name,age);//必须申明,因为是有参构造,这里如果不申明,则会出现编译错误this.school=school;}public void setSchool(String school){this.school=school;}public String getSchool(){return school;}public String getInfo(){return super.getInfo()+this.getSchool();}}不管任何时候,子类实例化的时候永远要先去调用父类中的构造方法,默认调用的是无参构造。