Java的继承

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值