我们可以创建一个没有括号的对象吗?

时间:2018-01-13 19:57:32

标签: java arrays object syntax new-operator

根据this site,创建Java对象的语法是:

<JavaType> <variable> = new <JavaObject>();

虽然在创建Array对象时不使用任何parantheses,而是键入包含每个维度长度的括号。

示例:

String[][] stringMatrix = new String[5][10];

我想知道的是,这个语法是否专门用于创建一个Array对象,或者我可以创建一个自定义类,其对象的创建方式与通常不同

new <JavaObject>();

语句。

3 个答案:

答案 0 :(得分:2)

new关键字用于为特定类型 分配内存,后跟new关键字。

MyClass obj = new MyClass();

上面的行将为MyClass创建一个对象(分配内存),并通过调用默认构造函数初始化成员变量。

但是,下面的代码行只会分配内存并使用默认值null初始化数组的每个元素。

MyClass[][] objMatrix = new MyClass[5][10];

所以,我们只是声明一个大小为5x10(分配内存)的数组,但是数组中的每个元素都需要一些对象引用(因为,目前它们有null引用)。因此,出于这个原因,您需要通过创建objMatrix的对象并将它们分配给每个元素来初始化每个MyClass数组元素。

objMatrix[0][0] = new MyClass();

答案 1 :(得分:0)

专门用于创建数组。你的班级已经被括号括起来了。

答案 2 :(得分:0)

您无法创建更改 // Open Computer Vision Program.cpp : Defines the entry point for the application. // #include "stdafx.h" #include "Open Computer Vision Program.h" //// Example Code #include <opencv2/highgui/highgui.hpp> #include <iostream> using namespace cv; using namespace std; //// Example Code #define MAX_LOADSTRING 100 // Global Variables: HINSTANCE hInst; // current instance WCHAR szTitle[MAX_LOADSTRING]; // The title bar text WCHAR szWindowClass[MAX_LOADSTRING]; // the main window class name // Forward declarations of functions included in this code module: ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); // TODO: Place code here. //// Example Code Mat im = imread("c:lena.jpg"); if (im.empty()) { cout << "Cannot load image!" << endl; return -1; } imshow("Image", im); waitKey(0); //// Example Code // Initialize global strings LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadStringW(hInstance, IDC_OPENCOMPUTERVISIONPROGRAM, szWindowClass, MAX_LOADSTRING); MyRegisterClass(hInstance); // Perform application initialization: if (!InitInstance (hInstance, nCmdShow)) { return FALSE; } HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_OPENCOMPUTERVISIONPROGRAM)); MSG msg; // Main message loop: while (GetMessage(&msg, nullptr, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int) msg.wParam; } // // FUNCTION: MyRegisterClass() // // PURPOSE: Registers the window class. // ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEXW wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_OPENCOMPUTERVISIONPROGRAM)); wcex.hCursor = LoadCursor(nullptr, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_OPENCOMPUTERVISIONPROGRAM); wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassExW(&wcex); } // // FUNCTION: InitInstance(HINSTANCE, int) // // PURPOSE: Saves instance handle and creates main window // // COMMENTS: // // In this function, we save the instance handle in a global variable and // create and display the main program window. // BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { hInst = hInstance; // Store instance handle in our global variable HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr); if (!hWnd) { return FALSE; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } // // FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM) // // PURPOSE: Processes messages for the main window. // // WM_COMMAND - process the application menu // WM_PAINT - Paint the main window // WM_DESTROY - post a quit message and return // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_COMMAND: { int wmId = LOWORD(wParam); // Parse the menu selections: switch (wmId) { case IDM_ABOUT: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } } break; case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &ps); // TODO: Add any drawing code that uses hdc here... EndPaint(hWnd, &ps); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } // Message handler for about box. INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG: return (INT_PTR)TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)TRUE; } break; } return (INT_PTR)FALSE; } 运算符工作方式的自定义类。但是,在某些特殊情况下,可以在没有通常的new运算符的情况下创建对象。

E.g。

new

演示您可以在变量初始值设定项中创建没有String[] array = { "foo", "bar", "baz" }; Integer value = 42; 关键字的数组,使用文字和autobox原始值的new对象到其对象对应物,而不使用通常的String语法,但是当然,这不适用于自定义类型。

在没有new运算符的情况下创建对象的另一种可能性是对它们进行反序列化,如果它们是new,也适用于自定义类型。

从Java 8开始,如果您有适当的上下文,则可以使用构造函数引用,例如

Serializable

此处,BigDecimal[] array = new BigDecimal[20]; Arrays.setAll(array, BigDecimal::new); System.out.println(Arrays.toString(array)); 是对BigDecimal::new的构造函数的引用,它从上下文隐含,即BigDecimal该函数必须能够使用Arrays.setAll value,因为int方法将为每个数组元素评估它,传递数组索引,所以我们在这个例子中使用递增的数字初始化数组。

另一个例子是

setAll

从上下文暗示,BigDecimal[] array = Stream.of("1.23", "4.56", "7.89") .map(BigDecimal::new) .toArray(BigDecimal[]::new); System.out.println(Arrays.toString(array)); 步骤中使用的构造函数必须使用.map(BigDecimal::new),因为它将针对每个流元素进行求值,最终得到的结构不同于第一个例子。

String是一个普通的类,如果它有匹配的构造函数,这些示例也适用于自定义类。