你可以在公共课外使用Scanner吗?你会把单独的班级放在哪里相对于公共班?

时间:2017-08-18 18:34:56

标签: java class oop

我正在使用面向对象编程的程序中的单独类。警告:我是OOP的HORRID,所以如果我的问题是愚蠢和荒谬的,请告诉我,或者,如果你知道我的意思,请为我编辑我的帖子。

  1. 您是否会在单独的.java文件或相同的*?
  2. 中创建单独的类和程序本身

    *相同,如

    public class filename
    {
    // ... content
    }
    
    class name
    {
    
    }
    
    1. 您可以在单独的类中使用Scanner,还是应该在main()方法中使用它?如果是这样,怎么样?

    2. 假设您必须在main()方法中使用Scanner,并声明了一个新的变量输入并将其初始化为Scanner输入。您如何将其设置为单独类中的变量之一?你会做一个新的对象吗?

    3. 示例:

      public class TestSimpleCircle {
          public static void main(String[] args {
          SimpleCircle circle1 = new SimpleCircle();
          System.out.println("The area of the circle of radius " + circle1.radius + " is "  + circle1.getArea());
      
          // Create a circle with radius 25
          SimpleCircle circle2 = new SimpleCircle(25);        System.out.println("The area of the circle of radius " + circle2.radius + " is " + circle2.getArea());
      
          // Create a circle with radius 125
          SimpleCircle circle3 = new SimpleCircle(125);       System.out.println("The area of the circle of radius " + circle3.radius + " is " + circle3.getArea());
      
          // Modify circle radius
          circle2.radius = 100; // or circle2.setRadius(100)  System.out.println("The area of the circle of radius " + circle2.radius + " is " + circle2.getArea());
      
          }
      }
      
      class SimpleCircle {
          double radius;
      
          SimpleCircle() {
              radius = 1;
          }
      
          SimpleCircle(double newRadius) {
              radius = newRadius;
          }
      
          double getArea() {
              return radius * radius * Math.PI;
          }
      
          double getPerimeter() {
              return 2 * radius * Math.PI;
          }
      
          void setRadius(double newRadius) {
              radius = newRadius;
          }
      }
      

      ......那个(例如circle1.getArea())?

      1. 在单独的类中创建变量时,它们是否以任何方式连接到main()方法中具有相同名称的变量或其他类?

4 个答案:

答案 0 :(得分:2)

  

您是否可以单独创建单独的类和程序本身   .java文件或相同*?

Every class in Java should be in its own file但您可以在一个文件中创建多个类。例如

class A{
    public A(){
        System.out.println("A created");
    }
}

public class Main {
    public static void main(String[] args) {
        A x = new A();
    }
}
  

您可以在单独的课程中使用Scanner,还是应该使用它?   main()方法?如果是这样,怎么样?

取决于您的申请。许多人更愿意尽可能地进行组织和分离,因此最重要的建议是在自己的班级中进行组织和分离。但是对于非常简单的示例和应用程序,我只是将它放在main()方法中,或者如果我在任何方法中只使用一次。 Scanner本身就是一个类,所以如果你创建另一个类只是为了单独包装它,它根本就不值得。

您可以将Scanner创建为任何类的成员变量,如果有一些方法可以使用它,请使用它。

这些只是一些想法,完全取决于您的设计,应用行为和个人推荐

至于如何,这是一个例子

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter a number");
        int number = sc.nextInt();
        System.out.println("You entered number " + number);
    }
}
  

假设您必须在main()方法中使用Scanner,并声明了   新变量输入并将其初始化为扫描仪输入。怎么会   你将其设置为单独类中的变量之一?你会   制作一个新对象并做...

是的我会创建该类的新对象并使用输入值初始化其成员。或者我将Scanner放在类中,询问使用没有参数的构造函数创建的每个对象的半径。关于它们中的任何一种,有许多不同的方法,没有对错。尽可能避免重复和依赖。

这是您编写的代码,例如

import java.util.Scanner;

public class TestSimpleCircle {
    public static void main(String[] args) {

        System.out.println("Enter radius of your choice please");
        Scanner sc = new Scanner(System.in);

        SimpleCircle circle1 = new SimpleCircle(sc.nextInt()); // taking the radius as input

        System.out.println("The area of the circle of radius " + circle1.radius + " is " + circle1.getArea());

        // Create a circle with radius 25
        SimpleCircle circle2 = new SimpleCircle(25);
        System.out.println("The area of the circle of radius " + circle2.radius + " is " + circle2.getArea());

        // Create a circle with radius 125
        SimpleCircle circle3 = new SimpleCircle(125);
        System.out.println("The area of the circle of radius " + circle3.radius + " is " + circle3.getArea());

        // Modify circle radius
        circle2.radius = 100;
        System.out.println("The area of the circle of radius " + circle2.radius + " is " + circle2.getArea());

    }
}

class SimpleCircle {
    double radius;

    SimpleCircle() {
        radius = 1;
    }

    SimpleCircle(double newRadius) {
        radius = newRadius;
    }

    double getArea() {
        return radius * radius * Math.PI;
    }

    double getPerimeter() {
        return 2 * radius * Math.PI;
    }

    void setRadius(double newRadius) {
        radius = newRadius;
    }
}

答案 1 :(得分:1)

扫描仪就像任何其他对象一样,可以通过引用传递到另一个方法/类中并仍然可以使用。

可以创建并使用扫描仪类的不同实例。

您可以在您需要的任何类中使用Scanner。如果您创建了该对象的新实例,它将不会与另一个实例连接。这个问题不是特定于Scanner,而是一般的java对象。

答案 2 :(得分:1)

第一个问题。是的,你可以在同一个java文件中创建不同的类, 在编译java文件之后,将为您定义的每个类创建单独的.class文件。

我想提一下,你可以保存你的java文件的任何名称然后编译它。但如果任何类被声明为public(如上例公共类文件名)那么java文件应该与公共类的名称相同。

没有这样做。你会得到编译时错误说:  类文件名是公共的,应在名为 filename 的文件中声明。

希望这对你有所帮助......

答案 3 :(得分:0)

一个班级 - 一个档案。没有例外。这将为将来维护产品节省大量时间。

class SimpleCircle {
    // be private - accessible only inside class
    // be final - assign only in constructor
    private final double radius;

    SimpleCircle(double newRadius) {
        radius = newRadius;
    }

    double area() {
        return radius * radius * Math.PI;
    }

    double perimeter() {
        return 2 * radius * Math.PI;
    }
}

尝试避免使用无用的赋值的构造函数(如果您使用没有参数的构造函数,则默认为radius=1)。尽量避免通过setter更改类状态。使用新状态(半径)创建新对象。

尝试调用反映返回实体的方法名词

尝试命名反映对象行为的void方法动词。

现在关于Scanner。

尝试使用这个想法/模板

public class MyClass {
    private final Scanner scanner;

    public MyClass(Scanner scanner) {
        this.scanner = scanner;
    }

    public void any_work() {
        ...
        int readed = scanner.nextInt();
        ...
    }
}

public class Main {
    public static void main(String[] args) {
        ...
        MyClass myClass = new MyClass(new Scanner(System.in));
        ...
        myClass.any_work();
        ...
    }
}
  

当您在单独的类中创建变量时,它们是否以任何方式   连接到main()方法中具有相同名称的变量或a   不同的班级?

只有一种方式。通过方法或构造函数参数。请使用Main / MyClass查看以前的代码。