面向对象oop继承

 

* Write Once,Only Once!
* 继承优点:提高代码的复用性;:继承的本质在于抽象。类是对对象的抽象,继承是对某一批类的抽象.

    继承的存在是有一定历史原因。最初的面向对象语言只有继承没有接口。c++就不直接支持接口。只能通过继承来实现对某一批类的抽象。  

     使用extends关键字实现继承;

public class TestExtends {

    public static void main(String[] args) {

Mammal m1 = new Mammal();

       m1.puru();

       m1.eat();

    }              

}

 

class Animal {

    String eyes="眼睛";

    String name="无名";

   

    public void eat(){

       System.out.println("动物吃东西!");

    }

}

 

class Mammal extends Animal {

    //哺乳

    public void puru(){

       System.out.println("小动物吃奶!");

    }

}


* 父类:父类更加通用,父类中保存时通用的代码
* 子类:子类更加具体
* Java中子类可以通过extends关键字继承父类非private修饰的属性和方法,但不能继承父类的构造 方法
* Java中的继承为单继承,可以实现多个接口-->一个子类只能有一个父类,一个父类可以有多个子类
* C++中可以有多继承---> 一个子类可以有多个父类。
* java中Object类是所有类的超类(祖先),如果没有使用extends关键字继承其他类,则默认该类继承 Object类

子类(基类或派生类):子类更加具体
重写:当子类中需要实现自身特殊的业务时
重写(覆写-->override):发生在父子类之间,方法名相同,参数列表相同,返回值类型相同,修饰符范 围>=被重写的方法的修饰符
重载(overload):一般在同一个类中,方法名相同,参数列表不同,与返回值类型和修饰符无关。
JavaTeacher javaTeacher = new JavaTeacher();
javaTeacher.giveLession();//giveLession为重写父类的方法, 此时执行为子类重写后的方法
* 重写父类的方法
* super关键字:代表父类对象
* this关键字:当前类的对象本身
* 1.可以使用super访问父类的属性和方法:super.属性 或super.方法名
* 如果使用super关键字调用父类的普通方法,没有顺序限制
* 2.使用super访问父类的构造方法:必须放在子类构造函数的第一行语句
* super()调用父类无参构造函数
* super(name,age,sex):调用父类带参数的构造方法

*Object:所有类的根基类(祖先)
*java中的类都直接或间接继承了Object类
* public class Student {}===>public class Student extends Object {
* Object中的方法:
* getClass():返回此 Object的运行时类--->反射机制中使用
* hashCode():返回该对象的哈希码值。 --->集合(set)
* notify()/notifyAll()/wait() :唤醒在此对象监视器上等待的单个线程--->多线程
* toString():Object 类的 toString 方法返回一个字符串-->地址(每个对象地址唯一)
* equals():指示其他某个对象是否与此对象“相等”.Object中equals方法本质上比较也是 两个对象的地址
* 如果想实现内容比较需要重写Object中的equals方法
*
* ==与equals的区别:
* equals():比较两个对象的内容是否相同.
* ==如果比较基本类型,其比较的值是否相同
* ==如果过引用类型,其比较为两个对象的地址是否相同(地址相同内容一定相同,内容相同地址不一定相同)

      *成员变量和成员方法的修饰符:
public(共有的):项目任何位置都可以访问(项目可见性),当变量或方法被public修饰时,该变量和方法可以在任何地方(指的是任何包中)的任何类中被访问;

private(私有的):只能在本类中访问(类可见性)
  1.将成员变量私有化:将成员变量的修饰符改为private 
  2.提高一个共有的getter方法(获取值的方法)和setter方法(赋值方法)
  3.在setter方法中添加访问权限控制
proteceted(受保护的):本类中可以访问,同一个包下其他类可以访问,子类可以访问 [即 认亲 戚(子类)有认邻居(同包下的其他类)]

默认(friendly友好的):本类中可以访问,同一个包下其他类可以访问 [只认邻居(同包下的其 他类)不认亲戚(不同包下的子类)]
*类的访问权限只有两种
public 公共的:可被同一项目中所有的类访问。 (必须与文件名同名)
default/friendly 默认的/友好的:可被同一个包中的类访问。

 当一个类中的多个同名方法满足以下条件时之一时,即实现了方法重载: 
a.  不同的参数个数 
b.  不同的参数类型 
c.  不同的参数顺序 
    如果有一个类带有几个构造函数,那么也许会想复制其中一个构造函数的某些功能到另一个构造函数中。可以通过使用关键字this作为一个方法调用来达到这个目的。对于this的任何调用,如果出现,在任何构造函数中必须是第一个语句。构造函数中调用另一构造函数,其调用(this()、super())有且只能有一次,并不能同时出现调用。
    覆盖是基于继承的,没有继承就没有覆盖。在 java 中,覆盖的实现是在子类中对从父类中继承过来的非私有方法的内容进行修改或扩展的一个动作(注意:不能违反访问级别的限制,即子类方法的访问级别不能低于父类方法的访问级别)。
    实现方法的覆盖必须满足以下所有条件:  
a.  覆盖方法的方法签名(方法名,参数,返回类型)必须与被覆盖方法的方法签名相同 
b.  覆盖方法的访问级别不能比被覆盖方法访问级别低 
c.  覆盖方法不能比它所覆盖的方法抛出更多的异常。    
    在 java 中的多态就体现在一个变量可以引用多个不同类对象,前提是这些不同类必须有者共同的父类,从而该变量可以且只能调用每个不同对象之间的公共操作集(方法)。父类引用可以引用子类对象,同时该父类引用只能访问所有子类的公有操作集(从父类继承过来的成员);当子类中已覆盖继承方法时,父类变量调用的将是子类中的已覆盖方法!
    Extends Object是JVM自动给任意类加上去的,从而保证 java中的所有类都具备一个通用父类。既然Object是所有类的父类,那么我们就可以通过Object 数组来实现异类收集,由于多态性,Object数组就能收集所有种类的元素。
    父类的私有方法对于子类来说是不可见的,注意,不可见不等于没有,子类仍旧继承了父类所有的成员,那么这些私有的父类成员去哪了?实际上,它们都被隐藏,对子类来说,这些父类的私有成员都被隐藏了起来,从而导致子类中的不可见。 
    我们通过super关键字显示地调用父类的构造函数,当然,也可以象使用this对象一样通过super调用父类的成员方法。比如:super.m1()等 但是,必须得注意:父类构造函数只能在子类构造函数中通过 super 显示调用,并且必须是第一句! 

 

posted on 2017-04-14 20:28  梦想这个东西  阅读(136)  评论(0编辑  收藏  举报