黑马程序员_java继承-转载

黑马程序员_java继承


Java继承是使用已存在的类作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能。这种技术使得复用以前的代码非常容易,能够大大缩短开发周期,降低开发费用。比如:定义了一个动物类(Animal)。动物有属性:颜色,大小,或一些行为,如:叫声。我们通过这个父类,又可以派生出猫类,狗类,猪类。而这些派生出来的类则不需要自己再定义父类中已经有的成员。从而就提高了代码的复用性。

当然如果你只是为了提高代码的复用性,简化代码。就让类与类之间建立继承关系,这样的设计显然是不合理的,我们通常让类与类这间拥有继承关系是为让了类能够产生面向对象三大特性之一的多态特性。因为想要让类产生多态就必须要存在继承的这种关系。建立继承关系时值得注意的是必须是类与类之间有所属关系才可以继承。所属关系为 is a,说通俗一点就是什么是某某的一种。例如狗是动物的一种。那么狗类就可以和动物类建立继承关系。

下面我们来看看如何让类与类之间建立继承关系:

public class Animal{

         public String Color;

         public  void Cry(){

                 System.out.println("动物在叫");

          }

}      //想要让类与类之间产生继承关系,我们要用到java中的一个关键字(extends)

//在这里Animal就是Dog的父类,也可叫基类或导出类,而Dog就是Animal的子类,也可以叫导出类或派生类。

public class Dog extends Animal{

              //在这里面我们也可以定义本类的特有的属性和行为,例如狗可以啃骨头.

           public void Bones(){//子类可以访问父类中非私有的成员(成员变量,成员函数)严格的来说子类可以访问在访问权限以内中父类所有的成员。

           Cry();//调用父类中的Cry方法

            System.out.println("啃骨头中。。");

            }

}

java继承的特性

(1)继承简化了人们对事物的认识和描述,能清晰体现相关类间的层次结构关系。

(2)继承关系是具有传递性的。若类C继承类B,类B继承类A,则类C既有从类B那里继承下来的属性与方法,也有从类A那里继承下来的属性与方法,还可以有自己新定义的属性和方法,这被称为多层继承。
(3)继承提供了代码复用功能。若类B继承类A,那么建立类B时只需要再描述与基类(类A)不同的少量特征(成员变量和成员方法)即可。这种做法能减小代码和数据的冗余度,大大增加程序的重用性。
(4)继承通过增强一致性来减少模块间的接口和界面,大大增加了程序的易维护性。
java提供多重继承机制,从理论上说,一个类可以是多个一般类的子类,它可以从多个一般类中继承属性与方法,这便是多重继承。java出于安全性和可靠性的考虑,仅支持单重继承,例如:当多个父类定义了相同的功能。当功能内容不同时,子类对象不确定要运行哪一个。但是java保留了这种机制并用另一种的体现形式来完成表示,就是通过使用接口机制来实现多重继承。
类产生继承关系后成员的变化
1.成员变量:子类要访问本类中的变量,this,子类要访问父类中的同名变量,用super。super的使用和this的使用几乎一致。
this代表的是本类对象的引用。
网上有很多人说super代表父类的引用,其实是错误的,java并无此概念。我们可以同过一个小程序来说明。
public class Person{
}
class Student extends Person{
                public void show(){
                         Student s=this;
                         System.out.println("嘻嘻哈哈");   
                 }
-------上面的这个程序完全是正确的。。各位看官请看下面这个程序--------
public class Person{
}
class Student extends Person{
              public void show(){
                         Person p=super;//注意这里是super
                         System.out.println("嘻嘻哈哈");   
                 }
}
上面这个程序编译时就会报错。试想想如果super关键字是父类的引用,我把super赋值给p肯定就不会报错,本人怕自己这番见解不具备权威性,从而查阅了中外很多的java书籍,证实了我的想法是对的----大家可以把super理解为就是一个关键字。通过这个关键字我们可以调用本类的父类成员。
2.成员方法:当子类出现和父类一模一样的函数时,当子类对象调用该函数时,会运行子类函数的内容。如同父类的函数被覆盖一样。这种情况被称为函数的另一特性:重写,或者叫做覆盖。
----说到了函数的覆盖,在这里特别强调几点---
(1).子类覆盖父类,必须保证子类权限大于等于父类权限,才可以覆盖,否则编译失败。
(2).静态函数只能够覆盖静态函数 否则报错。另外再说一个知识点。看下面代码
public class Person{
          public static void show(){
                       System.out.println("我是父类");
          }
}
class Student extends Person{
          public static void show(){
                   System.out.println("我是子类");
           }
}
---按照上面的代码我敲上这句代码---
Person p=new Student();
p.show();//----在这里很多人都认为输出的是“我是子类”。为什么?通常的解释是因为多态。然而其实不然,在这里输出的结果是“我是父类” 重写静态的方法根本就不会发生多态。我们都知道在多态中函数的特点:1.在编译期间:参阅引用型变量所属的类中是否有调用的方法。2.在运行期间:参阅的却是对象所属类中是否有调用的方法。--
而在这里为什么p.show();调用的是父类中的方法了?那是因为静态方法跟对象根本就没关系。从没有对象我们也可以使用静态方法的这点就可以看出来。所以运行时如果你调用的是静态方法,java便不会根据里面的实际对象来选择调用的方法。
为了能上黑马,写这篇博文花费了我一个下午的时间,同时也希望这篇博文对新手们有用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值