接口、继承与多态
接口、继承与多态
类的继承
-
语法: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{}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
