2019年06月19日(星期三)  农历:己亥年五月十七

作者:三年。分类: JAVA

1:java面向对象特征:抽象,封装,继承,多态。

抽象:

封装:

继承:

多态:

写一个类,来完成以上所包含的抽象,封装,继承内容

class LaoYin extends Thread implements Runnable{

private int  Number=1111111;

private String name ="loayin";

@Override

public void run() {

System.out.println("java学习者");

}

}

java中通过重载,和重写机制来实现多态。

/**

*

* @author YXP 小技巧:当我们想让类中的私有变量让外界访问到:使用SET();GET()。

* 简单方法是选中这些变量,右键,source  然后Ganerate Gater and Seter,即可。

*

*/

public class DuoTai {

String  name;

int   age;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public void cry(){

System.out.println("不知道怎么叫");

}

public  static void main (String[] args){

DuoTai an=new Cat();

an.cry();

DuoTai ni=new Dog();

ni.cry();

}

}

class Cat extends DuoTai{

public void cry(){

System.out.println("喵喵 ");

}

}

class Dog extends DuoTai{

public void cry(){

System.out.println("汪汪叫");

}

}

答案肯定是我们要的答案,父类调用子类的方法来为自己声明对象。

但是如果我们改变一下,关于类的成员变量,这里有很大的乐趣……

为每一个类声明一个一样的成员变量 count

基类100,cat是5,dog是50;

通过多态给基类声明对象,然后通过对象进行调用变量。我们瞧瞧看。

/**

*

* @author YXP 小技巧:当我们想让类中的私有变量让外界访问到:使用SET();GET()。

* 简单方法是选中这些变量,右键,source  然后Ganerate Gater and Seter,即可。

*

*/

public class DuoTai {

String  name;

int   age;

int count=100;

public String getName() {

return name;

}


public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public void cry(){

System.out.println("不知道怎么叫");

}

public  static void main (String[] args){

DuoTai an=new Cat();

an.cry();

System.out.println(an.count);

DuoTai ni=new Dog();

System.out.println(ni.count);

ni.cry();

}

}

class Cat extends DuoTai{

int count=5;

public void cry(){

System.out.println("喵喵 ");

}

}

class Dog extends DuoTai{

int count=50;

public void cry(){

System.out.println("汪汪叫");

}

}

运行看看:F11

喵喵

100

100

汪汪叫

现在我们就可以很好的明白多态的机制了,但是我有点晕了,对于这个用多态实现的对象,它内存中是如何实现的呢

当然main栈区呢  有na  ni

但堆内存中是什么样的内???

ni(栈内存)

int count(自身的成员变量)上下

cry()子类覆写的cry       (如何现实的不造,原理)纠结的感觉

只能是父类引用子类的构造函数,反过来不行。

多态引用变量会调用子类的方法,但是堆内存上依然存储的是自己的成员变量,只是方法指向了子类的方法吗??.

如果是指向子类的方法,那么子类必须要实现实例化,所以不成立

如果子类中有父类不曾有的方法,看看ni还能不能调用,即可知道。

答案不用说啦,编译不能通过。

ok,我感觉自己有点明白了一些,多态就是用子类的调用方法,来将子类中重写的父类方法,让父类调用。即父类对象的框架上,将子类的覆写方法覆 盖父类的方法,当然父类类上不存在的方法,对象没有内存空间存放子类方法,编译自然就有问题了。总之,多态就是与覆写方法有关,与成员变量无关。

温馨提示如有转载或引用以上内容之必要,敬请将本文链接作为出处标注,谢谢合作!

已有 0/1493 人参与

发表评论:



手Q扫描加入Java初学者群