java中的return this问题
java中的return this问题
return this ;大家都知道,这是返回当前对象引用,我就很郁闷,这个有什么好返回的,返回给谁???假设返回给A,那A为什么不用前面创建对象的变量直接去访问,???
补充:public class Leaf
{
int i = 0;
Leaf increment()
{
i++;
return this;
}
void print()
{
System.out.println( "i = " + i);
}
public static void main(String[] args)
{
Leaf x = new Leaf();
x.increment();
}
}
输出结果是什么呢,难道是对象??????郁闷!
我来回答
回答 (5)
钟鹏辉 项目经理 |1705个满意答案 2010-09-03
返回当前类实例...
相当于new了
评论(0)00
レ我心飛揚 2010-09-03 这个问题就奇怪了,比如你吃饭有时用勺子用时要用筷子一样。如果A是一个私有类,在B中要用到A的属性this就有用了,通过构造器
评论(0)00
迩的爱属于莪 2010-09-03
x.increment(); 返回自身
也就是说 x.increment()==x
比如你要连续调用 2次increment()
一般的写法是
x.increment();
x.increment();
但是因为方法返回自身的引用
所以可以这样写
x.increment().increment();
好好体会一下this的妙用
追问:
return this的作用仅仅是x.increment(); x.increment();可以写成x.increment().increment();吗???那也太花哨了吧
回答:
如果你只认为它有这种作用 那你就大错特错了
虽然我也不知道怎么跟你讲 但是既然return可以返回任何基本数据类型和任何对象的引用,当然也可以返回它自身的引用
纵观JDK,有很多类的方法都会返回其自身的引用
像StringBuffer
当然要不要返回自身 看场合 论实际 而不是一定要用
评论(0)10
正在输入 2010-09-03 这个有点类似单列模式:单例模式就是某个类只存在一个对象(只new 一次),当某个类的初始化比较耗时,耗资源的时候,比如加载某些配置文件hibernate,spring的配置文件等,一般会选择单例模式。
一、懒汉式单例
在类被加载的时候,唯一实例已经被创建。这个设计模式在Java中容易实现,在别的语言中难以实现。
/**
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2007-9-11
* Time: 14:57:08
* <> 单例模式-懒汉式单例
*/
public class LazySingleton {
/**
* 私有静态对象,加载时候不做初始化
*/
private static LazySingleton m_intance=null;
/**
* 私有构造方法,避免外部创建实例
*/
private LazySingleton(){
}
/**
* 静态工厂方法,返回此类的唯一实例.
* 当发现实例没有初始化的时候,才初始化.
* @return LazySingleton
*/
synchronized public static LazySingleton getInstance(){
if(m_intance==null){
m_intance=new LazySingleton();
}
return m_intance;
} }
二、饿汉式单例
在类加载的时候不创建单例实例。只有在第一次请求实例的时候的时候创建,并且只在第一次创建后,以后不再创建该类的实例。
/**
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2007-9-11
* Time: 14:45:25
* <> 单例模式-饿汉式单例
*/
public class EagerSingleton {
/**
* 私有的(private)唯一(static final)实例成员,在类加载的时候就创建好了单例对象
*/
private static final EagerSingleton m_instance = new EagerSingleton();
/**
* 私有构造方法,避免外部创建实例
*/
private EagerSingleton() {
}
/**
* 静态工厂方法,返回此类的唯一实例.
* @return EagerSingleton
*/
public static EagerSingleton getInstance() {
return m_instance;
}
}
三、登记式单例
这个单例实际上维护的是一组单例类的实例,将这些实例存放在一个Map(登记薄)中,对于已经登记过的实例,则从工厂直接返回,对于没有登记的,则先登记,而后返回。
/**
* Created by IntelliJ IDEA. * User: leizhimin
* Date: 2005-9-11
* Time: 15:20:16
* <> 单例模式- 登记式单例
*/
public class RegSingleton {
/**
* 登记薄,用来存放所有登记的实例
*/
private static Map m_registry = new HashMap();
//在类加载的时候添加一个实例到登记薄
static {
RegSingleton x = new RegSingleton();
m_registry.put(x.getClass().getName(), x);
}
/**
* 受保护的默认构造方法
*/
protected RegSingleton() {
}
/**
* 静态工厂方法,返回指定登记对象的唯一实例;
* 对于已登记的直接取出返回,对于还未登记的,先登记,然后取出返回
* @param name
* @return RegSingleton
*/
public static RegSingleton getInstance(String name) {
if (name == null) {
name = "RegSingleton";
}
if (m_registry.get(name) == null) {
try {
m_registry.put(name, (RegSingleton) Class.forName(name).newInstance());
} catch (InstantiationException e) { e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
return m_registry.get(name);
}
/**
* 一个示意性的商业方法
* @return String
*/
public String about() {
return "Hello,I am RegSingleton!";
}
}
评论(0)10
凡人的智慧 2010-09-08
一般来说 进行链式编程的时候会用到return this这类的用法 至于在你的代码 完全是没有意义的
java构造函数的八种方法
java构造函数的八种方法
在Java中,构造函数是用来初始化对象的特殊方法。Java中构造函数的定义与普通方法类似,但具有以下特点:构造函数的方法名与类名相同;构造函数没有返回值类型;每个类都可以有一个或多个构造函数。根据参数列表和调用方式的不同,构造函数可以分为以下八种方法:
1. 无参构造函数: 这是最简单的构造函数,不接受任何参数。当我们创建一个对象时,如果没有显式地调用构造函数,并且类中没有定义其他构造函数,则会隐式地调用无参构造函数。
javapublic class MyClass {
public MyClass() {
// 构造函数体
}
}
2. 有参构造函数: 有参构造函数接受一个或多个参数,并根据这些参数对对象进行初始化。
javapublic class MyClass {
public MyClass(int param1, String param2) {
// 构造函数体
}
}
3. 默认构造函数: 如果没有在类中显式地定义构造函数,编译器会默认提供一个无参的构造函数。这个构造函数称为默认构造函数。
javapublic class MyClass {
// 编译器提供的默认构造函数
public MyClass() {
// 构造函数体
}
}
4. 重载构造函数: 在一个类中可以定义多个构造函数,只要它们的参数列表不同即可,这就是构造函数的重载。
javapublic class MyClass {
public MyClass() {
// 无参构造函数
}
public MyClass(int param1) {
// 有参构造函数
}
} 5. 私有构造函数: 私有构造函数可以防止类被实例化,通常用于创建工具类或单例模式。
枚举实现单例模式原理
枚举实现单例模式原理
实现单例模式的方法有很多种,其中比较常见的一种是使用枚举类型。在Java中,枚举类型是一种特殊的类,它只允许有固定数量的实例,并且这些实例在枚举类型定义的时候就已经确定。使用枚举类型可以很方便地实现单例模式,而且具有线程安全和反序列化安全等优点。本文将介绍如何使用枚举类型实现单例模式,以及其实现原理。
使用枚举类型实现单例模式
我们定义一个枚举类型,例如:
public enum Singleton {
INSTANCE;
//其他成员变量和方法
}
在这个枚举类型中,我们只定义了一个枚举常量INSTANCE。这个常量就是我们要实现的单例对象,而且它是一个类的静态变量,因此就具有了全局访问点。
在这个枚举类型中,我们可以定义其他成员变量和方法,以实现单例对象的功能。例如:
public enum Singleton {
INSTANCE;
private String name;
public void setName(String name){
= name;
}
public String getName(){
return ;
}
} 在这个例子中,我们定义了一个name成员变量和相应的setter和getter方法,以实现单例对象的属性访问。
使用这个单例对象的代码可以这样实现:
Singleton.INSTANCE.setName("my name");
String name = Singleton.INSTANCE.getName();
这段代码调用了Singleton枚举类型的INSTANCE常量,并通过它访问了单例对象的属性和方法。这样,我们就实现了一个简单的枚举类型单例对象。
java枚举类型enum用法 switch-概述说明以及解释
java枚举类型enum用法 switch-概述说明以及解释
1.引言
1.1 概述
在计算机编程中,枚举类型(enum)是一种特殊的数据类型,用于表示一组具名的常量。与普通的变量不同,枚举类型的取值是有限且固定的,它将一系列具有相似属性或关联关系的常量进行分组,方便在程序中进行使用和管理。
在Java编程语言中,枚举类型是一种独立的类,它可以包含多个枚举常量,并且允许定义属性和方法。枚举类型的定义方式简单明了,可以帮助程序员更好地组织和管理常量。
本文将重点介绍Java中枚举类型enum的用法,并阐述枚举类型在switch语句中的应用。首先,我们将讨论枚举类型的定义和声明,包括如何创建枚举类型以及如何给枚举常量赋值。接着,我们将探讨枚举类型的属性和方法,包括如何为枚举常量定义属性和方法,以及如何在程序中使用它们。最后,我们将重点关注枚举类型在switch语句中的应用,介绍如何使用switch语句处理枚举类型的不同取值。通过本文的学习,读者将能够更好地掌握枚举类型enum的用法,进一步提升自己的编程能力。
接下来,我们将详细介绍枚举类型的定义和声明。
1.2 文章结构
本文将按照以下结构来探讨Java枚举类型(enum)以及其在switch语句中的应用。
1. 引言
1.1 概述
在引言部分,我们将简要介绍Java枚举类型(enum)的基本概念和作用,以及本文的目的和重要性。
1.2 文章结构(当前部分)
在文章结构部分,我们将详细介绍本文的整体结构,让读者对接下来的内容有一个清晰的认知。
1.3 目的
在目的部分,我们将阐述本文的目标是为读者提供全面了解Java枚举类型(enum)及其在switch语句中应用的知识,以帮助读者在实际开发中更好地运用这些概念。
2. 正文 2.1 枚举类型的定义与声明
在这一节中,我们将介绍如何定义和声明枚举类型,以及枚举类型的特点和用法。
构造方法及this关键字实验目的
构造方法和关键字 "this" 在编程中与对象的创建和初始化有关。构造方法是一种特殊的方法,用于在创建对象时初始化对象的属性和状态。关键字 "this" 用于引用当前对象的引用。下面是一个简单的Java示例,说明了构造方法和关键字 "this" 的用法以及实验目的:
public class Person {
private String name;
private int age;
// 构造方法1
public Person() {
= "未知";
this.age = 0;
}
// 构造方法2
public Person(String name, int age) {
= name;
this.age = age;
}
// 获取姓名
public String getName() {
return ;
}
// 获取年龄
public int getAge() {
return this.age;
}
public static void main(String[] args) {
// 创建两个Person对象,使用不同的构造方法
Person person1 = new Person();
Person person2 = new Person("Alice", 25);
// 输出对象的属性值
System.out.println("Person1的姓名是:" + person1.getName());
System.out.println("Person1的年龄是:" + person1.getAge());
JAVA笔试题_附答案版
一:单选题
1. 下列哪一种叙述是正确的(D )
A. abstract修饰符可修饰字段、方法和类
B. 抽象方法的body部分必须用一对大括号{ }包住没有body部分
C. 声明抽象方法,大括号可有可无 不存在body
D. 声明抽象方法不可写出大括号
2. 如下代码
public class Test {
public int aMethod() {
static int i = 0;
i++;
return i;
}
public static void main (String args[]) {
Test test = new Test();
test.aMethod();
int j = test.aMethod();
System.out.println(j);
}
}
输出结果是什么? D
A. 0
B. 1
C. 2
D. 编译失败
3. 下列哪种说法是正确的( D)
A. 实例方法可直接调用超类的实例方法 如果超类没有被重写就可以
B. 实例方法可直接调用超类的类方法 有可能是私有方法不可以调用
C. 实例方法可直接调用其他类的实例方法 不可以
D. 实例方法可直接调用本类的类方法
4. 在Servlet处理请求的方式为: C
A.以进程的方式
B.以程序的方式
C.以线程的方式 Servlet容器默认是采用单实例多线程的方式处理多个请求的:
D.以响应的方式
5. JDBC中,用于表示数据库连接的对象是: B
A.Statement 连接的实例,执行sql
B.Connection 建立与数据库的连接
C.DriverManager该方法将建立与数据库的连接 D.PreparedStatement
6. 用于调用存储过程的对象是: C
A.ResultSet 返回结果集
B.DriverManager
C.CallableStatemet
Java语言程序设计课后习题解答-张思民-第三章
word格式-可编辑-感谢下载支持
第3章 面向对象程序设计基础
【1】什么是Java程序使用的类?什么是类库?
[解答]:Java程序的基本单位是类。对象是对事物的抽象,而类是对对象的抽象和归纳,找出事物的共性,把具有共同性质的事物归结为一类,得出一个抽象的概念——类。类是具有相同属性和方法的一组对象的集合,类是在对象之上的抽象,对象则是类的具体化,一旦建立类之后,就可用它来建立许多你需要的对象。
Java的类库是系统提供的已实现的标准类的集合,是Java编程的API(Application Program Interface),它可以帮助开发者方便、快捷地开发Java程序。
【2】如何定义方法?在面向对象程序设计中方法有什么作用?
[解答]:方法的定义由两部分组成:方法声明和方法体。方法声明的基本格式如下:
返回类型 方法名(形式参数)
{
… //方法体内容
}
方法声明包括方法名、返回类型和形式参数,方法的小括号是方法的标志;方法体为实现方法行为的Java语句。
在面向对象程序设计中,方法所起的作用是完成对类和对象属性操作。
【3】简述构造方法的功能和特点。下面的程序片段是某学生为student类编写的构造方法,请指出其中的错误。
void Student(int no,String name)
{
studentNo=no;
studentName=name;
return no;
}
[解答]:构造方法是一个特殊的方法,主要用于初始化新创建的对象。构造方法的方法名要求与类名相同,用户不能直接调用,只能通过new运算符调用,而且构造方法是不返回任何数据类型,甚至也不返回void数据类型,即不能在构造方法前加void。
以上的代码段出错于:①构造方法Student()前不能加void ②不能用return语句
【4】定义一个表示学生的student类,包括的域有学号、姓名、性别、年龄,包括的方法有获得学号、姓名、性别、年龄及修改年龄。编写Java程序创建student类的对象及测试其方法的功能。
Java题库——Chapter11继承和多态
Java题库——Chapter11继承和多态
1)Analyze the following code:
public class Test {
public static void main(String[ ] args) {
B b = new B();
b.m(5);
System.out.println("i is " + b.i);
}
}
class A {
int i;
public void m(int i) {
this.i = i;
}
}
class B extends A {
public void m(String s) {
}
}
A)The program has a compilation error, because m is overridden with a different signature in B.
B)The method m is not overridden in B. B inherits the method m from A and defines an overloaded method m in B.
C)The program has a runtime error on b.i, because i is not accessible from b.
D)The program has a compilation error, because b.m(5) cannot be invoked since the method m(int) is hidden in B.
B中没有重写⽅法m。B继承了A中的⽅法m,并在B中定义了⼀个重载的⽅法m。
2)Analyze the following code.
// Program 1
public class Test {
public static void main(String[ ] args) {
Object a1 = new A();
-山东大学Java高级程序语言期末考试题(含答案)
1. 下列关于计算机系统和Java编程语言的说法,正确的是(C)
A. 计算机是由硬件、操作系统和软件组成,操作系统是缺一不可的组成部分。
B. Java语言编写的程序源代码可以不需要编译直接在硬件上运行。
C. 在程序中书写注释不会影响程序的执行,可以多写一些详细的注释。
D. Java的集成开发环境(IDE),如Eclipse,是开发Java语言必需的软件工具。
2. 下列选项中符合Java命名规则的标识符是(D)
A. 2japro B. &Class C. const D. _123
3. 下列在Java语言中关于数据类型和包装类的说法,正确的是(B)
A. 基本(简单)数据类型是包装类的简写形式,可以用包装类替代基本(简单)数据类型。
B. long和double都占了64位(64bit)的存储空间。
C. 默认的整数数据类型是int,默认的浮点数据类型是float。
D. 和包装类一样,基本(简单)数据类型声明的变量中也具有静态方法,用来完成进制转化等。
4. 下面赋值语句中正确的是(A)
A. double d=5.3e12; B. float f=11.1;
C. int i=0.0; D. Double oD=3;
5. 如果int x=20, y=5,则语句System.out.println(x+y +""+(x+y)+y); 的输出结果是(D)
A. 2530 B. 55 C. 2052055 D. 25255
6. 如下Java语句 double x=2.0; int y=4; x/=++y; 执行后,x的值是(C)
A. 0.5 B. 2.5 C. 0.4 D. 2.0
7. 下列关于Java语言中String和char的说法,正确的是(C)
解析Java中所有错误和异常的父类java.lang.Throwable
解析Java中所有错误和异常的⽗类ng.Throwable
这篇⽂章主要介绍了Java中所有错误和异常的⽗类ng.Throwable,⽂章中简单地分析了其源码,说明在代码注释中,需要的朋友可以参考下
在java语⾔中,错误类的基类是ng.Error,异常类的基类是ng.Exception。
1)相同点:ng.Error和ng.Exception都是ng.Throwable的⼦类,因此ng.Error和ng.Exception⾃⾝及其⼦类都可以作为throw的
使⽤对象,如:throw new MyError();和throw new MyException();其中,MyError类是ng.Error的⼦类,MyException类是ng.Exception的⼦类。
2)不同点:ng.Error⾃⾝及其⼦类不需要try-catch语句的⽀持,可在任何时候将返回⽅法,如下⾯的⽅法定义:
public String myMethod() {
throw new MyError(); }
其中MyError类是ng.Error类的⼦类。
ng.Exception⾃⾝及其⼦类需要try-catch语句的⽀持,如下的⽅法定义是错误的:
public String myMethod() {
throw new MyException(); }
正确的⽅法定义如下:
public String myMethod() throws MyException {
throw new MyException();
}
其中MyException类是ng.Exception的⼦类。
JAVA异常是在java程序运⾏的时候遇到⾮正常的情况⽽创建的对象,它封装了异常信息,java异常的根类为ng.Throwable,整个类有两个
字符串拼接五种常用方法
字符串拼接五种常⽤⽅法
字符串,是Java中最常⽤的⼀个数据类型了。本⽂,也是对于Java中字符串相关知识的⼀个补充,主要来介绍⼀下字符串拼接相关的知识。本⽂基于jdk1.8.0_181。字符串拼接是我们在Java代码中⽐较经常要做的事情,就是把多个字符串拼接到⼀起。我们都知道,String是Java中⼀个不可变的类,所以他⼀旦被实例化就⽆法被修改。(不可变类的实例⼀旦创建,其成员变量的值就不能被修改。这样设计有很多好处,⽐如可以缓存hashcode、使⽤更加便利以及更加安全等)。 但是,既然字符串是不可变的,那么字符串拼接⼜是怎么回事呢?字符串不变性与字符串拼接,其实,所有的所谓字符串拼接,都是重新⽣成了⼀个新的字符串。下⾯⼀段字符串拼接代码:String s = "abcd";
s = s.concat("ef");
其实最后我们得到的s已经是⼀个新的字符串了。如下图:
中保存的是⼀个重新创建出来的String对象的引⽤。那么,在Java中,到底如何进⾏字符串拼接呢?字符串拼接有很多种⽅式,这⾥简单介绍⼏种⽐较常⽤的。
⼀,使⽤+拼接字符串
在Java中,拼接字符串最简单的⽅式就是直接使⽤符号+来拼接。如:String wechat = "Hollis";
String introduce = "召唤师峡⾕";
String hollis = wechat + "," + introduce;
这⾥要特别说明⼀点,有⼈把Java中使⽤+拼接字符串的功能理解为运算符重载。其实并不是,Java是不⽀持运算符重载的。这其实只是Java提供的⼀个语法糖。后⾯再详细介绍。
概念普及:
运算符重载:在计算机程序设计中,运算符重载(英语:operator overloading)是多态的⼀种。运算符重载,就是对已有的运算符重新进⾏定义,赋予其另⼀种功能,以适应不同的数据类型。
语法糖:语法糖(Syntactic sugar),也译为糖⾐语法,是由英国计算机科学家彼得·兰丁发明的⼀个术语,指计算机语⾔中添加的某种语法,这种语法对语⾔的功能没有影响,但是更⽅便程序员使⽤。语法糖让程序更加简洁,有更⾼的可读性。concat
