Java的继承

来源:互联网 发布:彩虹无人机 知乎 编辑:程序博客网 时间:2024/06/05 17:11

Java的四大特征:封装,继承,多态,抽象
继承是面向对象的最显著的特征之一,多态以继承为基础.继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。
首先举一个简单的继承实例:

public class student{  string name;  int age;  void eat();  void drink();  void learn();}public class teacher{   string name;   int age;   void eat();   void drink();   void teach();}public class people{   string name;   int age;   void eat();   void drink();}

由上面的代码可以看出代码的重复率很高,people的特征在teacher和student中都用到了,这时候就为了减少代码的重复,就需要用到我们今天所说的继承。

   public class student extends people    {      void learn();    }    public class teacher extends people    {       void teach();    }    public class people    {       string name;       int age;       void eat();       void drink();    }

这样就减少了很多的麻烦。
**接下来我们就着重的讲一下继承的方法
继承里面不是所有形式的类都能被其他类,子类,外包可以访问到的,他们都有自己的权限。如同C++一样,public全部能访问,private 除了类里面的的全部不能访问。
当前 类 包 子类 外部包
public ok ok ok ok
protected ok ok ok
默认 ok ok
private ok
接下来讲一些继承所涉及的关键字
Final关键字:
当用final修饰一个类时,表明这个类不能被继承。也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰。final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。
Object 类
Object类是所有Java类的祖先。每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。在不明确给出超类的情况下,Java会自动把Object作为要定义类的超类。可以使用类型为Object的变量指向任意类型的对象。Object类有一个默认构造方法pubilc Object(),在构造子类实例时,都会先调用这个默认构造方法。Object类的变量只能用作各种值的通用持有者。要对他们进行任何专门的操作,都需要知道它们的原始类型并进行类型转换。
Super关键字
在JAVA类中使用super来引用父类的成分,用this来引用当前对象,如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象。怎么去引用里面的父类对象呢?使用super来引用,this指的是当前对象的引用,super是当前对象里面的父对象的引用。

package cn.zjm.test;/** * 父类 * @author gacl * */class FatherClass {    public int value;    public void f() {        value=100;        System.out.println("父类的value属性值="+value);    }}/** * 子类ChildClass从父类FatherClass继承 * @author gacl * */class ChildClass extends FatherClass {    /**     * 子类除了继承父类所具有的valu属性外,自己又另外声明了一个value属性,     * 也就是说,此时的子类拥有两个value属性。     */    public int value;    /**     * 在子类ChildClass里面重写了从父类继承下来的f()方法里面的实现,即重写了f()方法的方法体。     */    public void f() {        super.f();//使用super作为父类对象的引用对象来调用父类对象里面的f()方法        value=200;//这个value是子类自己定义的那个valu,不是从父类继承下来的那个value        System.out.println("子类的value属性值="+value);        System.out.println(value);//打印出来的是子类自定义的那个value的值,这个值是200        /**         * 打印出来的是父类里面的value值,由于子类在重写从父类继承下来的f()方法时,         * 第一句话“super.f();”是让父类对象的引用对象调用父类对象的f()方法,         * 即相当于是这个父类对象自己调用f()方法去改变自己的value属性的值,由0变了100。         * 所以这里打印出来的value值是100。         */        System.out.println(super.value);    }}/** * 测试类 * @author gacl * */public class TestInherit {    public static void main(String[] args) {        ChildClass cc = new ChildClass();        cc.f();    }}

强制转换
people p1=new student();
Student s1=(Student)p1;
p1.study()
输出s1和p1,输出相同地址。
强行转化之前要判断

if(p1 instanceof Student){           //强行转化语句}else//不能进行强制转化{}

特殊强制转化

ArrayList list1=new ArrayList();List list2=new ArrayList();

匿名类

匿名类是不能有名字的类,它们不能被引用,只能在创建时用New语句来声明它们。匿名类的声明是在编译时进行的,实例化在运行时进行,这意味着for循环中的一个new语句会创建相同匿名类的几个实例,而不是创建几个不同匿名类的一个实例。
匿名类的目的是在某个地方需要特殊的实现,因此在该处编写其实现,并获取它的实例,调用它的方法。不要在匿名内部类编写其他的方法,是不可见的。
形式为:new <类或接口> <类的主体>

public class TestAnonymousClass{  public static void main(String args[]){  TestAnonymousClass testAnonymousClass=new TestAnonymousClass();  testAnonymousClass.show();  }  //在这个方法中构造了一个匿名内部类  private void show(){  Out anony=new Out(){ // 获取匿名内部类实例  void show(){ //重写父类的方法  System.out.println("this is Anonymous InterClass showing.");  }  };  anony.show();// 调用其方法  }  }  // 已有类Out;匿名内部类通过重写其方法获得另外的实现  class Out{  void show(){  System.out.println("this is Out showing.");  } [1]   }

构造方法

public class qi{}class qii{}

一个Java文件只能定义一个public类
一个类编译出一个字节码文件
可以放在都public 内部,输入内部类
继承好处
首先代码达到重用的目的
Student s=new people()错误
people p1=new Student()正确
people p1=new teacher()正确
//子类实体指向父类引用
Student s=new Student()

这里写图片描述
这里写图片描述
只有拿到内存才改变,达不到内存就办法就可以改变值
值传递:基础数据类型(boolean,char,byte,short,int,long,double,float)
引用传递:复杂数据类型(引用型数据类型)
数据保存方式不同。
这就是Java的继承。

0 0
原创粉丝点击