当前位置:首页>开发>正文

java中string类创建对象 Java创建对象的几种方法

2023-04-27 06:12:57 互联网 未知 开发

 java中string类创建对象 Java创建对象的几种方法

java中string类创建对象

Java中String是一个特殊的包装类数据有两种创建形式:
String s = "abc"
String s = new String("abc")
第一种先在栈中创建一个对String类的对象引用变量s,然后去查找"abc"是否被保存在字符串常量池中,如果没有则在栈中创建三个char型的值a、b、c,然后在堆中创建一个String对象object,它的值是刚才在栈中创建的三个char型值组成的数组{a、b、c},接着这个String对象object被存放进字符串常量池,最后将s指向这个对象的地址,如果"abc"已经被保存在字符串常量池中,则在字符串常量池中找到值为"abc"的对象object,然后将s指向这个对象的地址。
第一种特点:JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。
第二种可以分解成两步1、String object = "abc" 2、String s = new String(object) 第一步参考第一种创建方式,而第二步由于"abc"已经被创建并保存到字符串常量池中,因此jvm只会在堆中新创建一个String对象,它的值共享栈中已有的三个char型值。
第二种特点:一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象。
在讲字符串比较前,必须要了解==和equals的区别:
因为java所有类都继承于Object基类,而Object中equals用==来实现,所以equals和==是一样的,都是比较对象地址,java api里的类大部分都重写了equals方法,包括基本数据类型的封装类、String类等。对于String类==用于比较两个String对象的地址,equals则用于比较两个String对象的内容(值)。

Java创建对象的几种方法

使用new关键字:这是我们最常见的也是最简单的创建对象的方式,通过这种方式我们还可以调用任意的够赞函数(无参的和有参的)。比如:Student student = new Student()
使用Class类的newInstance方法:我们也可以使用Class类的newInstance方法创建对象,这个newInstance方法调用无参的构造器创建对象,如:Student student2 = (Student)Class.forName("根路径.Student").newInstance() 或者:Student stu = Student.class.newInstance()
使用Constructor类的newInstance方法:本方法和Class类的newInstance方法很像,java.lang.relect.Constructor类里也有一个newInstance方法可以创建对象。我们可以通过这个newInstance方法调用有参数的和私有的构造函数。如: Constructor constructor = Student.class.getInstance() Student stu = constructor.newInstance() 这两种newInstance的方法就是大家所说的反射,事实上Class的newInstance方法内部调用Constructor的newInstance方法。这也是众多框架Spring、Hibernate、Struts等使用后者的原因。
使用Clone的方法:无论何时我们调用一个对象的clone方法,JVM就会创建一个新的对象,将前面的对象的内容全部拷贝进去,用clone方法创建对象并不会调用任何构造函数。要使用clone方法,我们必须先实现Cloneable接口并实现其定义的clone方法。如:Student stu2 = stu.clone()这也是原型模式的应用。
使用反序列化:当我们序列化和反序列化一个对象,JVM会给我们创建一个单独的对象,在反序列化时,JVM创建对象并不会调用任何构造函数。为了反序列化一个对象,我们需要让我们的类实现Serializable接口。如:ObjectInputStream in = new ObjectInputStream (new FileInputStream("data.obj")) Student stu3 = (Student)in.readObject()

求java用接口创建对象的实例

import java.lang.Math
public class N20{
public static void main(String[] args){

Rectangle r1=new Rectangle(3,5) //实例化对象,使用所在类方法
System.out.println("(Rectangle) Diagonal=" r1.getDiagonal())
System.out.println("(Rectangle) Are=" r1.are())

Square s1=new Square(2)
System.out.println("(Square) Diagonal=" s1.getDiagonal())
System.out.println("(Square) Are=" s1.are())

/*
EqualDiagonal e1=new Rectangle(3,5) //利用接口
System.out.println("(Rectangle) Diagonal=" e1.getDiagonal())
Rectangle r1=new Rectangle(3,5)
System.out.println("(Rectangle) Are=" r1.are())
EqualDiagonal e2=new Square(2) //利用接口
System.out.println("(Square) Diagonal=" e2.getDiagonal())
Rectangle r2=new Square(2) //利用多态
System.out.println("(Square) Are=" r2.are())
*/

}
}
class Rectangle implements EqualDiagonal{
protected double side1
protected double side2

Rectangle(double side1,double side2){
this.side1=side1
this.side2=side2
}

public double are(){
return side1*side2
}
public double getDiagonal(){
return Math.sqrt(side1*side1 side2*side2)
}
}
class Square extends Rectangle implements EqualDiagonal{
Square(double side){
super(side,side) //父类构造方法需要2个参数
}
public double are(){
return super.are()
}
public double getDiagonal(){
return Math.sqrt(2)*side1
}
}
interface EqualDiagonal{
double getDiagonal()
}

最新文章