【问题标题】:Is using void mandatory for methods which don't return something?对不返回某些内容的方法是否强制使用 void?
【发布时间】:2017-06-01 09:04:53
【问题描述】:

我在某处看到了这段代码:

public class MyDatabaseHelper extends SQLiteOpenHelper {

    private static final String DATABASE_NAME = "DBName";

    private static final int DATABASE_VERSION = 2;

    // Database creation sql statement
    private static final String DATABASE_CREATE = "create table MyEmployees
                                 ( _id integer primary key,name text not null);";

    public MyDatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    // Method is called during creation of the database
    @Override
    public void onCreate(SQLiteDatabase database) {
        database.execSQL(DATABASE_CREATE);
    }

    // Method is called during an upgrade of the database,
    @Override
    public void onUpgrade(SQLiteDatabase database,int oldVersion,int newVersion){
        Log.w(MyDatabaseHelper.class.getName(),
                         "Upgrading database from version " + oldVersion + " to "
                         + newVersion + ", which will destroy all old data");
        database.execSQL("DROP TABLE IF EXISTS MyEmployees");
        onCreate(database);
    }
}

如您所见,MyDatabaseHelper 方法不返回任何内容(不返回任何内容)。那么为什么作者没有使用void呢?

【问题讨论】:

  • 它被称为构造函数,用于初始化对象(在这种情况下,您希望使用Context 初始化数据库助手)。见docs.oracle.com/javase/tutorial/java/javaOO/constructors.html
  • @nbokmans 啊,我明白了。你能告诉我这个public long createRecords(String id, String name){ 中的long是什么吗?是函数返回的类型吗?
  • 在这种情况下,long 是方法的返回类型是。该资源更好地解释了fields、methods 和constructors 之间的区别:docs.oracle.com/javase/tutorial/java/javaOO/classes.html
  • long 是一种通常用于整数的数据类型,当它们可能增长到超过 int 可以容纳的数量时(最多大约 20 亿(或两亿,正如我在学校学到的那样) )。这是基本的 Java 知识,您可能在教科书或教程中找到它比在 SO 上更快。

标签: java android database function methods


【解决方案1】:

它称为构造函数,用于在创建对象时初始化对象(在这种情况下,您希望使用Context 初始化数据库助手)。见https://docs.oracle.com/javase/tutorial/java/javaOO/constructors.html

一个更好的例子来帮助你理解构造函数:

public class Person {

    public String name;
    public int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return String.format("My name is %s and I am %d years old", name, age);
    }
}


public class Main {
    public static void main(String[] args) {
        Person me = new Person("Niels", 20);
        System.out.println(me);
    }
}

当您执行上述代码时,您会在控制台中看到一条消息,上面写着My name is Niels and I am 20 years old。

如您所见,我们创建了一个带有name 和age 参数的Person 对象。

【讨论】:

  • 您在一个没有从任何其他类扩展的类中使用了@Override .. 我认为这是不可能的。我说的对吗?
  • 没有。您创建的每个类都隐式扩展了java.lang.Object 类,它提供了一些方法,例如toString 和hashCode。根据文档:“类 Object 是类层次结构的根。每个类都有 Object 作为超类。所有对象,包括数组,都实现了这个类的方法。”。见docs.oracle.com/javase/8/docs/api/java/lang/Object.html
  • 您创建的每个类都隐式扩展了 java.lang.Object 类 .. 即使是那些没有 extends 任何东西的类?
  • 是的。这就是我含蓄地说的原因。 :P
  • 哦,糟糕,我在一个地方更改了变量名,但在另一个地方没有。我的错!确实应该是me。
【解决方案2】:

该方法称为构造函数。它与所在的类同名,并在实例化类时调用new。它实际上并没有返回 void;它返回它正在实例化的类的实例。

班级:

public class MyClass {
    public MyClass() {
        // do something, notice the constructor has the name of the class
    }
}

使用类:

    MyClass theInstance = new MyClass();

如果您想了解更多信息,请参阅其他答案中的链接。

【讨论】:

    【解决方案3】:

    因为它是一个类构造函数!

    只有类的构造函数是没有任何返回类型的方法。其余所有方法都应该有它们的返回类型。

    注意:可能有多个构造函数(默认和不同参数的构造函数)。

    【讨论】:

      【解决方案4】:

      因为那是一个类构造函数!

      “当对象被创建时,Java首先调用构造函数。你在构造函数中的任何代码都会被执行。你不需要对构造函数方法进行任何特殊的调用——当你创建一个对象时它们会自动发生新对象。构造方法与类同名。"

      “如果你的方法重写了它的超类的方法之一(在这种情况下是 SQLiteOpenHelper),你可以通过使用关键字 super(在这种情况下它自己的构造函数)来调用被重写的方法。考虑这个类,超类:”

      【讨论】:

        猜你喜欢
        • 2011-12-05
        • 2019-06-29
        • 1970-01-01
        • 2014-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-03
        • 1970-01-01
        相关资源
        最近更新 更多