新建对象的疑问

Java匿名类详解
本文探讨了Java中一种特殊的对象创建方式——使用匿名内部类。通过示例对比了传统对象创建方法与匿名内部类的不同,并解释了匿名内部类的语法结构及其特点。

对于Java中新建一个对象,大家可能再熟悉不过了,如:

public class Person {

	private String name;

	public void setName(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public String aaa() {
		return "AAA";
	}

	public static void main(String[] args) {
		Person p = new Person();
		p.setName("123");
		System.out.println(p.getName());
	}
}

 上面的main方法中的 新建对象方式,对于每个Javaer来说,都不应该有任何疑问。

但是,今天在看Struts2源码时,遇到了以下的代码:

protected List<String> extensions = new ArrayList<String>() {{
        add("action");
        add("");
    }};

 一开始还楞了一下,怀疑这代码能运行么?

因为这跟我以前声明list的方式不一样,相比之前,我们一般都是如下来声明并初始化list的:

protected List<String> extensions = new ArrayList<String>();
extensions.add("action");
extensions.add("");

 

然后我就脑洞开了一下,既然List可以这么来写,那么其他类是不是也可以这么搞呢?

就拿本文开头的Person类来举例吧,我发现如下这样声明也是可以的:

public class Person {

	private String name;

	public void setName(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public String aaa() {
		return "AAA";
	}

	public static void main(String[] args) {
		Person p = new Person() {
			{
				setName("123");

			}

			public String aaa() {
				return "aaa";
			}

			public String bbb() {
				return "bbb";
			}
		};

		System.out.println(p.name);
		System.out.println(p.aaa());
	}
}

 这样看起来感觉 很怪,但是它是可以运行的,而且它的运行结果是:

123
aaa

也就是 Person类中定义的aaa()方法被 p 实例中的aaa()给覆盖了。

 

现象比较好玩,但是不知道这是什么语法,还请有识者指点一下。

 

////////////////////////////////////分隔线(2015年10月27日)////////////////////////////////////////////////////

今天无意在 Oracle官方网站上学习 Nested Class 相关语法时,找到了解答:

http://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

 

■ Syntax of Anonymous Classes

As mentioned previously, an anonymous class is an expression. The syntax of an anonymous class expression is like the invocation of a constructor, except that there is a class definition contained in a block of code.

The anonymous class expression consists of the following:

● the new operator

● The name of an interface to implement or a class to extend. In this example, the anonymous class is implementing the interface HelloWorld.

● Parentheses that contain the arguments to a constructor, just like a normal class instance creation expression. Note: When you implement an interface, there is no constructor, so you use an empty pair of parentheses, as in this example.

● A body, which is a class declaration body. More specifically, in the body, method declarations are allowed but statements are not.


■ Accessing Local Variables of the Enclosing Scope, and Declaring and Accessing Members of the Anonymous Class

Like local classes, anonymous classes can capture variables; they have the same access to local variables of the enclosing scope:

● An anonymous class has access to the members of its enclosing class.

● An anonymous class cannot access local variables in its enclosing scope that are not declared as final or effectively final.

● Like a nested class, a declaration of a type (such as a variable) in an anonymous class shadows any other declarations in the enclosing scope that have the same name. See Shadowing for more information.

Anonymous classes also have the same restrictions as local classes with respect to their members:

● You cannot declare static initializers or member interfaces in an anonymous class.

● An anonymous class can have static members provided that they are constant variables.

Note that you can declare the following in anonymous classes:

● Fields

● Extra methods (even if they do not implement any methods of the supertype)

● Instance initializers

● Local classes

However, you cannot declare constructors in an anonymous class.

 

 

从上面的解释来看:

其实,我上面的写法,就相当于声明了一个匿名类,这个匿名类是 Person 类的一个子类(但是没有显示进行定义)。另外,虽然在这个 匿名类 中增加了一个 bbb() 方法,但是因为 Person 类中并没有 bbb()这个方法,而且 p 变量又是 Person 类的一个实例,所以无法通过 p 变量去调用 bbb() 方法。

<think>嗯,用户问的是如何在SQL Server中新建数据库。我需要先回想一下自己知道的几种方法。通常有两种主要方法:使用图形界面(SSMS)和用SQL语句。根据用户提供的引用内容,他们提到了两种方法,一个是运行SQL语句,另一个是通过图形界面操作。不过引用里提到的testMySQl和导入MySQL数据库可能有点混淆,因为用户的问题是关于创建新数据库,而不是导入。不过这可能只是引用中的一个例子,需要忽略导入部分,专注于创建数据库的步骤。 首先,应该分步骤说明图形界面方法。引用[2]提到的是在SSMS中通过对话框创建,填入名称,修改文件属性等。需要详细描述每一步,比如右击“数据库”节点,选择新建,填写名称,调整文件和日志的设置。用户可能还需要知道如何调整初始大小、自动增长和路径,这些都是常见的配置选项。 然后是使用SQL语句的方法。根据引用[1],用户需要打开新的查询窗口,输入CREATE DATABASE语句。需要给出一个例子,比如CREATE DATABASE TestDB,同时可以扩展一下,说明如何指定文件属性,比如设置文件大小、增长方式和路径。这部分需要确保语法正确,比如使用ON PRIMARY指定数据文件,LOG ON指定日志文件。 另外,需要注意用户可能对路径和文件名有疑问,要提醒他们根据实际情况修改。例如,路径是否存在,是否有权限等。同时,自动增长设置可以根据需求调整,比如按百分比或固定大小增长。 接下来,生成相关问题。可能的问题包括如何修改现有数据库的属性,创建数据库时的权限问题,以及不同方法的优缺点比较。比如图形界面适合新手,而SQL语句适合自动化部署等。 需要检查是否有遗漏的步骤,比如是否需要配置其他选项,或者创建后的验证步骤,比如刷新数据库列表查看是否成功。此外,确保提到的两种方法覆盖了用户的需求,并且引用正确,引用[1]和引用[2]分别对应SQL语句和图形界面方法。 最后,语言要简洁明了,用中文,避免使用专业术语过多,方便用户理解。同时,确保LaTeX格式正确,虽然在这个回答中可能不需要数学公式,但如果有变量或代码,要用对应的格式。例如,代码块用三个反引号包裹,并标明语言类型,如SQL或Python。</think>### 如何在 SQL Server 中创建新数据库? 在 SQL Server 中创建新数据库主要有两种方法:**通过图形界面(SSMS)** 和 **使用 SQL 语句**。以下是详细步骤: --- #### **方法 1:通过 SQL Server Management Studio (SSMS) 图形界面** 1. **连接到数据库实例** 打开 SSMS,登录目标 SQL Server 实例。 2. **新建数据库** - 右击“对象资源管理器”中的 **数据库** 节点,选择 **新建数据库** [^2]。 - 在弹出的对话框中输入数据库名称(如 `TestDB`),系统会自动生成默认的数据文件(`.mdf`)和日志文件(`.ldf`)。 3. **自定义文件属性(可选)** - **数据文件**:可修改逻辑名称、初始大小(如 `10MB`)、自动增长方式(如按百分比或固定大小增长)、文件存储路径。 - **日志文件**:类似地调整日志文件的参数。 - 完成后点击 **确定** 即可创建数据库。 --- #### **方法 2:使用 SQL 语句** 1. **打开新查询窗口** 在 SSMS 中点击 **新建查询**,输入以下语句: ```sql CREATE DATABASE TestDB; ``` 执行后会生成默认配置的数据库。 2. **自定义文件属性(示例)** ```sql CREATE DATABASE TestDB ON PRIMARY ( NAME = 'TestDB_Data', FILENAME = 'C:\SQLData\TestDB.mdf', SIZE = 20MB, MAXSIZE = UNLIMITED, FILEGROWTH = 10% ) LOG ON ( NAME = 'TestDB_Log', FILENAME = 'C:\SQLLog\TestDB.ldf', SIZE = 5MB, MAXSIZE = 100MB, FILEGROWTH = 5MB ); ``` - `ON PRIMARY` 定义数据文件,`LOG ON` 定义日志文件。 - 需确保路径 `C:\SQLData\` 和 `C:\SQLLog\` 存在且 SQL Server 有写入权限[^1]。 --- #### **验证数据库创建** - 刷新 **数据库** 节点,查看是否出现新数据库(如 `TestDB`)。 - 在查询窗口中执行 `SELECT name FROM sys.databases;` 确认数据库列表。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值