java基础-面向对象三大特性之继承实例

一)继承概述
1、 什么是继承,继承的特点?
     
子类继承父类的特征和行为,使得子类具有父类的各种属性和方法。或子类从父类继承方法,使得子类具有父类相同的行为。
       特点:在继承关系中,父类更通用、子类更具体。父类具有更一般的特征和行为,而子类除了具有父类的特征和行为,还具有一些自己特殊的特征和行为。
      在继承关系中。父类和子类需要满足is-a的关系。子类是父类。
      表示父类和子类的术语:父类和子类、超类和子类、基类和派生类,他们表示的是同一个意思。
2、 为什么需要继承?什么时候应该继承?
       使用继承可以有效实现代码复用,避免重复代码的出现。
        当两个类具有相同的特征(属性)和行为(方法)时,可以将相同的部分抽取出来放到一个类中作为父类,其它两个类继承这个父类(面向接口编程)。
        继承实现了面向对象的原则:write once,only once(编写一次、且编写一次)
3、 如何实现继承?
         在Java语言中,用extends(扩展)关键字来表示一个类继承了另一个类。
       在父类中只定义一些通用的属性和方法。
        子类自动继承父类的属性和方法,子类中可以定义特定的属性和方法。或子类重新定义父类的属性、重写父类的方法可以获得与父类不同的功能。


二)继承实例



1、继承实现

        继承的过程,就是从一般到特殊的过程,要实现继承,可以通过“继承”(Inheritance和“组合”(Composition)来实现。在某些 OOP 语言中,一个子类可以继承多个基类。但是在java语言中,一个子类只能有一个基类(父类),要实现多重继承,可以通过多级继承来实现。

       继承概念的实现方式有三类:实现继承、接口继承和可视继承。
       1)实现继承是指使用基类的属性和方法而无需额外编码的能力;
      2)接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力;
      3)可视继承是指子窗体(类)使用基窗体(类)的外观和实现代码的能力。

       在考虑使用继承时,有一点需要注意,那就是两个类之间的关系应该是“属于”关系。例如,Employee 是一个人,Manager 也是一个人,因此这两个类都可以继承 Person 类。但是 Leg 类却不能继承 Person 类,因为腿并不是一个人。

      抽象类仅定义将由子类创建的一般属性和方法,创建抽象类时,请使用关键字 Interface 而不是 Class。
OO开发范式大致为:划分对象→抽象类→将类组织成为层次化结构(继承和合成) →用类与实例进行设计和实现几个阶段。


2、继承实现基本格式

        class 父类{  …… }
        class 子类 extends 父类{ ……   }

继承父类的功能,扩展子类的所有功能,

(1)最基本的继承代码示例:

<span style="font-family:System;">package home;

	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{
	    //此处暂时不添加任何代码,但是Student可以拥有Person的所有特性
	}
	public class Demo{
	    public static void main(String args[]){
	    Student stu = new Student();//实例化Student对象stu(张三,20岁)
	    stu.setName("张三");
	    stu.setAge(20);
	    System.out.println(stu.getName()+stu.getAge());
	    }
	}</span>

(2)实例化子类对象:

<span style="font-family:System;">class Person{
    private String name;
    private int age;
    public Person(){
    System.out.println("我是父类Person中的构造方法哦");
    }
    public void setName(String name){
    this.name = name;    
    }
    public void setInt(int age){
    this.age = age;    
    }
    public String getName(){
    return this.name;    
    }
    public int getAge(){
    return this.age;
    }
}
class Student extends Person{
    private String school;
    public Student(){
    System.out.println("我是子类student中构造方法哦");
    }
}
public class Demo2{
    public static void main(String args[]){
    Student stu = new Student(); 
    Person stu2 = new Student(); //其實這兩個結果是一樣的
    }
}</span>
结果:


分析:1)先调用父类的构造->调用父类构造
        2)再调用子类构造->调用子类构造

实际上此时隐含在Student的构造方法的第一行有以下代码:super();

         注意点:在方法覆写时必须考虑到权限问题,即被子类覆写的方法不能拥有比父类方法更加严格的访问限。
         访问权限一共有四种,现在只讲三种:

●private:只能被类内访问,权限最低
●default:相当于什么都不声明
●public:最大的访问权限
●大小关系:private<default<public


3、继承混合多态的实现(较复杂)

看一个UML图(被系统吃掉了哦)


说明:这是一个基于面向接口编程的向上抽取出来的增删改查模块功能接口设计图

         1)实体的Dao接口要继承BaseDao接口。

         2)Dao的实现类要继承DaoImplBase类。

         3)也可以不继承指定的接口或类,这样就要自己写相应的方法。

         4)T getById(Long id)与List<T>getByIdList(Long[] idList)不要合并为List getById(Long... ids),因为获取一个对象时也是返回List,不方便。

 

         附:获取 BaseDao的类型参数T的Class

问题:
          1) 有了DaoBase与DaoImplBase,还要用UserDao、RoleDao吗?
答:要用。因为UserDao或RoleDao中的方法可以分为有公有的方法与特有的方法两部分,这就是java面向对象语言继承的意义。公有的方法是通过继承BaseDao得到的,特有的方法要写在自己里面(BaseDao中是没有的)。

         2) UserDaoImpl已经继承了BaseDaoImpl,就不实现UserDao可以吗?
答:不可以。否则UserDao userDao = new UserDaoImpl(); 就不成立。

       使用反射获取类型参数的真实类型的代码如下

<span style="font-family:System;">	public DaoBaseImpl () {
		Type type = this.getClass().getGenericSuperclass();
		ParameterizedType pt = (ParameterizedType) type;
		this.clazz = (Class<T>) pt.getActualTypeArguments()[0];
	}
</span>

         说明:

1)使用Session时,不要自己创建,也不要管理事务,直接调用getSession()即可。

2) 暂时不实现getSession()方法,在后面的事务管理中实现:
Session getSession(){
     thrownew UnsupportedOperationException();
}


          补充:泛化(Generalization)——泛型
          在上图中,空心的三角表示继承关系(类继承),在UML的术语中,这种关系被称为泛化(Generalization)。Person(人)是基类,Teacher(教师)、Student(学生)、Guest(来宾)是子类。
若在逻辑上B是A的“一种”,并且A的所有功能和属性对B而言都有意义,则允许B继承A的功能和属性。
           例如,教师是人,Teacher 是Person的“一种”(a kind of )。那么类Teacher可以从类Person派生(继承)。
          如果A是基类,B是A的派生类,那么B将继承A的数据和函数。
          如果类A和类B毫不相关,不可以为了使B的功能更多些而让B继承A的功能和属性。
          若在逻辑上B是A的“一种”(a kind of ),则允许B继承A的功能和属性。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值