1.在使用new关键字创建某个类的实例对象时,构造方法抛出了异常,这时候,程序有没有在内存中创建出该类的实例对象呢?请说出理由!
2.对于一个类中的构造方法来说,是否要考虑与该类中的其他方法之间的线程安全吗?请说出理由!
3.如果程序中没有任何变量引用一个外部类对象,但有变量引用其中的内部类对象,请问外部类对象是否会被垃圾回收器回收?请说明理由!
2.对于一个类中的构造方法来说,是否要考虑与该类中的其他方法之间的线程安全吗?请说出理由!
3.如果程序中没有任何变量引用一个外部类对象,但有变量引用其中的内部类对象,请问外部类对象是否会被垃圾回收器回收?请说明理由!
public static void main(String[] args) {
Object obj=new Object("abc");
System.out.println(obj.getString());
}}
class Object{
private String string;
public Object(String string){
this.string=string;
try {
throw new Exception();
} catch (Exception e) {
}
}
public String getString() {
return string;
}
public void setString(String string) {
this.string = string;
}
}第二题,不用考虑与该类中的其他方法之间的线程安全,如果你用synchronized修饰构造方法会出现编译错误Illegal modifier for the constructor in type Object; only public, protected & private are permitted.
如果在构造方法内部写synchronized(this){//do something},这样是不会出错的,但是毫无意义,两个线程同时能生成对象,但是其中一个执行到synchronized(this){//do something}时会停滞,直到另一个线程执行完此代码块,但这样做并不能保证构造方法与其他方法之间的线程安全.
红字是不是指直接new的对象,而没有此对象的引用?like this
new Outer();
而不是
Outer outer=new Outer();
如果是不生成对象的意思,该问题是有问题的7楼好像是说的这意思
如果是new Outer();的话该对象不会被垃圾回收器回收public class Outer {
Outer.inner inner;
public void print(){
inner=this.new inner();
System.out.println(inner);
}
class inner{
}
protected void finalize(){
System.out.println(this+"被回收了");
}
public static void main(String[] args) {
while(true){
new Outer().print();//有inner对象输出是Outer对象还没被回收
}
}
}
因为还是能够被调用。public class InnerDemo05{
public static void main(String args[]){
Outer.Inner in = new Outer.Inner();
Outer out = new Outer();
String str = in.getName();
System.gc();
System.out.println(out.info);
in.fun();
}
}
class Outer{
String info = "hello";
static class Inner{
private String name;
public void fun(){
System.out.println("内部类");
}
public String getName(){
return name;
}
}
public void fun1(){
System.out.println("外部类");
System.out.println(info);
}
}
我的输出是Outer@1fa1bb6被回收了,如果内部类不是静态的,还没试public class AllTest{
public static void main(String args[]){
Outer.Inner in = new Outer.Inner();
Outer out = new Outer();
String str = in.getName();
out=null;
System.gc();
}
}
class Outer{
String info = "hello";
static class Inner{
private String name;
public void fun(){
System.out.println("内部类");
}
public String getName(){
return name;
}
}
public void fun1(){
System.out.println("外部类");
System.out.println(info);
}
protected void finalize(){
System.out.println(this+"被回收了");
}
}
关于第三问,下面这个我试了试内部类为public,非静态,这样必须与外部类联系起来,所以即使外部类的引用没了,可是估计他还被内部类给连着呢,所以没被回收(代码仅有细小改动)
public class AllTest{
public static void main(String args[]){
Outer out = new Outer();
Outer.Inner in = out.new Inner();
String str = in.getName();
out=null;
System.gc();
}
}
class Outer{
String info = "hello";
public class Inner{
private String name;
public void fun(){
System.out.println("内部类");
}
public String getName(){
return name;
}
}
public void fun1(){
System.out.println("外部类");
System.out.println(info);
}
protected void finalize(){
System.out.println(this+"被回收了");
}
}