第一步:创建一个父类,如Animal(动物) 类,这个方法中只有方法的定义,没有实现。第二步:创建一个子类,如cat(猫)类,这个方法中实现父类中的所有方法,并进行重写。
我们提供的服务有:网站制作、网站设计、微信公众号开发、网站优化、网站认证、正定ssl等。为上1000+企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的正定网站制作公司
第三步:创建一个子类,如dog(狗)类,这个方法中实现父类中的所有方法,并进行重写。
备注:多态实际上是一个父类有特定的属性,如动物有名称、年龄、所属科目,之后由子类去实现具体的,如猫,名称是猫,年龄是5岁,所属科目为猫科,然后狗同样有这些属性,只不过是值不同,这个就是一个多态的形式。子类可以有无限多,在步骤三后面添加即可。
1--:a1是类A的实例,所以只能调用A类中的show方法,参数b是类B的实例,B又是A的子类,所以只能调用类A中参数是A obj的那个方法,因为b只能转换为父类型A,不能转换为子类型D
2--:道理同上。
3--:道理同上。
由于前三条的变量类型和对象类型相同,不涉及多态,仅仅是重载的问题。
4--:此条代码是难点,这里涉及到了重写和重载的概念,把重写和重载彻底理解了,你就知道为什么输出是B and A了。重写是子类中的方法和父类中的方法同名,同返回类型,同类型参数。
而重载是同一个类中的两个方法(注意是同一个类中),名相同,但是参数类型不同或者数量不同。因为a2引用的是B类的实例,所以要去B类中找重写的show方法,而不是重载的。所以只能调用参数类型是A的那个方法。
5--:道理同第4条。
6--:B类中继承了A类的参数为D类型的show方法,只继承而没有重写。也就是B类中实际有三个方法,所以此条代码调用的是参数为D的方法。
7--:把上面的都理解了。7,8,9条代码就很容易理解了。
7,8,9和1,2,3一样不存在多态,仅仅是重载方法的调用。多态是父类变量引用子类对象才会发生的。变量类型和对象类型相同,只会涉及重载,和重写无关。
你发的这段代码,我在网上找到了一个博文,看了他的解释,开始我觉得很难理解,后来才明白,他的解释是混乱的。正确的原理是重写和重载。只要你把重写和重载的区别理解透彻,这段代码就容易理解了。
代码如下:
abstract class DongWu {
public abstract void info();
}
class Bird extends DongWu {
@Override
public void info() {
System.out.println("我是一只鸟。");
}
}
class Fish extends DongWu {
@Override
public void info() {
System.out.println("我是一条鱼。");
}
}
public class App5 {
public static void main(String[] args) {
DongWu bird = new Bird();
bird.info();
DongWu fish = new Fish();
fish.info();
}
}
java多态其实很简单的....java多态必须满足三个条件:1、继承2、子类重写父类方法3、父类引用调用子类对象接下来用例子一步一步解释分别是什么意思......继承:公司员工 有测试员、开发员和项目经理 他们都有一些共同的属性比如 年龄、性别、家庭地址、工资等。这时就可以将她们抽象出一个类出来 person 包括这些共同的属性。然后测试员、开发员和项目经理去继承这个类person后,就拥有了这些属性了。子类重写父类方法:测试员、开发员和项目经理的工资是不一样的,他们又从继承了工资这个属性,显然不能达到要求。此时就必须重写从父类继承过来的这个方法。父类引用调用子类对象:Person person = new Manager() 代码:pulbic Person {
public void 工资() { System.out.println(3000);
}}
//=========================================
public Manager extends Person { //满足条件1 继承 public void 工资() { //满足条件2 子类重写父类方法 System.out.println(5000);
}
}//=========================================public Demo { public static void main(String[] args) {
Person person = new Manager(); //满足条件3 父类引用调用子类对象
person.工资(); //打印 出5000;
}
}
多态,就是重载和重写.重载发生在一个类中.重写发生在子类,意思就是子类重写父类相同名称的方法.刚学语言有的东西,不必搞得那么清楚,只有知道怎么用就行了,有的问题你要想真正把它搞得很懂,短时间是不可能的,比如说接口,没有几年工作经验你根本不可能真正理解什么是接口,甚至有的人工作四,五年也没搞明白什么是接口,不要花太多时间去搞这些不容易搞懂的问题.
重载的特性,方法名相同.返回类型,传入方法的参数不同(包括个数和类型).
重写的特性,方法名相同,返回类型,参数均相同,必须发生在子类.
1.Java语言允许某个类型的引用变量引用子类的实例,而且可以对这个引用变量进行类型转换。
Animal animal=new Dog(); //引用变量animal引用一个Animal子类Dog的实例
Dog dog=(Dog)animal; //向下转型,把Animal类型转换为Dog类型
Creature creature=animal; //向上转型,把Animal类型转换为 Creature类型
animal=new Cat(); //引用变量animal引用另一个Animal子类Cat的实例
注:Creature这里指的是生物。
2.如果把引用变量转换为子类类型,称为向下转型,如果把引用变量转换为父类类型,称为向上转型。
3.在进行引用变量的类型转换时,会受到各种限制。而且在通过引用变量访问它所引用的实例的静态属性、静态方法、实例属性、实例方法,以及从父类中继承的方法和属性时,Java虚拟机会采用不同的绑定机制。
4.成员变量、静态方法按照引用变量声明的类型静态绑定;实例方法按照引用变量引用的实例动态绑定。
例如,对于以下这段代码:
Fathers f=new Sons();
System.out.println(“f.var=”+f.var);
System.out.println(“f.staticVar=”+f.staticVar);
f.method();
f.staticMethod();
运行时将会输出如下结果:
f.var=FatherVar
f.staticVar=StaticFaterVar
Son method
Static Father method
class Fathers{
String var="FatherVar";
static String staticVar="StaticFatherVar";
void method(){System.out.println("Father method");}
static void staticMethod(){System.out.println("Static Father method");}
}
class Sons extends Fathers{
String var="SonVar";
static String staticVar="StaticSonVar";
void method(){System.out.println("Son method");}
static void staticMethod(){System.out.println("Static Son method");}
String sonVar=null;
void sonMethod(){}
}
System.out.println("1--" + a1.show(b));
a1是A类引用指向A类对象,不存在多态,一定调用A类方法。A类方法有两个show(D)和show(A),b是B类引用无法转换为D类引用,但可以转换为A类引用,因此调用show(A),输出A and A。
System.out.println("2--" + a1.show(c));
输出A and A,原因同上。
System.out.println("3--" + a1.show(d));
调用show(D),输出A and D。
System.out.println("4--" + a2.show(b));
a2是A类引用指向B类对象,可能存在多态。b是B类引用无法转换为D类引用,但可以转换为A类引用,因此调用show(A),而B类重写了show(A),因此调用的是重写后的show(A),输出B and A。
System.out.println("5--" + a2.show(c));
同上,C类引用无法转换为D类引用,但可以转换为A类引用,因此调用show(A),输出B and A。
System.out.println("6--" + a2.show(d));
调用show(D),show(D)又调用父类即A类的show(D),输出A and D
System.out.println("7--" + b.show(b));
b是B类引用指向B类对象,不存在多态,一定调用B类方法。B类一共有三个方法:重写自A类的show(A)和show(D),以及新定义的show(B)。show(b)调用show(B)方法,输出B and B
System.out.println("8--" + b.show(c));
C类继承自B类,也调用show(B)方法,输出B and B
System.out.println("9--" + b.show(d));
调用show(D),show(D)又调用父类即A类的show(D),输出A and D