Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否可以直接从main修改类的私有成员?_Java - Fatal编程技术网

Java 是否可以直接从main修改类的私有成员?

Java 是否可以直接从main修改类的私有成员?,java,Java,我已经创建了一个堆栈的私有类成员,不知道如何直接或间接地从main方法访问它,尽管我没有为它使用任何对象。当程序执行排序方法时,它直接自动修改私有成员“stk[]” 当从main方法调用排序选项时,这是从main方法间接修改私有字符串stk[]的代码: import java.io.*; class Stack { private String stk[]; private int tos; private int size; Stack() { siz

我已经创建了一个堆栈的私有类成员,不知道如何直接或间接地从main方法访问它,尽管我没有为它使用任何对象。当程序执行排序方法时,它直接自动修改私有成员“stk[]”

当从main方法调用排序选项时,这是从main方法间接修改私有字符串stk[]的代码:

import java.io.*;
class Stack
{
   private String stk[];
   private int tos;
   private int size;
   Stack()
   {
      size=5;
      stk=new String[size];
      tos=-1;
   }
   Stack(int sz)
   {
      size=sz;
      stk=new String[size];
      tos=-1;
   }
   boolean push(String s)
   {
      if(tos==size-1) return false;
      stk[++tos]=s;
      return true;
   }
   String pop()
   {
      if(tos<0) return "Stack Underflow";
      return stk[tos--];
   }
   String[] display()//array type function to return an array called "stk"
   {
      return stk;
   }
   int returnSize()
   {
      return tos;
   }
}
class myStack
{
   public static void main(String args[]) throws IOException
   {
      BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
      Stack S=new Stack();
      int opt=-1;
      while(opt!=6)
      {
         System.out.println("\n\n\n");
         System.out.println("[1] - Create Stack");
         System.out.println("[2] - Push");
         System.out.println("[3] - Pop");
         System.out.println("[4] - Display");
         System.out.println("[5] - Display List In Ascending Order");
         System.out.println("[6] - Exit");
         System.out.print("Option: ");
         opt=Integer.parseInt(br.readLine());
         if(opt==1)
         {
            System.out.print("\n\nEnter the size of stack: ");
            int size=Integer.parseInt(br.readLine());
            S=new Stack(size);
            System.out.print("\nStack Created...");
         }
         else if(opt==2)
         {
            System.out.print("\n\nEnter String: ");
            String s=br.readLine();
            if(S.push(s))
               System.out.print("\nSuccessfull...");
            else
               System.out.print("\nStack Overflow...");
         }
         else if(opt==3)
         {
            System.out.print("\nItem Deleted: "+S.pop());
         }
         else if(opt==4)
         {
            int sz=S.returnSize();
            System.out.print("\n\n\nStack Contains: "+(sz+1)+" Item(s)\n");
            String st[]=S.display();
            while(sz>=0)
            {
               System.out.println(st[sz]);
               sz--;
            }
         }
         else if(opt==5)
         {
            int s=S.returnSize();
            String stc[]=S.display();
            for(int i=0;i<=s;i++)
            {
               for(int j=i+1;j<=s;j++)
               {
                  if(stc[j].compareTo(stc[i])<0)
                  {
                     String t=stc[i];
                     stc[i]=stc[j];
                     stc[j]=t;
                  }
               }
               System.out.println(stc[i]);
            }
         }
         else if(opt>6)
         {
            System.out.print("\nPress 6 To Exit....");
         }
      }
   }
}
import java.io.*;
类堆栈
{
私有字符串stk[];
私人int tos;
私有整数大小;
堆栈()
{
尺寸=5;
stk=新字符串[大小];
tos=-1;
}
堆栈(int sz)
{
尺寸=sz;
stk=新字符串[大小];
tos=-1;
}
布尔推送(字符串s)
{
if(tos==size-1)返回false;
stk[++tos]=s;
返回true;
}
字符串pop()
{
如果(tos=0)
{
System.out.println(st[sz]);
sz--;
}
}
否则如果(opt==5)
{
int s=s.returnSize();
字符串stc[]=S.display();
对于(inti=0;i我想这就是你所说的

String stc[]=S.display();

for(int i=0;iPrivate意味着即使在main中,也不能在类外访问它,我认为如果您的成员是私有的,并且您希望在外部访问它们,这是不好的做法,那么如果它们是私有的,为什么要在外部访问它们。请将其公开,请参见下文

public class Stack
{
}

private就是这个意思。该值在它所属的类之外是不可见的


您可以通过反射来更改它,但不应该。如果成员所属的是您的类,则编写一个公共方法来获取/更改变量。如果不是您的类,则该值不应直接可见/更改。更改此值(使用relection)风险自负。

在这种情况下,重要的是要在两者之间做出区别

不可变对象在创建后无法更改

例如:

String s = “foo”;
List<Integer> l = new List<Integer>();
String[] display() {
    Arrays.copyOf(stk, stk.length);
}
无法更改变量
s
引用的字符串对象。该对象将始终包含数据“foo”。如果更改
s.concat(“bar”);
,由
s
引用的字符串对象不会更改。相反,方法调用将返回一个全新的字符串对象,它是“foo”和“bar”的串联

可变对象可以更改

例如:

String s = “foo”;
List<Integer> l = new List<Integer>();
String[] display() {
    Arrays.copyOf(stk, stk.length);
}

这样,在使用返回引用的客户机代码中执行的任何更改都只会影响复制的对象,并且您的私有数组对象将保持完整。

这是可能的-通过反射-但为什么不将字段设置为受保护或公共?太多不相关的代码-请将其归结为基本部分。此外,还不清楚实际的问题是什么。您也可以一直使用
switch
语句而不是
if-else
。如果main方法与您的私有变量在同一类中,也有可能。