A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 何洪森 黑马帝   /  2012-2-8 17:24  /  2671 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 何森 于 2012-2-9 12:56 编辑

我知道public static final int i = 2 ;是说i是一个常量不能改变,那
先定义一个Person类 然后 public static final Person per = new Person() ;
该如何解释呢?虽然在网上看了,还不是太明白,难道真是说per只能指向
开始new出来的Person实例吗?不可一再次per=new Person()了?能看成
一个单例吗?

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

6 个回复

倒序浏览
final类不能被继承,以final修饰一个类,主要是出于安全性的考虑,例如String,它对于编译器和解释器的正常运行有很重要的作用,对它不能轻易改变,因此被修饰为final类,并非不能用new创建对象啊
回复 使用道具 举报
刚才审题大意,答非所问了。你说的是在创建对象时加final,这样则创建的对象的引用不能被修改,注意是对象的引用不能变,即对象在内存中的位置不能变,但对象中的内容可以变,比如说如果对象是个数组之类的容器,则数组里寸的数可以变

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
final修饰的成员变量必须在constructor (构造器)结束之前被赋予一个明确的值。下面这段代码会证明这个问题
class Something {   
   final int i;   
public void doSomething() {   
     System.out.println("i = " + i); 
   }}
如果是引用类型就是变量的指向不能变为其他对象,但是指向对象的内容是可以改变的

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
下面的代码展示了final变量的特性,它只能够赋值一次,一旦赋值无法再修改。但是,final变量指向的对象的值却是可以修改的,如下面的owner的name和age属性都可以修改,但是owner本身指向的对象在初始化之后不能修改了。

class Person {
  String name;
  int age;
}
public class TestFinal {
  private final Person owner;
  TestFinal() {
    owner = new Person();
  }
  public void modifyOwner(Person p) {
    //下面一行代码是修改final变量,将提示错误,无法修改owner.
    //owner = p;
   
    //下面两行是修改owner对象的值,这是可以的。
    owner.name = p.name;
    owner.age = p.age;
  }
}

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
难道真是说per只能指向,开始new出来的Person实例吗?不可一再次per=new Person()了?
是的 下面的程序中注释的部分如果加上就会报错。
就是说 p只能指向初始化时建立的对象,而这个对象中的值是可以被改变的

能看成一个单例吗?
个人感觉不能 单例的意思是一个类只允许建立一个对象
对于Person类还可以建立final Person p1=new Person(12);

代码如下:
class Test
{
        public static void main(String[] args)
        {
                final Person p=new Person(12);
                //p=new Person(23);
                p.setAge(20);
                System.out.println(p.getAge());
        }
}
class Person
{
        private int age;
        Person(int age)
        {
                this.age=age;
        }
        public int getAge()
        {
                return age;
        }
        public void setAge(int age)
        {
                this.age=age;
        }
}

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
public static final Person per = new Person() ;
这句代码是将Person 类型的变量per进行了限制,变量per不能再赋新值,即不能再指向其他的Person对象。
但Person还是可以创建对象的,只要变量名不与per相同即可。

单例设计模式:
饿汉式:
class Single{
      private static final Single single = new Single();
      private Single(){}  // 将构造函数私有化,禁止外界创建对象
      // 对外提供公共的得到对象的方法
      public Single getInstanse(){         
             return single;
      }

}


懒汉式:(延迟加载模式)
class Single{
      private static Single single ;
      private Single(){}  // 将构造函数私有化,禁止外界创建对象
      // 对外提供公共的得到对象的方法
      public Single getInstanse(){
             if(single!=null)
                    single=new Single();
             return single;

      }

}

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马