java学习之路--static,this,代码块,内存的划分等--java实战经典第五章

来源:互联网 发布:hadoop2.6 windows 编辑:程序博客网 时间:2024/06/14 04:09
7.引用传递:指堆内存空间的使用权交给多个栈内存空间


8.this关键字(重点,必须百分百掌握)
        this 的作用有以下三点:
        (1):表示类中属性
        (2):可以使用this来调用类的构造方法
        (3):this可以代表当前对象
代码:


public class SZJDTest4 {
                        private String name;
                        private String password;
                        public String getName() {
                                return name;
                        }
                        public void setName(String name) {
                                this.name = name;
                        }
                        public String getPassword() {
                                return password;
                        }
                        public void setPassword(String password) {
                                this.password = password;
                        }
                        
}


这里的this就是代表类中属性




public class SZJDTest4 {
                        private String name;
                        private String password;
                        public String getName() {
                                return name;
                        }
                        public void setName(String name) {
                                this.name = name;
                        }
                        public String getPassword() {
                                return password;
                        }
                        public void setPassword(String password) {
                                this.password = password;
                        }
                        
                        
                        public SZJDTest4(String password) {
                                
                                this.password = password;
                        }
                        public SZJDTest4(String name, String password) {
                                this(password);
                                this.name = name;
                                
                        }
                        
                        
                        
}
构造方法中的this就是代表可以调用构造方法,这里调用的是哪个只有password的构造方法。


注意:在调用构造方法的时候,this必须放在第一行。 还有就是在调用构造方法的时候一定要留一个出口,不用所有的构造方法都调用this




public class SZJDTest4 {
                public String getInfo(){
                        System.out.println(this);
                        return null;
                }
        public static void main(String[] args) {
                SZJDTest4 szjdTest4=new SZJDTest4();
                System.out.println(szjdTest4);
                System.out.println("看看是否一样");
                szjdTest4.getInfo();
                
        }
                        


结果:
test.SZJDTest4@128f6ee
看看是否一样
test.SZJDTest4@128f6ee




9.比较两个对象是否相等,首先要比较地址是否一样,如果一样,这一定相等,如果不一样就要一个一个属性的比较。


10. static关键字


属性别创建就是在栈内存和堆内存开辟空间,而堆内存用来存储属性。如果现在有些属性需要被所有人共享,就必须声明为static属性。方法也一样。


static声明的属性也叫全局属性(静态属性)


看下代码,就知道了




public class SZJDTest4 {
          int age;
          String name;
          
       String country="成都";


        public SZJDTest4(int age, String name) {//构造方法用来赋值
                this.age = age;//this属性用来指定是类属性
                this.name = name;
        }
          public void info(){
                  
                  System.out.println("姓名:"+this.name+" 年龄:"+this.age+" 城市:"+country);
          }
          
          public static void main(String[] args) {




                SZJDTest4 szjdTest4=new SZJDTest4(50, "张三");
                SZJDTest4 szjdTest=new SZJDTest4(55, "王五");
                SZJDTest4 szjdTest1=new SZJDTest4(58, "李四");


                
                szjdTest4.info();
                szjdTest1.info();
                szjdTest.info();
        }
          
                        
                        
}
结果:
姓名:张三 年龄:50 城市:成都
姓名:李四 年龄:58 城市:成都
姓名:王五 年龄:55 城市:成都




上面的代码为了简单没有进行封装,也没用三个属性的构造方法,这里就是为了说明如果是三个属性的构造方法,我修改一个城市属性,是不是要把每个实例都要修改,这显然是不行的,所以这里就要用static属性




public class SZJDTest4 {
          int age;
          String name;
          
static  String country="成都";


        public SZJDTest4(int age, String name) {//构造方法用来赋值
                this.age = age;//this属性用来指定是类属性
                this.name = name;
        }
        public void info(){
                  
                  System.out.println("姓名:"+this.name+" 年龄:"+this.age+" 城市:"+country);
          }
          
          public static void main(String[] args) {
                SZJDTest4 szjdTest4=new SZJDTest4(50, "张三");
                SZJDTest4 szjdTest=new SZJDTest4(55, "王五");
                SZJDTest4 szjdTest1=new SZJDTest4(58, "李四");
                SZJDTest4.country="上海";
                
                szjdTest4.info();
                szjdTest1.info();
                szjdTest.info();
        }
          
                        
                        
}
结果:
姓名:张三 年龄:50 城市:上海
姓名:李四 年龄:58 城市:上海
姓名:王五 年龄:55 城市:上海


这里只需要用类来修改一下就OK了,最好不要用属性来调用


这里补充一点知识:内存区域的划分:


                        内存区域一般可以划分为四个区域:
                                        (1)栈内存空间:保存所有对象的名称(更形象的说是保存了引用堆内存的空间地址)
                                   (2)堆内存空间:保存没个对象属性的具体内容
                                   (3)全局数据区:保存static类型的数据
                                   (4)全局代码区:保存所有的方法定义
补充说明:非static的方法可以去调用static的方法或者属性,但是static声明的发放不能去调用非static的方法或者属性,你想一下就是,不是全局属性的可以去调用全局属性,这个很好理解三,但是全局属性能掉不是全局属性的属性吗?不能。还可以这样理解,所有的属性,方法,必须在对象在堆内存中开辟了空间才能调用(除了static的属性和方法),然而static的方法可以不实例化,直接被类调用


11.代码块:


代码块可以分为四类:普通代码块,静态代码块,同步代码块,构造块


public class SZJDTest4 {
        //定义构造块
        {
                System.out.println("构造块");
        }
        static{
                System.out.println("定义静态块");
        }
        
        public SZJDTest4(){
                System.out.println("定义构造方法");
        
        }
        public static void main(String[] args) {
                new SZJDTest4();
                new SZJDTest4();
                new SZJDTest4();
        }
                        
                        
}
结果:
定义静态块
构造块
定义构造方法
构造块
定义构造方法
构造块
定义构造方法


说明:最先加载的是静态代码块,再是构造块,再是构造方法。而且静态代码块指在程序运行的时候加载一次