Java基础---第六天 面向对象

来源:互联网 发布:迈卡威体测数据 编辑:程序博客网 时间:2024/04/29 03:37
一.Static关键字
    1、static 静态
        (1)、是一个修饰符,只能修饰成员(成员变量,成员函数),在内存中的共享区
        (2)、  static String s1 = "ddd";  //对象都能访问,共享,但是不在堆内存中
        (3)、当成员被静态修饰后,就多了一个调用方式,出了可以被对象调用外,还可以直接被类名调用, 方式为:  类名.变量名
    2、static 特点
        (1)、随着类的加载而加载,当使用类,或者加载到内存中是,这个 static 变量(静态成员变量,类变量)就会 存在,非static 变量(成员变量,实例变量),只有对象生成时候,才会加载
             也会随着类的消失而消失,声明周期最长
        (2)、优先于对象存在
        (3)、被所有对象所共享
        (4)、可以直接被类名所调用
        (5)、因为加载顺序原因,所以可以通过类名来调用static 变量,当有了对象后,才可以使用对象调用static变量
        (6)、因为生命周期长,性能,所以不可以全部定位 静态变量
    3、实例变量和类变量的区别
        (1)、存放位置
                类变量,随着类的加载而存在于方法区中。
                实例变量,随着对象的建立而存在于堆内存中(对象里)
        (2)、生命周期
                类变量声明周期最长,随着类的消失而消失、
                实例变量声明周期随着对象的消失而消失
    4、静态使用注意事项
        (1)、方法也可以使用 static 修饰,但是当方法中,有非静态 变量 时,编译会报错,
                因为直接使用 类名访问方法,所以就算使用 this,也不行,因为this 也是对象,但是现在没对象
                非静态方法,既可以访问静态,也可以访问非静态
        (2)、静态方法中不可以定义this、super关键字
                因为静态优先于对象存在,所以静态方法中不可以出现this
        (3)、主函数是静态的
    5、静态有利有弊
        (1)、利处:对对像的共享数据进行单独空间的存储,节省空间,没有必要一个对象中都存储一份
                 可以直接被类名调用
        (2)、弊端:生命周期过长
                    访问出现局限性,访问不了非静态。
二、main函数        public
    1、public static void main(String[] args)
    2、主函数:是一个特殊的函数,作为程序的入口,可以被jvm调用
    3、主函数定义:
        (1)、public:代表着该函数访问权限是最大的。
        (2)、static:代表着主函数随着类的加载就已经存在了
        (3)、void:主函数没有具体的返回值
        (4)、main:不是关键字,但是是一个特殊的单词,可以被jvm识别
        (5)、(String[] args):函数的参数,参数类型是一个数组,该数组中的元素是字符串,存储字符串类型元素的数组
    4、主函数是固定格式的:jvm识别
    5、可以有多个main函数,相当于重载,但是虚拟机只认那个固定格式的。
    6、public static void main(String[] args),只有 变量名可以改,args是变量名,可以任意
    7、jvm在调用主函数时,会传入 new String[0];        args jvm 会传个字符串数组,可以打印出来  [Ljava.lang.String;@6bbc4459
    8、可以手动给主函数传值   c:\java>java MainDemo first secoond    以空格分割,也可以直接调用主函数,传入字符串数组
三、静态什么时候使用 
    1、要从两方面下手,因为静态修饰的内容有成员变量和函数。
    2、什么时候定义静态变量
        (1)、当对象中出现共享数据时,该数据就可以被静态所修饰
        (2)、对象中的特有数据要定义成非静态存在于堆内存中
    3、什么时候定义静态函数
        (1)、当功能内部没有访问到非静态数据(对象的特有数据),那么该功能可以定义成静态的
四、静态的应用-工具类
    1、静态的应用
        (1)、每一个应用程序中都有共性的功能,可以将这些功能进行抽取,独立封装,以便复用。
        (2)、类名.函数名  或者  new 类名().函数名,或者 类名 对象名 =  new 类名().函数名; 对象名.函数名
        (3)、两个类,写成两个文件,只要了其中一个在自己的类里用到了另外一个,编译它的的时候,另一个也会编译,jvm 会先从 classpath寻找,找不到,从当前目录找
    2、可以考虑让程序更严谨,是不是需要对象,将函数 写为 static 通过类名直接调用
    3、将方法都静态后,可以方便于使用,但是该类还是可以被其他程序建立对象
    4、为了严谨,应强制让该类不能建立对象,可以通过将构造函数私有化,来完成
五、帮助文档的制作javadoc
    1、c:\java>javadoc -d doc -author -version Demo.java      doc 为目录,、
    2、该类必须写成 public 否则会报错
        c:\java>javadoc -d doc -author -version Demo.java
        正在装入源文件 Demo.java...
        正在构造 Javadoc 信息...
        javadoc: 错误 - 找不到可以文档化的公共或受保护的类
        1 错误
    3、只有设为 public 和 protect 的 函数 才会提取
    4、如果不写权限,则也不会提取
    5、一个类中会有一个默认的空构造函数,这个构造函数的权限和本类一致,如果该类被修饰为public,反之,该类没有被public修饰,则该构造函数也不为public
六、静态代码块
    1、格式
        static{
            静态代码块中的执行语句;
        }
    2、特点
        (1)、随着类的加载而执行,只执行一次,跟普通的 代码块 不同,普通的代码块是
        (2)、给类进行初始化
        (3)、先于主函数执行
        (4)、例子
           
[java] view plaincopy
  1. public class Demo{  
  2.                static{  
  3.                    System.out.print("a ");  
  4.                }  
  5.                {  
  6.                    System.out.print("d ");  
  7.                }  
  8.                public static void main(String[] args){  
  9.                    new Demo();  
  10.                    new Demo();  
  11.                    System.out.print("over ");  
  12.                }  
  13.                static{  
  14.                    System.out.print("c ");  
  15.                }  
  16.            }  


            会打印出 a c d d over ,因为类只加载一次,所以新建对象时候,不会运行
七、对象的初始化过程
    1、因为 使用对象 new 用放到了 该类,所以会先找到 该类文件 并加载到内存中
    2、执行该类中的 static 代码块,如果有的话,给 该类 进行初始化
    3、在堆内存中开辟空间,分配内存地址
    4、在堆内存中建立对象的特有属性,并进行默认初始化
    5、对属性进行显示初始化
    6、对对象进行构造代码快初始化
    7、对对象进行对应的构造函数初始化
    8、将内存地址赋给栈内存中的 对象 变量
八、对象调用成员过程
    1、类成员和类变量载入对内存中
    2、方法和静态变量载入到方法区中
    3、栈中的方法和变量 只是对堆内存的引用
九、设计模式:解决某一类问题最行之有效的方法,java中存在23种设计模式。
    1、单例设计模式:解决一个类在内存中只存在一个对象
        (1)、要想保证对象唯一
        (2)、为了避免其他程序过多建立该类对象,先禁止其他程序建立该类对象
        (3)、还可以为了让其他程序可以访问到该类对象,只好在本类中,自定义一个对象。
        (4)、为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式。
    2、实现
        (1)、将构造函数私有化,
        (2)、在类中创建一个本类对象
        (3)、提供一个方法可以获取到该对象
    3、主意
        (1)、对于食物该怎么描述,还怎么描述
        (2)、当需要将该事物的对象保证在内存中唯一时,就将以上的三步加上即可
    4、例子
       
[java] view plaincopy
  1. class Student{  
  2.            private int age;  
  3.            private Student(){}  
  4.            private static Student s = new Student();  
  5.            public static Student getInstance(){  
  6.                return s;  
  7.            }  
  8.            public void setAge(int age){  
  9.                this.age = age;  
  10.            }  
  11.            public int getAge(){  
  12.                return this.age;  
  13.            }  
  14.        }  
  15.        public class Demo{  
  16.            public static void main(String[] args){  
  17.                Student s = Student.getInstance();  
  18.                Student s1 = Student.getInstance();  
  19.                s.setAge(20);  
  20.                System.out.println(s1.getAge());  
  21.            }  
  22.        }  


    5、第二种单例模式
      
[java] view plaincopy
  1. class Student1{  
  2.           private int age;  
  3.           private Student(){}  
  4.           private static Student s = null;  
  5.           public static Student getInstance(){   //synchronized   
  6.               if(s==null)  
  7.                   synchronized(Student1.class){  
  8.                       if(s==null)  
  9.                           s = new Student();  
  10.                   }  
  11.               return s;  
  12.           }  
  13.       }  
  14.       public class Demo{  
  15.           public static void main(String[] args){  
  16.               Student s = Student.getInstance();  
  17.               Student s1 = Student.getInstance();  
  18.               s.setAge(20);  
  19.               System.out.println(s1.getAge());  
  20.           }  
  21.       }  


    6、两种区别
        (1)、第一种是先初始化对象,成为 饿汉式
        (2)、第二种是对象是被调用时,才初始化,也叫做对象的延时加载,称为,懒汉式。
        (3)、第一种是 类 一进入 内存,就已经创建好了对象
        (4)、第二种是 类 进入 内存,对象 还未创建 ,只有调用了 创建对象的方法时,才建立对象
        (5)、开发一般用 第一种,因为安全简单
        (6)、所以第二种 应该加上 关键字,相当于锁 synchronized,但是效率会很低,
        (7)、第二种解决方案,最终方案,是把 synchronized 放入,判断内,判断两次
        (8)、但是第二种依然会很慢,所以建议使用饿汉式
原创粉丝点击