继承是子类在父类已有功能和属性的基础上,子类对父类进行扩充,只需要在子类中定义父类没有的功能或属性,相同的会从父类中继承过来。
package ExtendLearn;
class Person {
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;
}
}
class Student extends Person{
private String schoolName;
public String getSchoolName()
{
return schoolName;
}
public void setSchoolName(String schoolName)
{
this.schoolName=schoolName;
}
}
public class Test{
public static void main(String[] args)
{
Student student=new Student();
student.setName("qzf");
student.setAge(19);
student.setSchoolName("山东科技大学");
System.out.println("学校:"+student.getSchoolName() +" 姓名:"+student.getName()+" 年龄:"+student.getAge());
}
}
输出结果
可以看到子类可以使用父类中定义的方法,访问父类中定义的属性。
1创建子类对象时,优先调用父类的构造,然后调用子类的构造
package ExtendLearn;
class Person {
private String name;
private int age;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name=name;
}
public int getAge()
{
return age;
}
protected void setAge(int age)
{
this.age=age;
}
// person的构造
public Person()
{
System.out.println("Person的构造");
}
}
class Student extends Person{
private String schoolName;
public String getSchoolName()
{
return schoolName;
}
public void setSchoolName(String schoolName)
{
this.schoolName=schoolName;
}
//Student的构造
public Student()
{
System.out.println("Student的构造");
}
}
public class Test{
public static void main(String[] args)
{
Student student=new Student();
student.setName("qzf");
student.setAge(19);
student.setSchoolName("山东科技大学");
System.out.println("学校:"+student.getSchoolName() +" 姓名:"+student.getName()+" 年龄:"+student.getAge());
}
}
运行结果:
2不能进行多继承
package ExtendLearn;
class Person {
private String name;
private int age;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name=name;
}
public int getAge()
{
return age;
}
protected void setAge(int age)
{
this.age=age;
}
// person的构造
public Person()
{
System.out.println("Person的构造");
}
}
class Class{
private String Classname;
public void setClassname(String Classname) {
this.Classname = Classname;
}
public String getClassname()
{
return Classname;
}
}
class Student extends Person,Class{ //在这一行会报错
private String schoolName;
public String getSchoolName()
{
return schoolName;
}
public void setSchoolName(String schoolName)
{
this.schoolName=schoolName;
}
//Student的构造
public Student()
{
System.out.println("Student的构造");
}
}
public class Test{
public static void main(String[] args)
{
Student student=new Student();
student.setName("qzf");
student.setAge(19);
student.setSchoolName("山东科技大学");
System.out.println("学校:"+student.getSchoolName() +" 姓名:"+student.getName()+" 年龄:"+student.getAge());
}
}
如果多继承,第38行出现报错
可以采用多层继承完成
package ExtendLearn;
class Person {
private String name;
private int age;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name=name;
}
public int getAge()
{
return age;
}
protected void setAge(int age)
{
this.age=age;
}
// person的构造
public Person()
{
System.out.println("Person的构造");
}
}
class Class extends Person{
private String Classname;
public void setClassname(String Classname) {
this.Classname = Classname;
}
public String getClassname()
{
return Classname;
}
}
class Student extends Class{
private String schoolName;
public String getSchoolName()
{
return schoolName;
}
public void setSchoolName(String schoolName)
{
this.schoolName=schoolName;
}
//Student的构造
public Student()
{
System.out.println("Student的构造");
}
}
public class Test{
public static void main(String[] args)
{
Student student=new Student();
student.setName("qzf");
student.setAge(19);
student.setSchoolName("山东科技大学");
student.setClassname("计科四班");
System.out.println("学校:"+student.getSchoolName() +" 班级: "+ student.getClassname()+" 姓名:"+student.getName()+" 年龄:"+student.getAge());
}
}
运行结果:
3在继承的时候子类会继承父类的所有结构
这个继承包括:私有属性、构造方法、所有普通方法。
- 显示继承 所有非私有 *** 作属于显示继承,可以直接调用。
- 隐式继承 所有私有的 *** 作属于隐式继承,需要通过其他方式调用、
例如像私有的方法继承后就不能直接调用
package ExtendLearn;
class Person {
private String name;
private int age;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name=name;
}
public int getAge()
{
return age;
}
protected void setAge(int age)
{
this.age=age;
}
// person的构造
public Person()
{
System.out.println("Person的构造");
}
}
class Class extends Person{
private String Classname;
public void setClassname(String Classname) {
this.Classname = Classname;
}
public String getClassname()
{
return Classname;
}
}
class Student extends Class{
private String schoolName;
public String getSchoolName()
{
return schoolName;
}
public void setSchoolName(String schoolName)
{
this.schoolName=schoolName;
}
//Student的构造
public Student()
{
System.out.println("Student的构造");
}
}
public class Test{
public static void main(String[] args)
{
Student student=new Student();
student.setName("qzf");
student.setAge(19);
student.setSchoolName("山东科技大学");
student.setClassname("计科四班");
System.out.println("学校:"+student.getSchoolName() +" 班级: "+ student.getClassname()+" 姓名:"+student.getName()+" 年龄:"+student.getAge());
}
}
在这个例子中:父类private中的属性,例如name,age不能够直接访问,属于隐式继承
public方法属于显示继承
4可以在子类中重写父类的方法
重写getName,输出的时候输出两个name
package ExtendLearn;
class Person {
private String name;
private int age;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name=name;
}
public int getAge()
{
return age;
}
protected void setAge(int age)
{
this.age=age;
}
// person的构造
public Person()
{
System.out.println("Person的构造");
}
}
class Class extends Person{
private String Classname;
public void setClassname(String Classname) {
this.Classname = Classname;
}
public String getClassname()
{
return Classname;
}
}
class Student extends Class{
private String schoolName;
public String getSchoolName()
{
return schoolName;
}
public void setSchoolName(String schoolName) {
this.schoolName = schoolName;
}
//对getName方法的重写
public String getName()
{
return super.getName()+super.getName();
}
//Student的构造
public Student()
{
System.out.println("Student的构造");
}
}
public class Test{
public static void main(String[] args)
{
Student student=new Student();
student.setName("qzf");
student.setAge(19);
student.setSchoolName("山东科技大学");
student.setClassname("计科四班");
System.out.println("学校:"+student.getSchoolName() +" 班级: "+ student.getClassname()+" 姓名:"+student.getName()+" 年龄:"+student.getAge());
}
}
这里涉及到了super的使用,可以通过super调用父类的方法来重写子类的方法,还可以通过super重写父类的构造函数。
super不能调用private类型。
super在调用构造器的时候会一直向上检索,从父节点开始构造。
5向上转型和向下转型
向上转型
这个貌似不太常用,而且也不太好用,对上面的代码进行修改
System.out.println("学校:"+student.getSchoolName() +" 班级: "+ student.getClassname()+" 姓名:"+((Class)student).getName()+" 年龄:"+student.getAge());
输出:
Person的构造
Student的构造
学校:山东科技大学 班级: 计科四班 姓名:qzfqzf 年龄:19`
依旧没有调用父类的getName()函数;
把Class改为Person也是一样的结果。
改成这样会爆红,直接运行也不行
通过查阅资料,找到了一个应用场景,例如这样:
package ExtendLearn;
public class Test{
public static void main(String[] args) {
Son d=new Son();
System.out.println(((Parent)d).tag);
}
}
class Parent{
public String tag="parent";
}
class Son extends Parent{
private String tag="son";
}
package ExtendLearn;
public class Test{
public static void main(String[] args) {
Son d=new Son();
System.out.println(((Parent)d).tag);
}
}
class Parent{
public String tag="parent";
}
class Son extends Parent{
public String tag="son";
}
获得被覆盖的变量的值。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)