什么是常见做法?类型放置

时间:2015-07-31 08:31:44

标签: java methods types

你愿意:

  • 在main方法上方添加类型,然后在方法

    下初始化它们
    public class Main {
        private Person person;
        public void method() {
             person = new Person("Bob", 30);
    
  • 在主方法上方添加类型并初始化它们

    public class Main {
        private Person person = new Person("Bob", 30);
        public static void main(String[] args) {
    
  • 在main方法下添加类型并初始化它们

    public class Main {
        public static void main(String[] args) {
            Person person = new Person("Bob", 30);
    

我想知道你何时会使用哪种方式以及为什么。 我很感激任何意见!

3 个答案:

答案 0 :(得分:1)

a)方法中不允许#!/usr/bin/env python3 # -*- coding: utf-8 -*- import logging import sys class LessThenFilter(logging.Filter): def __init__(self, level): self._level = level logging.Filter.__init__(self) def filter(self, rec): return rec.levelno < self._level log = logging.getLogger() log.setLevel(logging.NOTSET) sh_out = logging.StreamHandler(stream=sys.stdout) sh_out.setLevel(logging.DEBUG) sh_out.setFormatter(logging.Formatter('%(levelname)s: %(message)s')) sh_out.addFilter(LessThenFilter(logging.WARNING)) log.addHandler(sh_out) sh_err = logging.StreamHandler(stream=sys.stderr) sh_err.setLevel(logging.WARNING) sh_err.setFormatter(logging.Formatter('%(levelname)s: %(message)s')) log.addHandler(sh_err) logging.critical('x') logging.error('x') logging.warning('x') logging.info('x') logging.debug('x') 修饰符,因此您的第三个示例甚至不会编译。

b)只有你的第二个例子才真正编译。第一个有一个“Main”类的非静态成员,你试着直接在静态方法中设置它。

c)例子并不相同。第三个在方法中有一个局部变量(假设我们忽略private修饰符),另外两个有一个成员变量“Main”。

a&amp; b与c取决于您需要变量的位置。如果你只需要在方法中使用它,请在那里声明它。

a vs. b主要取决于可读性和用例。如果你可以在那里初始化你的变量,如果它不会导致不可读的代码,那就去做吧。否则,在构造函数或任何init方法中执行此操作。

就个人而言,我倾向于直接声明最终对象,非最终对象可以在其他地方初始化(因为直接声明它们使得它看起来非常最终,即使它们不是)。

答案 1 :(得分:1)

这不是常见问题,因为你给出的三个例子实际上有不同的含义。因此,更多的是理解变量声明。

变量声明声明了您需要使用的变量的名称,类型和可选项。

String s    = "abc";
↑      ↑    ↑
type   name initializer

现在看一下类定义:

class A {
   // Class body scope
}

在类型体(类,接口,枚举)中声明的所有内容都是该类型的成员。成员包括字段,方法和嵌套类。此范围中的变量声明(在任何方法之外)是 fields ,它们可以是实例字段静态字段。如果它们具有修饰符static,则它们由类的所有成员共享,实际上可以在没有此类的实际实例的情况下使用。如果他们没有那个修饰符,那么它们就是实例字段。

如果没有实际实例,则无法使用实例字段。因此,它们不适用于main等静态方法,仅适用于实例方法。因此,您的第一个示例将无效 - main正在尝试在实例字段中放置一个值(因为它没有单词static)。

在第二个示例中,您仍在创建实例字段,但这次您给它一个初始值。这很好 - 但您仍然无法从main访问此信息。这只是一个将在您将创建的每个新Main对象中单独存在的字段(如果您创建一个)。

在第三个示例中,您将在方法内创建变量。在这种情况下,变量不是字段。它是本地变量。因此,它不能具有访问修饰符,例如privatepublic,因为局部变量只能在声明它们的方法中访问(事实上,在里面他们被宣布。)

但是如果您删除了访问修饰符,这将有效,并且您将能够在main中使用它,但不能在main之外使用。

通常,是否为变量赋予初始值设定项或稍后赋值给它的问题取决于它是字段还是局部变量,是否为finalstatic,以及创建它时是否有一个有意义的值。对于局部变量,建议:

  • 宣布它尽可能接近使用的位置。
  • 只要给出有意义的值,就给它一个值。

在实践中,这意味着大多数时候你会在局部变量声明中有一个初始化器,如果只是为了避免讨厌的“变量可能没有被初始化”编译器警告。

对于字段,特别是如果它们被声明为final,您将需要尽快初始化它们,但不一定要使用初始化程序。您可以在构造函数(对于实例字段)或初始化块中执行此操作(对于其值需要由复杂操作确定的静态字段)。

答案 2 :(得分:0)

如果您需要变量'person'的唯一地方是您的Main方法,您应该像在第三个示例中那样声明并初始化'person'。

如果您需要其他地方,我会说您可以做任何您想做的事情,但不要在这些之间切换以使您的代码可读。