JAVA超难理解的问题:为什么要这样定义?????

父类名变量名=new子类名()l;抽象类变量名=new类名()l;接口变量名=new类名()l;尤其是父类名变量名=new子类名()l;为什么要这样做???相比子类名变量... 父类名 变量名=new 子类名()l;
抽象类 变量名=new 类名()l;
接口 变量名=new 类名()l;
尤其是父类名 变量名=new 子类名()l; 为什么要这样做???相比子类名 变量名=new 子类名()l; 有什么好处??例如有父类Person ,子类student,Person p=new Student(); 为什么有时候这样写呢?还这样写呢:Student p=new Student(); ????
展开
 我来答
沈阳java
2012-03-18 · TA获得超过1507个赞
知道小有建树答主
回答量:797
采纳率:50%
帮助的人:668万
展开全部
多态的一种:父类的引用指向子类的对象。
好处:
1.泛化。例如你有一个方法,入参设置为Student,那么这个方法只能处理学生。而Person,就既可以处理学生又可以处理其它子类对象。
2.代码依赖抽象,解耦!当你的程序依赖于抽象的时候,就不会受到具体类的影响,便于替换。例如:
List list = new ArrayList(); //如果以后发现集合使用的不合适,只要重新new LinkedList()就可以,后面调用代码不需要修改
.......
ArrayList list = new ArrayList();//这就不容易修改例如,将ArrayList换为LinkedList的话,后面调用可能会大量修改。因为之前list的类型是ArrayList调用到的方法是ArrayList中的所有方法,即包括List接口定义的方法也包括除List接口外,自身添加的方法。
........
追问
可以写出代码帮我理解吗?Person p=new Student(); 这个p是属于哪个对象的?是不是属于Person又属于Student????“=”在这是不是赋值的意思?这个p是不是既可以调到Person中的方法又可以调用Student中的方法??
追答
p是一个引用(在C中称为指针)。引用在栈区开辟空间,p在栈区。p会指向堆区中的一块空间,而这块空间就是由Student创建的。Person p,是在说明指针p的类型是Person类型。那么p就可以指向Person及其所有子类的对象。p调用方法的时候,能调用到Person中声明的方法。但是,并不是说Student中的方法调用不到,因为在继承的时候可以对方法重写。所以如果Student中重写了Person中的方法,那么p就会调用到Student中的方法。但是Student中的方法是独有的方法,那么用Person是调用不到的。
童音婼幻Ds
2012-03-18 · TA获得超过334个赞
知道小有建树答主
回答量:389
采纳率:100%
帮助的人:142万
展开全部
这是基本的使用
class Base {
String var = "BaseVar"; // 实例变量

static String staticVar = "StaticBaseVar"; // 静态变量

void method() { // 实例方法
System.out.println("Base method");
}

static void staticMethod() { // 静态方法
System.out.println("Static Base method");
}
}

public class Sub extends Base {
String var = "SubVar"; // 实例变量

static String staticVar = "StaticSubVar"; // 静态变量

void method() { // 覆盖父类的method()方法
System.out.println("Sub method");
}

static void staticMethod() { // 隐藏父类的staticMethod()方法
System.out.println("Static Sub method");
}

String subVar = "Var only belonging to Sub";

void subMethod() {
System.out.println("Method only belonging to Sub");
}

public static void main(String args[]) {
Base who = new Sub(); // who被声明为Base类型,引用Sub实例
System.out.println("who.var=" + who.var); // 打印Base类的var变量
System.out.println("who.staticVar=" + who.staticVar); // 打印Base类的staticVar变量
who.method(); // 打印Sub实例的method()方法
who.staticMethod(); // 打印Base类的staticMethod()方法
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
kuship2010
2012-03-18
知道答主
回答量:19
采纳率:0%
帮助的人:15.9万
展开全部
抽象类 变量名=new 类名()l;
接口 变量名=new 类名()l;
这两个是不能定义的。。。抽象类不能够实例化对象。
后面的是多态的定义方式。。你可以查一下。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
panxinxyyg
2012-03-18 · TA获得超过115个赞
知道小有建树答主
回答量:129
采纳率:0%
帮助的人:105万
展开全部
父类名 变量名=new 子类名()
例如 ;一家有一对儿女,别人家要取他女儿,找她父亲问女儿。别人家要嫁他儿子,找他父亲问他儿子。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
charmingpp1
2012-03-18 · 超过23用户采纳过TA的回答
知道答主
回答量:71
采纳率:0%
帮助的人:56.7万
展开全部
这是java多态性的体现,使用父类名 变量名=new 子类名(),这样父类的引用指向子类对象可以使用子类中新定义的方法,也可以使用父类自己原有的方法。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
追忆XYZ
2012-03-18 · 超过10用户采纳过TA的回答
知道答主
回答量:82
采纳率:0%
帮助的人:45.5万
展开全部
上面已经涉及到技巧性的问题了。使用得多了自然会发现其中有什么不同。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式