如何使用 "this" 关键字在 class 中调用具有超过 1 个参数的多个构造?
How to use "this" keyword to invoke multiple constructs with more than 1 arguments in the class?
我正在研究 this() 关键字来调用构造函数。我非常确定它用于调用当前 class 的其他构造函数的简单机制:
public class AsCaller {
String name;
int id;
AsCaller() {
System.out.println("No arguments");
}
AsCaller(String n, int i) {
this();
name = n;
id = i;
}
void display() {
System.out.println(id + " " +name);
}
public static void main(String[] args) {
AsCaller example1 = new AsCaller("Student", 876);
example1.display();
}
}
正如预期的那样,它给出了输出:
No arguments
876 Student
但是,如果我们有超过 2 个构造函数并且其中一些有 2 个或更多参数怎么办? this() 关键字将如何用于调用其中之一?喜欢:
public class AsCaller {
String name;
int id;
AsCaller(String city, String street, float house) {
System.out.println("float datatype invoked");
}
AsCaller(int age, int marks) {
System.out.println("int datatype invoked");
}
AsCaller(String n, int i) {
// How to use this() keyword to invoke any of the above constructor?.
this();
name = n;
id = i;
}
AsCaller() {
System.out.println("No arguments");
}
void display() {
System.out.println(id + " " +name);
}
public static void main(String[] args) {
AsCaller example1 = new AsCaller("Student", 876);
example1.display();
}
}
你可以这样做:
AsCaller(String n, int i) {
// How to use this() keyword to call any of the above constructor?.
this(1,i);// calls the AsCaller(int age, int marks) constructor
name = n;
id = i;
}
以类似的方式,您需要将参数传递给 this(..) 以匹配您要调用的构造函数的参数序列。
简单:
this(age, marks);
传递与您要调用的构造函数匹配的参数。
我认为从一个构造函数中调用两个构造函数没有意义。 class 编码者选择提供的构造函数类型是 设计选择 并且可以这样设计,这样您就不需要从一个构造函数调用两个构造函数。
我认为 Java 允许您从构造函数调用一个构造函数的原因是因为默认构造函数可能会执行一些默认初始化,例如打开套接字、分配内存等,这些可能在构造函数中很常见。
您可以按如下方式重写代码,这样您就不必从一个构造函数调用两个构造函数,尽管功能得以保留。
public class AsCaller {
String name;
int id;
void intinit(int age, int marks){
System.out.println("int datatype invoked");
}
void floatinit(String city, String street, float house){
System.out.println("float datatype invoked");
}
AsCaller(String city, String street, float house) {
floatinit(city,street,house);
}
AsCaller(int age, int marks) {
intinit(age,marks);
}
AsCaller(String n, int i) {
// How to use this() keyword to invoke any of the above constructor?.
this();
intinit(1,2);
floatinit("a","b",3.0f);
name = n;
id = i;
}
AsCaller() {
System.out.println("No arguments");
}
void display() {
System.out.println(id + " " +name);
}
public static void main(String[] args) {
AsCaller example1 = new AsCaller("Student", 876);
example1.display();
}
}
TL;DR:不,编译器不允许您从 class 的任何构造函数中调用两个构造函数,因为对此的调用必须是第一个语句在构造函数中。
我正在研究 this() 关键字来调用构造函数。我非常确定它用于调用当前 class 的其他构造函数的简单机制:
public class AsCaller {
String name;
int id;
AsCaller() {
System.out.println("No arguments");
}
AsCaller(String n, int i) {
this();
name = n;
id = i;
}
void display() {
System.out.println(id + " " +name);
}
public static void main(String[] args) {
AsCaller example1 = new AsCaller("Student", 876);
example1.display();
}
}
正如预期的那样,它给出了输出:
No arguments
876 Student
但是,如果我们有超过 2 个构造函数并且其中一些有 2 个或更多参数怎么办? this() 关键字将如何用于调用其中之一?喜欢:
public class AsCaller {
String name;
int id;
AsCaller(String city, String street, float house) {
System.out.println("float datatype invoked");
}
AsCaller(int age, int marks) {
System.out.println("int datatype invoked");
}
AsCaller(String n, int i) {
// How to use this() keyword to invoke any of the above constructor?.
this();
name = n;
id = i;
}
AsCaller() {
System.out.println("No arguments");
}
void display() {
System.out.println(id + " " +name);
}
public static void main(String[] args) {
AsCaller example1 = new AsCaller("Student", 876);
example1.display();
}
}
你可以这样做:
AsCaller(String n, int i) {
// How to use this() keyword to call any of the above constructor?.
this(1,i);// calls the AsCaller(int age, int marks) constructor
name = n;
id = i;
}
以类似的方式,您需要将参数传递给 this(..) 以匹配您要调用的构造函数的参数序列。
简单:
this(age, marks);
传递与您要调用的构造函数匹配的参数。
我认为从一个构造函数中调用两个构造函数没有意义。 class 编码者选择提供的构造函数类型是 设计选择 并且可以这样设计,这样您就不需要从一个构造函数调用两个构造函数。 我认为 Java 允许您从构造函数调用一个构造函数的原因是因为默认构造函数可能会执行一些默认初始化,例如打开套接字、分配内存等,这些可能在构造函数中很常见。 您可以按如下方式重写代码,这样您就不必从一个构造函数调用两个构造函数,尽管功能得以保留。
public class AsCaller {
String name;
int id;
void intinit(int age, int marks){
System.out.println("int datatype invoked");
}
void floatinit(String city, String street, float house){
System.out.println("float datatype invoked");
}
AsCaller(String city, String street, float house) {
floatinit(city,street,house);
}
AsCaller(int age, int marks) {
intinit(age,marks);
}
AsCaller(String n, int i) {
// How to use this() keyword to invoke any of the above constructor?.
this();
intinit(1,2);
floatinit("a","b",3.0f);
name = n;
id = i;
}
AsCaller() {
System.out.println("No arguments");
}
void display() {
System.out.println(id + " " +name);
}
public static void main(String[] args) {
AsCaller example1 = new AsCaller("Student", 876);
example1.display();
}
}
TL;DR:不,编译器不允许您从 class 的任何构造函数中调用两个构造函数,因为对此的调用必须是第一个语句在构造函数中。