接口、继承与多态

接口、继承与多态

类的继承

  • 语法:class Test2 extends Test

  • super:既可以在子类的构造方法中使用super()调用父类的构造方法,也可以在子类中使用super关键字来调用父类的成员方法

    • 案例:

      class Test{public Test(){}protected void doSomething(){}protected Test dolt(){return new Test();}
      }
      class Test2 extends Test{public Test2(){super();//调用父类构造函数super.doSomething();//调用父类成员方法}public void doSomething(){}//重写父类方法protected Test2 dolt(){//重写,返回值改为Test2return new Test2();}
      }
      
  • 重写

    • 修改方法的权限只能从小的范围到大的范围改变
    • 返回值的类型必须是父类中同一方法返回值的子类
  • 在实例化子类对象时,JAVA编译器会在子类的构造方法中自动调用父类的无参构造方法(有参不能自动调用,需要利用super显示地调用)

  • 如果使用finalize()进行对象清理,需要确保子类finalize()方法的最后一个动作是调用父类的finalize()方法

Object类

  • 它是所有类的父类,是Java类层中的最高层类
  • object类中的getClass(),notify(),notifyAll(),wait()等方法不能被重写,因为是final类型

getClass()方法

  • 功能:它会返回对象执行时的Class实例,然后使用此实例调用getName()可以取得类的名称
  • 语法:getClass().getName()

toString()方法

  • 功能:将一个对象返回为字符串形式(实际应用中通常重写toString,为对象提供一个特定的输出模式)

  • 当这个类转换为字符串或与字符串连接时,将自动调用重写的toString

  • 实例:

    • public class ObjectInstance{public String toString(){return "在"+getClass().getName()+"类中重写toString方法";}public static void main(String[] args){System.out.println(new ObjectInstance());}
      }
      结果:在ObjectInstance类中重写toString()方法
      

equals()方法

  • 功能:比较两个对象的实际内容是否相等
  • equals方法默认实现是使用“==”运算符比较两个对象的引用地址,而不是比较对象的内容,所以要想比较内容,必须重写

对象类型的转换

向上转型

  • 案例

    • class Quadrangle{public static void draw(Quadrangle q){}
      }
      public class Parallelogram extends Quadrangle{public static void main(String args[]){Parallelogram p=new Parallelogram();draw(p);//调用父类方法}
      }//平行四边形也是一种类型的四边形
      
  • 把子类对象赋值给父类类型的变量

向下转型

  • 案例

    class Quadrangle{public static void draw(Quadrangle q){}
    }
    public class Parallelogram extends Quadrangle{public static void main(String args[]){draw(new Parallelogram());//将平行四边形类对象看作是四边形对象,称为向上转型操作Quadrangle q=new Parallelogram();//Parallelogram p=q;//将父类对象赋予子类对象,这种写法是错误的//将父类对象赋予子类对象,并强制转换为子类型,这种写法是正确的Parallogram p=(Parallelogram) q;}
    }
    
  • 使用向下转型技术时,必须使用显示类型转换,向编译器指明要转换为那种子类类型

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

  • 语法:某类的对象引用 instanceof 某个类(返回值为布尔值)

  • 案例:

    class Quadrangle{public static void draw(Quadrangle q) {	}
    }
    class Square extends Quadrangle{
    }
    class Anything{
    }
    public class Parallelogram extends Quadrangle {public static void main(String[] args) {Quadrangle q=new Quadrangle();//实例化父类对象if(q instanceof Parallelogram) {Parallelogram p=(Parallelogram) q;//进行向下转型}if(q instanceof Square) {Square s=(Square) q;}}
    }
    

方法的重载

定义

  • 如果同一个类中包含了两个及两个以上方法名相同,方法参数的个数、顺序或者类型不同的方法,则称为方法的重载。

规则

  • 方法名称必须相同

  • 参数列表必须不同(个数、类型、或排列顺序等)

  • 返回类型可同也可不同

  • 仅仅返回类型不同不足以成为方法的重载,与访问修饰符无关

  • 注意:参数顺序不同也可以区分两个方法,但是建议不要这样用,否则将增加代码维护的难度

语法

  • 返回值 方法名(参数类型……参数名称)

代码

package 接口继承与多态;public class OverLoadTest {public static int add(int a,int b) {return a+b;}public static double add(double a,double b) {return a+b;}public static int add(int a) {return a;}public static int add(int a,double b) {return 1;}public static int add(double a,int b) {return 1;}public static void main(String[] args) {// TODO 自动生成的方法存根System.out.print("调用add(int,int)方法:"+add(1,2));System.out.print("调用add(double,double)方法:"+add(2.1,3.3));System.out.print("调用add(int)方法:"+add(1));System.out.print("调用add(int,double)方法:"+add(1,2.2));System.out.print("调用add(double,int)方法:"+add(1.4,2));}}

可变参数

  • 语法:public static int add(int…a)

  • 意义:定义***不定长度***参数的方法

构造方法重载

代码
public class AnyThing {public AnyThing(){this("this调用有参构造方法");System.out.print("无参构造方法");}public AnyThing(String name){System.out.print("无参构造方法");}
}

多态

  • 案例

    public class Quadrangle2 {private Quadrangle2[] qtest=new Quadrangle2[6];private int nextIndex=0;public void draw(Quadrangle2 q) {if(nextIndex<qtest.length) {qtest[nextIndex]=q;System.out.println(nextIndex);nextIndex++;}}public static void main(String[] args) {Quadrangle2 q=new Quadrangle2();q.draw(new Square2());q.draw(new Parallelogramle());q.draw(new Rectangle());}}
    class Square2 extends Quadrangle2{public Square2(){System.out.println("正方形");}
    }
    class Parallelogramle extends Quadrangle2{public Parallelogramle() {System.out.println("平行四边形");}
    }
    class Rectangle extends Quadrangle2{public Rectangle() {System.out.println("长方形");}
    }
    

抽象类与接口

抽象类

  • 语法:

    public abstract class Test{abstract void testAbstract(){}//定义抽象方法
    }
    
  • 抽象方法没有方法体,本身没有任何意义,需要重写,而继承这个抽象方法的抽象类必须被继承,否则没有任何意义。

  • 只要一个类中有抽象方法,此类就是抽象类(非抽象类中不可能有抽象方法)

  • 抽象类被继承后需要实现里面所有的抽象方法,就是保证相同的方法名称、参数列表和相同返回值类型创建出非抽象方法或抽象方法。

  • java中规定一个类不能同时继续多个父类

接口

  • 简介:是抽象类的延伸,可以将它看作是纯粹的抽象类,接口中所有方法都没有方法体

  • 语法:

    public interface drawTest{void draw()
    }
    public class Parallelogram extends Quadrangle implements drawTest{}
    
  • 在接口中,方法必须定义为public或abstract形式(即使不声明,他也是public)

  • 在接口中定义的任何字段都自动是static和final

  • 案例:

    interface drawTest{public void draw();
    }
    class ParallelogramleUseInterface extends QuadrangleUseInterface implements drawTest{public void draw() {System.out.println("平行四边形.draw()");}public void doAnyThing() {}
    }
    class SquareUseInterface extends QuadrangleUseInterface implements drawTest{public void draw() {System.out.println("正方形.draw()");}public void doAnyThing() {}
    }
    class AnyThingUseInterface extends QuadrangleUseInterface{void doAhyTing() {}
    }
    public class QuadrangleUseInterface {public void doAnyThing() {}public static void main(String[] args) {drawTest[] d= {new SquareUseInterface(),new ParallelogramleUseInterface()};for(int i=0;i<d.length;i++) {d[i].draw();}}
    }
    输出
    正方形.draw()
    平行四边形.draw()
    
  • 多重继承:

    class 类名 implements 接口1,接口2……
    
  • 接口继承另一个接口:

    interface intf1{}
    interface intf2 extends intf1{}
    


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部