java中继承的用法,java继承简单例子
java继承与合成基本概念
继承:您可以基于现有的类构造一个新的类。继承现有的类可以重用这些类的方法和域。在此基础上,可以添加新的方法和域,从而扩展类的功能。
组合:在新类中创建一个现有对象称为组合。这样,现有的代码可以在不改变其形式的情况下被重用。
相关视频教程推荐:java视频教程
1.继承的语法
关键字extends表示新类是从现有类派生的。现有的类称为父类或基类,新的类称为子类或派生类。例如:
班级学生拓展人{
}类Student继承Person,Person类称为父类或基类,Student类称为子类或派生类。
2.合成的语法
组合很简单,就是在一个类中创建一个现有的类。
班级学生{
狗狗狗狗;
}上溯造型
1.基本概念
继承的作用在于代码的重用。因为继承意味着父类的所有方法也可以在子类中使用,所以发送到父类的消息也可以发送到派生类。如果在Person类中有eat方法,那么在Student类中也会发现,也就是说Student对象也是一类人。
类别人员{
public void eat() {
system . out . println( eat );
}
静态空显示(人p) {
p . eat();
}
}
公共课学生拓展人{
公共静态void main(String[] args) {
学生s=新生();
个人秀;//
}
}[运行结果]:
吃
Person中定义的show方法用于接收Person句柄,但是在接收Student对象的引用。这是因为学生对象也是一个人对象。在show方法中,传入的句柄(对象的引用)可以是Person对象和Person的派生类对象。这种将学生句柄转换为个人句柄的行为称为反向建模。
2.为什么要上溯造型
为什么调用eat时会有意忽略对象类型?让show方法简单地获得Student句柄似乎更直观,但这将使从Person类派生的每个新类实现自己的show方法:
类别值{
private int count=1;
私有值(整数){
this.count=count
}
公共静态最终值
v1=新值(1),
v2=新值(2),
v3=新值(3);
}
类别人员{
公共void eat(值v) {
system . out . println( person . eat());
}
}
班主任扩展人{
公共void eat(值v) {
system . out . println( teacher . eat());
}
}
班级学生拓展人{
公共void eat(值v) {
system . out . println( student . eat());
}
}
公共类升级演示{
公共静态空显示(学生){
s . eat(value . v1);
}
公共静态空显示(教师t) {
t . eat(value . v1);
}
公共静态空显示(人p) {
p . eat(value . v1);
}
公共静态void main(String[] args) {
学生s=新生();
老师t=新老师();
Person p=新人();
演出;
显示(t);
秀(p);
}
}这种方法的一个明显的缺点是,需要定义与Person类的每一个衍生物密切相关的方法,导致大量重复代码。另一方面,如果您忘记了方法的重载,您将不会报告错误。上面示例中的三个show方法可以完全合并为一个:
公共静态空显示(人p) {
p . eat(value . v1);
}动态绑定
当执行show(s)时,输出结果是Student.eat(),这确实是我们想要的结果,但它似乎没有以我们想要的形式执行。我们再来看看展示方法:
公共静态空显示(人p) {
p . eat(value . v1);
}它接收人句柄。当执行show(s)时,它如何知道Person句柄指向学生对象而不是教师对象?编译器无从得知,这就涉及到接下来要解释的绑定问题。
1.方法调用的绑定
将方法与方法体连接起来称为绑定。如果在运行之前进行绑定,则称为“早期绑定”。在上面的例子中,当只有一个Person句柄时,编译器不知道调用哪个方法。Java实现了一种方法调用机制,可以在运行时判断对象的类型,然后调用相应的方法。这种基于对象类型的绑定称为动态绑定。除非一个方法被声明为final,否则Java中的所有方法都是动态绑定的。
用图表展示向上建模的继承关系;
如何解决写爬虫IP受阻的问题?立即使用。
代码总结如下:
Shape s=new Shape();根据继承关系,将创建的圆对象句柄赋给一个形状是合法的,因为圆属于一种形状。
当调用一个基本类方法时:
Shape s=new Shape();此时调用Circle.draw(),这是由于动态绑定的原因。
类别人员{
void eat() {}
void speak() {}
}
班级男生扩展人{
void eat() {
system . out . println( boy . eat());
}
void speak() {
system . out . println( boy . speak());
}
}
班级女生扩展人{
void eat() {
system . out . println( girl . eat());
}
void speak() {
system . out . println( girl . speak());
}
}
公共阶层人士{
public static Person rand Person(){
switch((int)(math . random()* 2)){
默认值:
案例0:
返回新男孩();
案例1:
返回新女孩();
}
}
公共静态void main(String[] args) {
Person[] p=新人[4];
for(int I=0;仪表板长度;i ) {
p[I]=rand person();//随机生成男孩或女孩
}
for(int I=0;仪表板长度;i ) {
p[i]。吃();
}
}
} Person为Person派生的所有类建立一个通用接口,所有派生类都有两个行为:吃和说。类重写这些定义并重新定义这两个行为。
在主类中,randPerson随机选择Person对象的句柄。* *上诉建模发生在返回语句中。**return语句获取男孩或女孩的句柄,并将其作为Person类型返回。这个时候我们不知道具体是什么类型,只知道是一个人对象的句柄。
在main方法中调用randPerson方法为数组填充Person对象,但具体情况我不清楚。当调用数组每个元素的eat方法时,动态绑定的作用就是执行对象的重定义方法。
但是动态绑定是前提,绑定的方法必须存在于基类中,否则无法编译。
类别人员{
void eat() {
system . out . println( person . eat());
}
}
班级男生扩展人{
void eat() {
system . out . println( boy . eat());
}
void speak() {
system . out . println( boy . speak());
}
}
公共阶层人士{
公共静态void main(String[] args) {
Person p=新男生();
p . eat();
p . speak();//没有为Person类型定义speak()方法
}
}如果子类中没有定义override方法,将调用父类中的方法:
类别人员{
void eat() {
system . out . println( person . eat());
}
}
班级男生扩展人{
}
公共阶层人士{
公共静态void main(String[] args) {
Person p=新男生();
p . eat();
}
}[运行结果]:
Person.eat()
2.静态方法的绑定
将static关键字添加到上述所有方法中,并将其转换为静态方法:
类别人员{
静态void eat() {
system . out . println( person . eat());
}
静态void speak() {
system . out . println( person . speak());
}
}
班级男生扩展人{
静态void eat() {
system . out . println( boy . eat());
}
静态void speak() {
system . out . println( boy . speak());
}
}
班级女生扩展人{
静态void eat() {
system . out . println( girl . eat());
}
静态void speak() {
system . out . println( girl . speak());
}
}
公共阶层人士{
public static Person rand Person(){
switch((int)(math . random()* 2)){
默认值:
案例0:
返回新男孩();
案例1:
返回新女孩();
}
}
公共静态void main(String[] args) {
Person[] p=新人[4];
for(int I=0;仪表板长度;i ) {
p[I]=rand person();//随机生成男孩或女孩
}
for(int I=0;仪表板长度;i ) {
p[i]。吃();
}
}
}[运行结果]:
Person.eat()
Person.eat()
Person.eat()
Person.eat()观察到,对于静态方法,无论父类引用什么子类对象,都调用父类的方法。
更多java相关文章,请关注java基础教程部分。以上是Java中继承图文的详细内容。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。