Java面向对象基础之多态性,抽象类和接口
一、多态性
多态是指一个对象可以拥有多种不同的形态,继承是实现多态的基础。
1.1 引用多态和方法多态
引用多态:父类引用可以指向本类的对象,也可以指向子类的对象
方法多态:
1、创建本类对象时,调用的方法为本类方法;
2、创建子类对象时,调用的方法为子类重写或继承的方法。
首先建立父类animal,包含一个eat()方法,如下代码所示:
public class animal { public void eat(){ system.out.println("动物可以吃东西"); } }
然后建立子类dog继承父类animal,并重写eat()方法。
public class dog extends animal{ public void eat(){ system.out.println("狗狗可以吃东西"); } }
最后建立一个cat类继承animal,并独有getmouse()方法。
public class cat extends animal{ public void getmouse(){ system.out.println("猫会抓老鼠"); } }
通过测试类进行测试发现,父类的引用不能调用子类独有的方法。
public class inittest { public static void main(string[] args) { animal obj1 = new animal();//父类的引用指向本类对象 animal obj2 = new dog();//父类的引用指向子类对象 animal obj3 = new cat(); obj1.eat();//动物可以吃东西 obj2.eat();//20岁的狗狗可以吃东西 obj3.eat();//动物可以吃东西 } }
1.2 引用类型转换
向上类型转换(隐式或自动类型转换):子类转换为父类对象
向下类型转换(强制类型转换):父类转换为子类,有风险
向上类型转换好比是把杯子中的水倒进壶里,不会存在风险;而向下类型转换则是把壶里的水倒进杯子里,可能会溢出。为了避免这种风险的发生,可以使用instanceof关键字进行判断。如下代码所示:
public class inittest { public static void main(string[] args) { animal obj = new dog();//向上类型转换 if(obj instanceof dog){ dog dog = (dog)obj; //向下类型转换 }else{ system.out.println("不能进行dog类型转换"); } if(obj instanceof cat){ cat cat = (cat)obj; }else{ system.out.println("不能进行cat类型转换"); } } }
程序能够正常运行,且不能进行cat类型转换。
二、抽象类与接口
2.1 抽象类
当某个父类只知道子类应该包含这些方法却不知如何实现时,需要用到抽象类。抽象类用abstract关键字修饰,它限制子类必须有哪些方法,但不关注实现。抽象类中可以包含普通方法,也可以没有方法。
例:利用抽象类编写程序,求矩形和圆的周长和面积。
实现步骤:
1、抽象出矩形和圆形的抽象类shape作为父类,并定义要实现的方法求周长premeter()和求面积area();
2、分别创建子类rectangle和circle,继承抽象父类shape;
3、根据相关图形的求解算法,分别实现父类的抽象方法。
public abstract class shape { public abstract double perimeter(); public abstract double area(); } public class rectangle extends shape { double length; double width; public rectangle(double length,double width){ this.length = length; this.width = width; } @override public double perimeter() { return 2*(length+width); } @override public double area() { return length*width; } } public class circle extends shape { double radius; final double pi = 3.14; public circle(double radius){ this.radius = radius; } @override public double perimeter() { return 2*pi*radius; } @override public double area() { return pi*radius*radius; } } 这里,由于不同的形状求解周长和面积时,需要的参数个数不同,在定义抽象方法中无法统一给出参数,可以在子类中定义变量,通过初始化构造方法进行参数的传递。下面是测试方法代码: public class shapetest { public static void main(string[] args) { shape s1 = new rectangle(2,4); shape s2 = new circle(3.9); system.out.println("矩形的周长:"+s1.perimeter()); system.out.println("矩形的面积:"+s1.area()); system.out.println("圆形的周长:"+s2.perimeter()); system.out.println("圆形的面积:"+s2.area()); } }
2.2 接口
接口是一种特殊的类,由全局变量和公共方法组成。它定义了某一批类的规范,而不关心这些类的内部数据和实现细节,只规定这些类里必须提供某些方法。
接口里的属性是常量,默认会加上public static final三个关键字,接口里的方法只能是抽象方法,默认会加上public abstract关键字。
一个类可以实现多个接口,但类必须是先继承,然后实现接口。
例:傻瓜机和智能机继承了父类手机,父类的抽象方法里面都定义了打电话和发短信的功能,而智能机和psp都有玩游戏的功能。此时psp不具备手机的特征所以不宜继承手机类,而可以将玩游戏定义为一个接口,由智能机和psp实现。
public interface iplaygame { public void playgame(); } public class smartphone extends telphone implements iplaygame{ @override public void call() { system.out.println("smartphone可以打电话"); } @override public void message() { system.out.println("smartphone可以发短信"); } @override public void playgame() { system.out.println("玩游戏的功能"); } } public class psp implements iplaygame{ @override public void playgame() { system.out.println("玩游戏的功能"); } } public class interfacetest { public static void main(string[] args) { iplaygame ip1 = new smartphone(); iplaygame ip2 = new psp(); ip1.playgame(); ip2.playgame(); } }
接口还可以通过匿名内部类的方式实现,即没有名字的内部类。此方式常用于高级开发中。
public static void main(string[] args) { iplaygame ip3 = new iplaygame(){ @override public void playgame() { system.out.println("使用匿名内部类的方式实现接口"); } }; ip3.playgame(); }
注:文章根据本站相关课程的学习笔记整理而来,有错误或其他任何问题敬请指正,欢迎共同学习交流!
以上就是java面向对象基础:多态性,抽象类和接口的详细内容,更多关于java面向对象多态性 抽象类和接口的资料请关注其它相关文章!