继承

继承

再Java中使用extends关键字来标识两个类的继承关系。
实例:
创建两个类,Test类和Test2类,其中Test2类继承与Test类。
Test类

public class Test {

    public  Test()
    {
        System.out.println("这是Test类的无参构造方法");
    }
    protected  void  doSomething()
    {
        System.out.println("这是Test类的成员方法doSomething");
    }
    protected  Test  doIt()
    {
        System.out.println("这是Test类的成员方法doIt");
        return new Test();
    }

}

Test2类

public class Test2 extends  Test {        // 使用extends关键字表示Test2继承与Test类  
    public  Test2()
    {
        super();
        super.doSomething();
    }
    public  void  doSomethingnew()
    {
        System.out.println("这是test2的成员方法doSoemthingnew");
    }
    public  void  doSomething()
    {
        System.out.println("这是Test2的成员变量doSomething");
    }
    protected  Test2 doIt()
    {
        return  new Test2();
    }
}

说明:Test类是Test2类的父类,Test2类是Test类的子类;再子类中可以连同初始化父类构造方法来完成子类初始化操作,既可以在子类的构造方法中使用super语句调用父类构造方法,也可以在子类中使用super关键字调用父类成员方法。
子类没有权限调用父类中被修饰为private 的方法和成员。子类继承父类的protected、public成员,子类可以重写父类的成员方法,可以重写成员方法的实现内容,更改成员方法的存储权限(protected->public)。注意,子类重写父类方法不能降低方法的修饰权限范围。重写的返回值类型必须是父类中同一方法返回值类型的子类。

1. 在Java继承机制中,创建一个子类对象,将包含一个父类对象,这个对象与父类创建对象是一致的。即子类实例对象创建时,会先创建其对应的父类对象,再创建子类对象实例。

2.对象类型的转换:向上转型和向下转型

Quadrangle类

    class Quadrangle{
        pubic static void draw(Quadrangle q)
    {    //some sentence
    }
  }

Parallelogram类

public class Parallelogram extends Quadrangle{
    public static void maim(String args){
          Paralelogram p =new Parallelogram();
          draw(p);
          //向上转型
          Quadrangle q=new Parallelogram();
            q=p;
          //向下转型,必须采用强制转换。
          Parallelogram p1=(Parallelogram)q;
    }
}

向上转型:子类对象可以直接赋值给父类对象。如: Quadrangle q=new Parallelogram();
向上转型是具体对象向抽象对象转换,不会出错,具有安全性。
向下转型:将父类对象赋值给子类对象。如: Parallelogram p1=(Parallelogram)q;
向下转型是抽象类向具体类对象转换。如果父类对象不是子类的实例,则会发生ClassCastException异常。

3.使用instanceof操作符判断对象类型

instanceof操作符的使用语法:
myobject instanceof ExampleClass
说明:

  • myobject 某类的对象引用
  • ExampleClass 某个类
    例子:
  Quadrangle q=new Quadrangle();
      if(q instanceof Quadrangle)  //q为实例对象的引用,Quadrangle时类的名称
          System.out,println("q的类型为:Quadrangle");

关于对象类型转换的变量和方法调用:
Animal类

public class Animal {
    int age=10;
    public    void eat(){
        System.out.println("animal");
    }
}

cat类

public class cat  extends  Animal{
        int age=20;
        int name=1;

        @Override
        public void eat() {
                System.out.println("cat");
        }
}

AnimalDemo类

public class AnimalDemo {
    public static void main(String[] args) {
        Animal a=new cat();
        System.out.println(a.age);
        //访问成员变量,编译执行都看左边
        a.eat();
        //编译看左边,运行看右边。
        /*
        *
        * 这里声明的对象为Animal类,是父类对象,但其使用的是子类cat类来对其实例化,是向上转型,
        * 在编译时,查看的是父类对象,如果父类中没有eat()方法,则会报编译错误;
        * 在运行时,调用的则是用来实例化的子类cat中的eat()方法,如果子类中没有重写父类中的eat()方法,则在运行父类的eat方法。*/
    }
}

如果父类中没有eat方法:

如果子类中没有重写eat方法:
这个调用语句不会报错,

但是运行时由于子类没有重写eat方法,调用的则是父类的eat方法。

重载:方法的重载仅针对于一个类中方法的名称与参数进行识别,与返回值无关。

构成方法重载的条件:

  • 参数个数不同
  • 参数类型不同
  • 参数顺序不同

不定长参数方法

不定长方法的语法如下:
返回值 方法名(参数类型 ... 参数名称)
一个实例:

  pubilc static int add(int...a)
  {
    int sum=0;
    for(int i=0;i<a.length;i++){
      s+=a[i];
      return s;
      }
  }
posted @ 2021-12-21 22:13  hanqi  阅读(95)  评论(0)    收藏  举报