黑马程序员技术交流社区
标题: 新手请教static和this的结合应用的问题(已解决) [打印本页]
作者: 余清兰 时间: 2012-6-14 10:43
标题: 新手请教static和this的结合应用的问题(已解决)
本帖最后由 余清兰 于 2012-6-14 13:43 编辑
lisi和zhangsan都有相同国籍,我不想给p和p1两个对象的成员变量都赋值”cn”,这样比较浪费内存资源,这时我想用static来让”cn”这个数据共享,就不用在堆内存的两个对象中都有成员变量cn,我写了下面代码,确实达到了输出时lisi和zhangsan的国籍都是cn的功效,但是这个功劳到底是static的还是this实现的呢?如果是this实现的,那我怎么改成让static实现,并且和this结合一起使用让代码写得更有意义呢?求详解,原理越深越细越好。
- class Person
- {
- private String name;//成员变量(实例变量)
- static private String country;//静态的成员变量(类变量)
- Person(String name)
- {
- this.country="cn";
- this.name=name;
- System.out.println(name+":"+country);
- }
- }
- class PersonDemo
- {
- public static void main(String[] args)
- {
- Person p = new Person("lisi");
- Person p1 = new Person("zhangsan");
- }
- }
复制代码
作者: 胡大强 时间: 2012-6-14 10:53
this 是指向当前对象的引用,他相当于对象。。。
static 是类的属性。。。。。。。static方法属于静态方法,静态方法中不存在当前对象,因而不能使用this。
所以static方法里面不能使用this~~~
作者: 余清兰 时间: 2012-6-14 10:56
胡大强 发表于 2012-6-14 10:53 
this 是指向当前对象的引用,他相当于对象。。。
static 是类的属性。。。。。。。static方法属于静态方法 ...
嗯知道了,一个先来后到的关系
作者: 李盼 时间: 2012-6-14 10:56
static定义的成员变量在内存中只有一份,你在构造方法中定义了this.country="cn";那么在第一次new对象的时候,构造方法会调用,给country赋值cn,第二次又会调用还是给country赋值cn。所以其实你不用这么写。
class Person{
private String name;//成员变量(实例变量)
static private String country="cn";//静态的成员变量(类变量)
Person(String name){
this.name=name;
System.out.println(name+":"+country);
}
}
作者: 涂金哲 时间: 2012-6-14 11:33
方法需要引用调用它的对象时,可使用this .当方法的形式参数和实例变量同名时,this 还能实现对实例变量的隐藏.如对name的引用。普通成员要对象才能访问,如果我们希望类成员独,static 可实现。当成员被定义为static 时在创建类的时候它已经存在,任何对象创建之前就可以被济问的,同时还可被类中的后来建立的对象访问。this 和super都是引用当前对象,所以静态中不可以出现。
作者: 柯玲 时间: 2012-6-14 12:08
类变量(static修饰的变量)随着类的加载而存在于方法区中,实例变量(this所指的变量)随着对象的建立而存在于堆内存中。
静态是先存在的,对象是后存在的。
所以你用static修饰国籍,那么在类加载时方法区中就存在"cn"这个值。
我觉得static private String country;这种写法不对,访问修饰符应该在最前面。
而成员方法所属于对象,必须通过调用对象拿到,输出又写在成员方法中,对象只起到拿到数据的作用。
总之从内存角度讲,country的值是先于对象存在的
作者: 柯玲 时间: 2012-6-14 12:15
漏讲了,既然已经给country声明为static,为什么不直接赋值,非要到构造函数里面重新赋值,写这个static不就没有意义了么,不如直接声明为private String country,加个static纯属多此一举。建议这样 static String country="cn";构造函数里面就不要再赋值了。下面是我的优化代码:- class Person{
- private String name;
- static String country="cn";
- Person(String name){
- this.name=name;
- System.out.println(name+":"+country);
- }
- }
- class PersonDemo{
- public static void main(String[] args){
- Person p=new Person("lisi");
- Person p1=new Person("zhangsan");
- }
- }
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |