这篇文章主要为大家详细介绍了Java态和抽象类,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
多态:
我们知道Java的三个特征:封装、继承和多态。前两个在之前的Java (VI)入门中已经提到过。现在我们来谈谈多态性。
什么是多态性?
多态性,顾名思义,就是多种形式。
Java中多态性的含义:
1.向一个对象发送一条消息,让该对象自己决定用什么行为来响应这条消息。
2.子类对象的引用赋给父引用变量,实现动态方法调用。
Java中形成多态性的前提:
1.遗产
2.父类方法的覆盖
3.向上转化
我对多态性的解释:
比如我们是人,是学生,是年轻人。我可以像人一样做事,可以像学生一样买学生票,也可以像年轻人一样做公益,这样我们就可以用不同的形式做不同的事情。这不是更好理解一点吗?
注意:
多态的前提条件:必须有父子关系。
当用多态父类引用变量调用方法时,将调用子类的被覆盖方法。
多态性的定义和使用格式:
父类型变量名=新子类类型();
中多态成员的特征:
多态成员变量:编译运行看左边多态成员方法:编译看左边,运行看右边
多态性的转换:
多态的转型分为向上转型和向下转型两种向上转型:多态本身就是向上转型过的过程
使用格式:父类类型变量名=新子类类型();
适用场景:当不需要面对子类类型时,可以通过提高扩展性或者利用父类的功能来完成相应的操作。
向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用类型转为子类引用各类型使用格式:子类类型 变量名=(子类类型) 父类类型的变量;
适用场景:当你想使用特定于子类的函数时。
代码解释:
public class Person { //人类,作为父类使用 public void speak(){ System.out.println("我们都是一个人"); }}public class Student extends Person{ //继承父类,相当于我们是学生,有人的方法 @Override public void speak(){ System.out.println("我是人类中的学生"); }}public class Child extends Person{ //继承父类,相当于我们是孩子,有孩子的行为 @Override public void speak(){ System.out.println("我是人类中的孩子"); }}//测试类public class TestMain { public static void main(String[] args) {//父类类型 变量名=new 子类类型(); Person p = new Student(); //子类对象的引用赋值给父类 p.speak(); //多态 相当于这里使用的是Student的方法。输出我是人类中的学生 //我作为人,我用学生的身份,说出:我是人类中的学生Person p = new Child(); p.speak(); //输出:我是人类中的孩子//我作为人,用孩子的身份,说出我是人类中的孩子 }}//这段代码,我们用到了 继承,重写,向上转型,因为多态本来就是向上转型的过程
多态性的作用:介绍完多态性,再谈多态性有什么用?为什么多态性可以作为Java的三大特性。一定有原因:
提高代码的可重用性降低模块之间的耦合度
这里,多态性机制是什么?Java语言是如何实现多态性的?(可能有点难以理解,内容我也没有完全理解,但这也是面试考试的问题。)
所谓多态性是指程序中定义的引用变量所指向的具体类型和引用变量发出的方法调用不是在编程时确定的,而只是在程序运行时确定的,即引用变量将指向哪个类实例对象,引用变量发出的方法调用在哪个类中实现,都必须在程序运行时确定。由于具体的类是在程序运行时才确定的,所以引用变量可以在不修改源代码的情况下绑定到各种类实现,这就导致了引用调用的具体方法的改变,即不修改程序代码就可以改变程序绑定的具体代码,从而使程序可以选择多种运行状态。这就是多态性。多态性分为编译时多态性和运行时多态性。多态在编辑时是静态的,主要指方法的重载。它根据参数列表的不同来区分不同的函数,编辑后会变成两个不同的函数,所以在运行时不能称为多态。运行时多态是动态的,通过动态绑定来实现,也就是我们所说的多态。
对于多态性的理解,也可以参考一段代码:
class People{ //父类 public void eat(){ System.out.println("我们会吃饭"); }}class Student extends People{ //继承父类 @Override public void eat(){ System.out.println("我会吃肉"); } public void study(){ System.out.println("我们要好好学习"); }}class Teacher extends People{ //继承父类 @Override public void eat(){ System.out.println("老师会吃蔬菜"); } public void teach(){ System.out.println("老师要认真上课"); }}//测试类:public class TestMain { public static void main(String[] args) { People p=new Stu(); //子类对象的引用赋值给父类 p.eat(); //输出: 我会吃肉 }}
抽象类:
什么是抽象类?
普通类是一个完善的函数类,可以直接生成实例化的对象,它可以包含构造方法、普通方法、静态方法、常量和变量等。抽象类是指将抽象方法的组件添加到普通类的结构中。
抽象方法:
将有一个ldquo对所有常见的方法;{ } rdquo这表示方法体,带有方法体的方法可以被对象直接使用。抽象方法是指没有方法体的方法,抽象方法必须用关键字abstract修饰。也就是说,抽象类中的抽象方法被继承后可以重写,不需要编写。
类声明关键字:abstracat
定义一个抽象类:
public abstract class studnet{//定义一个抽象类public void study(){ //普通方法System.out.println("我会学习");}public abstract void eat(); //抽象方法,没有方法体,有abstract关键字做修饰}//注意: 有抽象方法,这个类必须是抽象的!!!
例:Shape类Shape需要提供面积和周长的计算方法,但是形状本身并没有确定,所以周长和面积的计算方法无法确定。这时候就需要用到抽象类和方法了。
由于Shape类的周长和面积的计算方法无法确定,所以可以将其声明为抽象的,以便在具体的子类中实现。
//定义一个shape类,但是没有具体的形状,所以我们定义成抽象类public abstract class Shape { private int a; public abstract void area(){} //求面积的方法 public abstract void perimeter(); //求周长的方法 public Shape() { //无参构造 } public Shape(int a) { this.a = a; }}//计算圆形面积的子类public abstract class shape { //有抽象方法的类,则一定是抽象类,需要关键字abstract修饰 private int a; public abstract void area(); //求面积的方法,没有方法体的方法,需要关键字abstract修饰 public abstract void perimeter(); //求周长的方法}//创建计算圆面积和周长的子类,并继承抽象类shape,并重写shape内的方法public class Circle extends shape{ public static double pi = 3.14; private double r; //半径 @Override public void area() { System.out.println("圆的面积:"+Circle.pi*this.r*this.r); } @Override public void perimeter() { System.out.println("圆的周长为:"+2*Circle.pi*this.r); } public Circle() { } public Circle(double r) { // this.r = r; }}//测试类:public class TestMain { public static void main(String[] args) { Circle c = new Circle(5); //传入半径为:5 c.area(); c.perimeter(); }}//输出结果: 圆的面积:78.5//圆的周长为:31.400000000000002
抽象方法和抽象类的注意事项:
抽象类中是可以有构造函数的,并且构造函数的写法和其它类没有区别,只不过它真正跑起来是因为子类构造函数的super调用,毕竟我们没办法new一个抽象类对象出来,只能把抽象类的构造函数交给子类的构造函数去使用。抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类。抽象类的子类,必须重写父类中所有的抽象方法,如果有一个抽象方法没有重写,都会出现编译错误不给过,这时也可以把子类也声明为抽象类,报错就会消失。
简明摘要:
抽象方法:没有方法体的方法,需要关键字abstract修饰有抽象方法的类,则一定是抽象类,需要关键字abstract修饰抽象方法不能使用private和static修饰抽象类,不一定有抽象方法的类抽象类,不一定有抽象方法的类抽象类可以有构造函数
普通类和抽象类有什么区别?
普通类不能包含抽象方法,抽象类可以包含抽象方法抽象类不能直接实例化,普通类可以直接实例化。
总结
本文到此为止。希望能帮到你
精彩评论