面向对象高级01 继承重载super的使用.docx
- 文档编号:10301264
- 上传时间:2023-05-24
- 格式:DOCX
- 页数:24
- 大小:355.52KB
面向对象高级01 继承重载super的使用.docx
《面向对象高级01 继承重载super的使用.docx》由会员分享,可在线阅读,更多相关《面向对象高级01 继承重载super的使用.docx(24页珍藏版)》请在冰点文库上搜索。
面向对象高级01继承重载super的使用
13.面向对象高级(01)
本季讲解了JAVA中继承产生的原因及继承的基本实现,之后本季又重点阐述了JAVA中对于继承实现的各种限制,包括子类对象的实例化过程,方法的覆写、super关键字的使用等。
blog:
[零基础学JAVA]JavaSE面向对象部分-13.面向对象高级(01)2009-01-08
本季目标:
本季讲解了JAVA中继承产生的原因及继承的基本实现,之后本季又重点阐述了JAVA中对于继承实现的各种限制,包括子类对象的实例化过程,方法的覆写、super关键字的使用等。
类的继承
子承父业,如果孩子不是个败家子,至少可以保持家业不败,如果孩子上进,则家业肯定越来越兴盛。
观察以下一种情况:
·Person类:
name属性、age属性、setter、getter
·Student类:
name属性、age属性、school属性、setter、getter
Student是一个人吧?
Student与Person类相比,发现只多了一个School属性。
如果定义成两个类肯定是浪费的,至少Student类中的name和age是无用的。
我们可以把Student类作为Person类来处理。
class Person
{
Stringname;
int age;
public StringgetInfo()
{
return "姓名:
"+this.name+",年龄:
"+this.age;
}
};
//Student类与Person类相比是扩充了Person类的功能,所以此处继承即可
class Student extends Person
{
//如果此处任何内容都不写,则至少应该与Person类的内容一致
};
public class Demo01
{
public static void main(Stringargs[])
{
//使用子类对象
Students= new Student();
//以下的全部操作都是在Person类中定义的
s.name= "王乾" ;
s.age=27;
System.out.println(s.getInfo());
}
};
哪怕子类没有增加任何新的东西,则至少也可以从父类继承来很多的内容。
下面显示的就是Student类继承Person类调用getInfo()方法。
那么子类实际上也可以扩展父类的功能,此时只需要像之前那样直接在子类中定义即可我们看下面Demo02。
class Person
{
Stringname;
int age;
public StringgetInfo()
{
return "姓名:
"+this.name+",年龄:
"+this.age;
}
};
//Student类与Person类相比是扩充了Person类的功能,所以此处继承即可
class Student extends Person
{
//如果此处任何内容都不写,则至少应该与Person类的内容一致
Stringschool;
};
public class Demo02
{
public static void main(Stringargs[])
{
//使用子类对象
Students= new Student();
//以下的全部操作都是在Person类中定义的
s.name= "王乾" ;
s.age=27;
//在Student类中增加的school属性
s.school= "江南大学" ;
System.out.println(s.getInfo()+",学校:
"+s.school);
}
};
我们来验证一下哈,确实已经扩展了类滴功能哈,这就是继承的好处哈~
继承的规定
现实生活,一个孩子只能有一个亲爸,一个子类只能有一个父类。
而不能有多个父类(实际上此概念是从C++来滴,C++允许子类有多个父类哈~~~)。
但是一个父类可以有多个子类哈~~~
继承的规定
子类继承的时候是直接继承了父类中的非私有属性和非私有方法,而隐含的继承了父类中的私有属性(子类通过接口可以访问父类的私有属性和私有方法)。
老头子=>资产给孩子了=>孩子可以通过老头子的钥匙|打开保险柜哈~
=>情书(保密的,私有的)=>保险柜
class Person
{
private Stringname;
private int age;
//私有属性要加入setter和getter操作就可以访问了哈~
public void setName(Stringname)
{
this.name=name;
}
public void setAge(int age)
{
this.age=age;
}
public StringgetName()
{
return this.name;
}
public int getAge()
{
return this.age;
}
public StringgetInfo()
{
return "姓名:
"+this.name+",年龄:
"+this.age;
}
};
//Student类与Person类相比是扩充了Person类的功能,所以此处继承即可
class Student extends Person
{
//如果此处任何内容都不写,则至少应该与Person类的内容一致
Stringschool;
public void fun()
{
setName("王乾");
setAge(27);
}
public void print(){
System.out.println(getInfo()+",学校:
"+school);
}
};
public class Demo03
{
public static void main(Stringargs[])
{
//使用子类对象
Students= new Student();
}
};
我们发现没有报错哈,通过setter和getter方法,子类就可以继承父类的私有属性name和age
私有属性可以在子类中直接通过setter和getter方法取得,所以对于私有的内容实际上应该是提供操作的出口的。
子类对象实例化的过程
我们来验证一下是否子类对象在实例化时先调用父类的无参构造方法,然后再调用子类的构造方法,我们来看Demo04
class Person
{
private Stringname;
private int age;
public Person()
{
System.out.println("*****父类的构造方法*****");
}
//私有属性要加入setter和getter操作就可以访问了哈~
public void setName(Stringname)
{
this.name=name;
}
public void setAge(int age)
{
this.age=age;
}
public StringgetName()
{
return this.name;
}
public int getAge()
{
return this.age;
}
public StringgetInfo()
{
return "姓名:
"+this.name+",年龄:
"+this.age;
}
};
//Student类与Person类相比是扩充了Person类的功能,所以此处继承即可
class Student extends Person
{
public Student()
{
System.out.println("*****子类的构造方法*****");
}
//如果此处任何内容都不写,则至少应该与Person类的内容一致
Stringschool;
public void fun()
{
setName("王乾");
setAge(27);
}
public void print(){
System.out.println(getInfo()+",学校:
"+school);
}
};
public class Demo04
{
public static void main(Stringargs[])
{
//使用子类对象
Students= new Student();
}
};
我们看到Students=newStudent(); 实例化对象时确实如此哈~~~
做法的原因:
假设张三是李四的孩子,你说:
如果现在连李四都没有,能有张三吗?
实际上子类在继承父类之前,必须确保父类所有东西都初始化完毕了,这样在子类的构造方法中就隐含了一个:
super()的代码,此代码就表示调用父类中的构造方法。
Super是一个关键字,在国外父类也称为超类(Superclass),所以把访问父类的操作称为super
我们在子类中加入代码super()来验证下
class Person
{
private Stringname;
private int age;
public Person()
{
System.out.println("*****父类的构造方法*****");
}
//私有属性要加入setter和getter操作就可以访问了哈~
public void setName(Stringname)
{
this.name=name;
}
public void setAge(int age)
{
this.age=age;
}
public StringgetName()
{
return this.name;
}
public int getAge()
{
return this.age;
}
public StringgetInfo()
{
return "姓名:
"+this.name+",年龄:
"+this.age;
}
};
//Student类与Person类相比是扩充了Person类的功能,所以此处继承即可
class Student extends Person
{
public Student()
{
super();
System.out.println("*****子类的构造方法*****");
}
//如果此处任何内容都不写,则至少应该与Person类的内容一致
Stringschool;
public void fun()
{
setName("王乾");
setAge(27);
}
public void print(){
System.out.println(getInfo()+",学校:
"+school);
}
};
public class Demo04
{
public static void main(Stringargs[])
{
//使用子类对象
Students= new Student();
}
};
验证效果没有区别哈~
现在我们希望在调用Person类的构造方法时可以直接为属性初始化,我们来看Demo05
class Person
{
private Stringname;
private int age;
//希望在调用Person类的构造方法时可以直接为属性初始化
public Person(Stringname,int age)
{
System.out.println("*****父类的构造方法*****");
this.setName(name);
this.setAge(age);
}
//私有属性要加入setter和getter操作就可以访问了哈~
public void setName(Stringname)
{
this.name=name;
}
public void setAge(int age)
{
this.age=age;
}
public StringgetName()
{
return this.name;
}
public int getAge()
{
return this.age;
}
public StringgetInfo()
{
return "姓名:
"+this.name+",年龄:
"+this.age;
}
};
//Student类与Person类相比是扩充了Person类的功能,所以此处继承即可
class Student extends Person
{
public Student()
{
super();
System.out.println("*****子类的构造方法*****");
}
//如果此处任何内容都不写,则至少应该与Person类的内容一致
Stringschool;
public void fun()
{
setName("王乾");
setAge(27);
}
public void print(){
System.out.println(getInfo()+",学校:
"+school);
}
};
public class Demo05
{
public static void main(Stringargs[])
{
//使用子类对象
Students= new Student();
}
};
这样修改后我们父类中就没无参构造方法了哈~现在我们运行下看下效果哈~提示找不到无参Person()方法。
这样隐含的代码super();写与不写没两样了哈~此时最好可以明确的指出要调用父类中的有两个参数的构造方法,我们直接指明调用父类中有两个参数的构造方法,super(name,age)
class Person
{
private Stringname;
private int age;
//希望在调用Person类的构造方法时可以直接为属性初始化
public Person(Stringname,int age)
{
System.out.println("*****父类的构造方法*****");
this.setName(name);
this.setAge(age);
}
//私有属性要加入setter和getter操作就可以访问了哈~
public void setName(Stringname)
{
this.name=name;
}
public void setAge(int age)
{
this.age=age;
}
public StringgetName()
{
return this.name;
}
public int getAge()
{
return this.age;
}
public StringgetInfo()
{
return "姓名:
"+this.name+",年龄:
"+this.age;
}
};
//Student类与Person类相比是扩充了Person类的功能,所以此处继承即可
class Student extends Person
{
public Student(Stringname,int age,Stringschool)
{
//这样隐含的代码super();写与
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向对象高级01 继承重载super的使用 面向 对象 高级 01 继承 重载 super 使用