请教两个java初级问题

[复制链接]
查看11 | 回复6 | 2005-10-30 17:05:33 | 显示全部楼层 |阅读模式
1。为什么要使用private instance method
2。如下代码
public class demo
{
public String w()
{ return "ok"; }
public static void main(String args[])
{

demo d=new demo();

ArrayList v=new ArrayList();
v.add(d);
System.out.println(v.get(0).toString());//编译通过
System.out.println(v.get(0).w()); //编译无法通过
}
请问有什么区别?谢谢
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
1、使用private方法的目的主要有两个:一、减少该类时的复杂度,主要是减少方法的数量;二、隐藏该功能的实现,当修改private方法中的算法实现的时候,对别的代码不产生影响。
2、因为v.get(0)返回的类型是Object类型,该类型中没有方法名为w的方法。
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
谢谢网络咖啡的回答,
对于第二个问题,demo类中有w的方法呀?
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
1.
Java语言定义了public、protected、private、abstract、static和final这6常用修饰
词外还定义了5个不太常用的修饰词,下面是对这11个Java修饰词的介绍:
1.public
使用对象:类、接口、成员
介绍:无论它所处在的包定义在哪,该类(接口、成员)都是可访问的
2.private
使用对象:成员
介绍:成员只可以在定义它的类中被访问
3.static
使用对象:类、方法、字段、初始化函数
介绍:成名为static的内部类是一个顶级类,它和包含类的成员是不相关的。静态方法
是类方法,是被指向到所属的类而不是类的实例。静态字段是类字段,无论该字段所在的类创建了
多少实例,该字段只存在一个实例被指向到所属的类而不是类的实例。初始化函数是在装载类时执行的,而不是在创建实例时执行的。
4.final
使用对象:类、方法、字段、变量
介绍:被定义成final的类不允许出现子类,不能被覆盖(不应用于动态查询),字段值
不允许被修改。
5.abstract
使用对象:类、接口、方法
介绍:类中包括没有实现的方法,不能被实例化。如果是一个abstract方法,则方法体
为空,该方法的实现在子类中被定义,并且包含一个abstract方法的类必须是一个abstract类
6.protected
使用对象:成员
介绍:成员只能在定义它的包中被访问,如果在其他包中被访问,则实现这个方法的类必须是该成
员所属类的子类。
7.native
使用对象:成员
介绍:与操作平台相关,定义时并不定义其方法,方法的实现被一个外部的库实现。
8.strictfp
使用对象:类、方法
介绍:strictfp修饰的类中所有的方法都隐藏了strictfp修饰词,方法执行的所有浮点计算遵守IEEE 754标准,所有取值包括中间的结果都必须表示为float或double类型,而不能利用由本地平台浮点格式或硬件提供的额外精度或表示范围。
9.synchronized
使用对象:方法
介绍:对于一个静态的方法,在执行之前jvm把它所在的类锁定;对于一个非静态类的方法,执行前把某个特定对象实例锁定。
10.volatile
使用对象:字段
介绍:因为异步线程可以访问字段,所以有些优化操作是一定不能作用在字段上的。volatile有时
可以代替synchronized。
11.transient
使用对象:字段
介绍:字段不是对象持久状态的一部分,不应该把字段和对象一起串起。
引用地址: http://java.xnuo.com/track.1124532909043786.html

对于你提出的第一个问题,因为没有上下文说明,我也不知道为什么你必须用private,你可以看看private修饰符的使用范围,如果你不想类里的方法或对象被别的类或对象使用或修改,那么就使用private。
2.
import java.util.ArrayList;
public class Demo {

String w(){

return "ok";

}

public static void main(String args[]){



Demo d=new Demo();

ArrayList v=new ArrayList();

v.add(d);

System.out.println(v.get(0).toString()); //编译通过

System.out.println(v.get(0).toString()+""+d.w()); //编译无法通过

}
}
复制代码
修改了你给出的代码,因为你那样写是错的,所以无法编译通过,至于为什么要这么改,首先你的w()方法是自己写的,所以应该拿到main方法外面,而不是在main方法里。其次,正因为w()方法是Demo类的一个方法,所以需要通过Demo的一个实例化对象d来访问,所以d.w()是能够正确使用。
再有类名Demo首字母最好大写,即demo --> Demo,多看看基础书吧!
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
呵呵,谢谢Dennis68cn
其实这两个题是别人考试时碰到的,我不清楚正确答案是什么,所以拿来问问
对于1,实在不知道在考哪方面知识
对于2,我也感觉是class的实例化对象问题,我作了一个试验,如果程序改为
System.out.println(d.w())//编译通过,程序输出Ok
原来程序中System.out.println(v.get(0) 不就得到d吗,那为什么System.out.println(v.get(0).w())就不行呢?
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
还有人对这个问题有解释吗
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
网络咖啡解释已经非常清楚了,请自己多动动脑。
v.get(0)返回的是Object对象,此对象并没有你自定义class demo中的方法w(),所以v.get(0).w()是不正确的。
至于你后贴中的 System.out.println(d.w()) 输出正确,更是不可理喻,犯的错误就不细说了,自己稍加考虑就能明白。
正确作法((demo)v.get(0)).w();
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行