下你所需,载你所想!
IT技术源码资料下载网站

java学习新手程序员必看

:其他软件 2020-07-08 00:02:17

java学习新手程序员必看

希望各位新手程序员可以通过我这个博客学会多态。(尽量短一点)多态体现形式:父类的引用指向自己的子类对象。(简单理解:父类的方法被子类同名方法覆盖)
多态的前提:类之间必须有关系,要么基础,要么实现,存在覆盖。
多态的好处:提高程序的扩展性。
多态的弊端:只能使用父类中的成员。打个比方,动物有小猪,小猫,小猪,小猫都是动物。
我们可以:小猫xx=new小猫();
小猪xx=new小猪();
和下面的
动物xx=new小猪();
动物xx=new小猫();
是一个效果。
动物可以作为小猪,也可以作为小猫,这就是多态。气死我了,上代码:
ackageduotai;abstractclassAnimal{
ublicabstractvoideat();
}
classCatextendsAnimal{
ublicvoideat(){
System.out.rint("小猫吃东西");
}
}
classPigextendsAnimal{
ublicvoideat(){
System.out.rint("小猪吃东西");
}
}
ublicclassduotai{
ublicstaticvoidmain(String[]args){
Catcat=newCat();
Pigig=newPig();
cat.eat();
ig.eat();
}
}
输出是:小猫吃东西小猪吃东西下面写一个同样结果的程序:
ackageduotai;abstractclassAnimal{
ublicabstractvoideat();
}
classCatextendsAnimal{
ublicvoideat(){
System.out.rint("小猫吃东西");
}
}
classPigextendsAnimal{
ublicvoideat(){
System.out.rint("小猪吃东西");
}
}ublicclassduotai{ ublicstaticvoideat(Animala){
a.eat();
}
ublicstaticvoidmain(String[]args){
Animalcat=newCat();
Animalig=newPig();这叫向上转型,子类向父类转。
eat(cat);
eat(ig);
}
}
这个输出是:小猫吃东西小猪吃东西但是猪喜欢睡觉动物不是都喜欢睡觉,那小猪想表达睡觉怎么办?
气死我了,上代码。
ackageduotai;abstractclassAnimal{
ublicabstractvoideat();
}
classCatextendsAnimal{
ublicvoideat(){
System.out.rint("小猫吃东西");
}
}
classPigextendsAnimal{
ublicvoideat(){
System.out.rint("小猪吃东西");
}
ublicvoidslee()
{
System.out.rint("小猪在睡觉");
}
}
ublicclassduotai{
ublicstaticvoidmain(String[]args){
Animalig=newPig();
ig.slee();
}
}
这个代码会报错的。因为Animal建立的Pig对象没有slee函数气死我了上解决方法:
ackageduotai;abstractclassAnimal{
ublicabstractvoideat();
}
classCatextendsAnimal{
ublicvoideat(){
System.out.rint("小猫吃东西");
}
}
classPigextendsAnimal{
ublicvoideat(){
System.out.rint("小猪吃东西");
}
ublicvoidslee()
{
System.out.rint("小猪在睡觉");
}
}ublicclassduotai{
ublicstaticvoidmain(String[]args){
Animalig=newPig();
Piga=(Pig)ig;向下转型
a.slee();
}}
这样就好了。输出小猪在睡觉。父类指向子类的时候,父类方法会被字类覆盖。(这是非静态方法哦,静态成员会被重写在另一个内存里,我们这样继承的话,父类的方法不会被子类重写)
ackageduotai;
classdad{
ublicvoida(){
System.out.rint("a_dad");
}
ublicvoidb(){
System.out.rint("b_dad");
}
}
classsonextendsdad{
ublicvoida(){
System.out.rint("a_son");
}
ublicvoidb(){
System.out.rint("b_son");
}
}
ublicclassduotai{
ublicstaticvoidmain(String[]args){
dadk=newson();
k.a();
k.b();
}
}
输出为a_sonb_son
看代码的时候a那么在类中存在的变量会不会和上面函数一样父类的方法被字类覆盖?
气死我了上代码:
ackageduotai;
classdad{
intnum=1;
ublicvoida(){
System.out.rint("a_dad");
}
ublicvoidb(){ System.out.rint("b_dad");
}
}
classsonextendsdad{
intnum=2;
ublicvoida(){
System.out.rint("a_son");
}
ublicvoidb(){
System.out.rint("b_son");
}
}ublicclassduotai{
ublicstaticvoidmain(String[]args){
dadk=newson();
sonm=newson();
System.out.rint(k.num);
System.out.rint(m.num);
}}
输出为12事实证明父类的变量不会被字类的变量覆盖每天一个学废小技巧:instanceof确定对象类型
代码:
ackageduotai;abstractclassAnimal{
ublicabstractvoideat();
}
classCatextendsAnimal{
ublicvoideat(){
System.out.rint("小猫吃东西");
}
}
classPigextendsAnimal{
ublicvoideat(){
System.out.rint("小猪吃东西");
}
ublicvoidslee()
{
System.out.rint("小猪在睡觉");
}
}ublicclassduotai{ ublicstaticvoiddd(Animala){
if(ainstanceofCat){
System.out.rint("这是猫");
}
if(ainstanceofPig){
System.out.rint("这是猪");
}
}
ublicstaticvoidmain(String[]args){
Animalcat=newCat();
Animalig=newPig();
dd(cat);
dd(ig);
}
}课后练习:可以把人分男人和女人,人作为父类,男人女人继承人这个父类,具体功能各位可以随意写,建议初学者直接输出(System.out.rint())自己用上转型,下转型完成一些操作。加油!!!

TAG:

相关阅读

最新推荐