Java 从不同类中/在不同类中访问方法,newb

Java 从不同类中/在不同类中访问方法,newb,java,access-modifiers,Java,Access Modifiers,我对java还是相当陌生的,所以请容忍我 我很难理解为什么我只能从某些类/位置/访问属于对象实例的某些方法/函数。一旦我创建了一个对象的实例,然后按下点“.”操作符,它就不会显示我想要用于它的所有方法(我想看到objects类继承和实现的所有方法) 例如: // In a junit test class, I make an instance of the class DailyLog which takes 2 // integers private Dail

我对java还是相当陌生的,所以请容忍我

我很难理解为什么我只能从某些类/位置/访问属于对象实例的某些方法/函数。一旦我创建了一个对象的实例,然后按下点“.”操作符,它就不会显示我想要用于它的所有方法(我想看到objects类继承和实现的所有方法)

例如:

    // In a junit test class, I make an instance of the class DailyLog which takes 2 
    // integers   
    private DailyLog log; // which seems fine for now, but when I add on the next
    // line:                         
    log = new DailyLog (5,500); // It gives me an error on the semicolon on the line 
    // above  saying "-  Syntax error on token ";", , expected"
我不明白为什么它不让我创建DailyLog实例并设置它的参数

问题2:如果我只保留第一行代码,然后在同一类中的方法内设置log的参数,它允许我设置它的参数,但当我按下“.”运算符时,它不会显示我要使用的大小函数。-我以为它会继承超类的大小,所以为什么它不让我使用它呢

问题3:我在dailyLog类中有一个名为variance的方法,另一个名为numInsertions,我需要在variance方法中使用numInsertions方法,但是当我在下面写的时候,我能找到numInsertions方法的唯一方法是通过另一个方法,这将不起作用,因为我需要访问numInsertions方法来直接将它的值赋给b,而不是通过另一个方法,因为这将改变它的值

      public Integer variance() throws SimulationException{
          Integer a = log.    
我认为这可能与作用域有关,当我有另一个类创建dailyLog实例时,当我在上面按“.运算符时,它给出了daulyLog类及其超类中的一些方法,但不是所有方法。我发现这相当混乱,希望能得到帮助,谢谢

更新**

也许在这里添加更多代码将有助于说明我的问题:

public class dailyLog implements Log{

private Integer userLogSize1;
private Integer maxEnt;
private ArrayList<Integer> log = new ArrayList<Integer>();

public dailyLog (Integer userLogSize, Integer maxEntry) throws SimulationException{
    if ((userLogSize<= 0 || maxEntry <= 0)){
        throw new SimulationException("message goes here");}
        this.log = new ArrayList<Integer>(userLogSize);
        for (Integer i = 0; i <= userLogSize; i++){
            log.add(null);}
        userLogSize1= userLogSize;
        maxEnt = maxEntry;
    }

public Integer numInsertions(){
       Integer total = 0;
    for (Integer i = 0; i < log.size(); i++){           
         if (log.get(i) != null){
            total++;}}
    return total;}

//  *** below I want to write log.numentries but i cannot, why it this? I can only write
// log.get(numentries()) but that gives the wrong answer.


public Integer variance() throws SimulationException{
    if (log.size() == 0){
        throw new SimulationException ("Put message here");}
    Integer a = log.get(0);
    Integer b;
    Integer d = log.get(1);
    if (d == null){
        b = log.get(numInsertions()-1);}        
    else {b = log.get(numInsertions()-2);}
    Integer c = log.get(userLogSize1-1);
    if ( c == null){
        return a - b;}
        return a-c;}
}
公共类dailyLog实现日志{
私有整数userLogSize1;
私有整数最大值;
private ArrayList log=new ArrayList();
PublicDailyLog(Integer userLogSize,Integer maxEntry)抛出SimulationException{

如果((userLogSize我认为您在Java中看到了不同的保护级别。对于一个类的成员和方法,通常有四个保护级别:
private、public、protected、package private
。如果一个方法或对象的前缀中没有一个关键字
private、public、protected
,则默认情况下是
>软件包专用

私有的方法或类成员只能在声明它的同一个类中引用

public
的方法或类成员只能从任何包中的任何类引用

受保护的方法或类成员只能从同一类和子类引用

包私有的方法或类成员只能从同一个包中引用。如果您使用
默认的
包进行开发(即,您没有声明包),那么您的代码通常会像对待
public
一样对待包private,因为所有类都默认为默认包


这是一个和这是一个,它用较少的文字解释了相同的想法。

如果您试图将一个方法从一个类传递到另一个类,并且您不想使其成为静态的,这意味着它将在所有实例中共享,那么您可以在不同的类中创建该类的新实例。例如,假设您有classa和classB

public class A {
private int a;
private void setA(int a) {
    this.a = d;
B类:

public class B {
private int b;
private void setB(int b) {
    this.b = b;
因此,我可以通过调用构造函数来调用类A的所有方法:

public class B {
///Constructor line
private A a = new A();
A.setA(10);
System.out.println(A.a);   ///should print 10

您需要了解修饰符(即私有、公共、受保护和包级别)。类的每个字段和类的方法(静态和非静态)都有一个修饰符。如果您不指定一个,那么它就是“包级别”。您不在代码块(例如方法体)内指定修饰符因为假设这些变量的作用域是内部块。下面是块作用域的一个简单示例,在Java中是合法的:

public int foo(){
    {
        int max = 0;
        for(int i = 0; i < 10; ++i)
            if(i > max)
                max = i;
    }
    final int max = -10;
    return max;
}
public int foo(){
{
int max=0;
对于(int i=0;i<10;++i)
如果(i>max)
max=i;
}
最终整数最大值=-10;
返回最大值;
}
简而言之,您有以下几点(请注意,构造函数将被视为以下方法):

  • public:任何东西都可以访问此方法或字段。对于字段,这意味着任何类都可以设置此字段,除非它声明为final。但您应该非常清楚,即使是声明为final的对象也可以修改(例如数组或任何其他可变对象)。对于方法,这只是意味着任何类都可以调用此方法
  • private:只有此类可以访问此字段或方法。这意味着您可以修改这些字段或调用这些方法的唯一位置是在此类文件中。此类的实例可以从此类的另一个实例访问字段(通过这个类的主体中编写的引用这个类的其他对象实例的方法)
  • 受保护的:与此类在同一包中的任何类或此类的子类(可以在单独的包中)都可以直接访问受保护的字段或方法
  • 包级别:要指定包级别访问权限,您根本不指定任何修饰符(即public、private或protected…nothing)。在这种情况下,此包中的任何类都可以访问此字段或方法
更好的问题是什么时候应该使用哪种方法?作为一般规则,大多数方法应该是公共的,大多数字段应该是私有的。你应该对那些声称这些东西是为了“安全”的人感到非常厌倦“。确保对象数据完整性的唯一方法是只返回基本值或不可变对象或可变对象的副本。举个简单的例子,假设您实现了