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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

一、Static(静态)关键字
static用于修饰成员(成员变量和成员函数)
被修饰后的成员具备以下特点:
1.随着类的加载而加载:当类加载到内存中时,静态成员已经在内存中。也就是说静态会随着类的消失而消失,说明它的生命周期最长。
2.优先于对象存在:静态先存在,对象后存在
3.被所有对象共享
4.除了可以被对象调用,还可以直接被类名调用(写法:类名.静态成员)
使用注意:
1.静态方法只能访问静态成员,非静态方法既可以访问非静态,也可以访问静态。
2.静态方法中不可以写this,super关键词。因为静态优先于对象存在
3.主函数是静态的
为什么不将变量都写成静态的呢?
因为静态变量的生命周期太长了,对象用完以后这些静态变量还存在于内存汇总,这样会对内存的消耗很大。
实例变量和类变量的区别:
1.存放位置:
类变量存放于方法区中。
实例变量存放于堆内存中。
2.生命周期
类变量生命周期最长,随着类的消失而消失。
实例变量生命周期随着对象的消失而消失。
静态的好处:对对象的共享数据进行单独空间的存储,节省空间。没有必要每个对象中都存储一份。
可以直接被类名调用。
静态的弊端:生命周期过程。访问出现局限性。(静态虽好,但只能访问静态)
思考两个问题:
什么时候定义静态变量(类变量)?
当对象中出现共享数据时,该数据被静态所修饰。
对象中的特有数据要定义成非静态存在于堆内存中。
什么时候定义静态函数?
当功能内部没有访问到非静态数据(对象的特有数据),那么该功能可以定义成静态的。
实例:
class Person
{
     String name;
     public void show()
     {
           System.out.println("haha");
     }
}
class PersonDemo
{
      public static void main(String[] args)
     {
         Person.show();
      }
}
二、主函数main
主函数是一个特殊的函数。作为程序的入口,可以被JVM调用。
主函数的定义:
public:代表着该函数访问权限是最大的。
static:代表主函数随着类的加载就已经存在了。
void:主函数没有具体的返回值。
main:不是关键字,但是是一个特殊的单词,可以被JVM识别。
(String[] arr):函数的参数,参数类型是一个数组,该数组中的元素是一个字符串。字符串类型的数组。(唯一能改的就是括号中参数名)
主函数是固定格式的:JVM识别。
JVM在调用主函数时,传入的是new String[0];
示例:
class MainDemo
{
   public static void main(String[] args)
   {
       System.out.println(args.length);
       System.out.println(args[0]);
    }
}
在DOS中执行:java MainDemo demo1 demo2 demo3
结果:
3
demo1
三、帮助文档的制作
帮助文档通过注释/***/来完成,并且必须是被public修饰的类。将注释编写才对应的类或方法上方,并使用javadoc工具。javadoc -d(存放的位置) d:\(指定目录) -author(作者) -version(版本)
四、静态代码块
格式:
static
{ 静态代码块中的执行语句; }
特点:
随着类的加载而执行,只执行一次,并优先于主函数。用于给类进行初始化的。
示例:
class StaticCode
{
      static
      {
            System.out.print("a");
       }
}
class StaticCodeDemo
{
      static
      {
           System.out.print(”b“);
       }
      public static void main(String[] args)
      {
            new StaticCode();
            new StaticCode();//虽然又new了一个对象,但是类StaticCode已经加载到内存了所以static只执行一次。
            System.out.println("over");
      ]
      static
      {
             System.out.print("c“)
       }
}
结果:
cbaover
五、对象初始化的过程
Person p = new Person("lisi",20);
这句话都做了什么?
1.因为new用到了Person.class。所以会先找到Person.class文件并加载到内存中。
2.执行该类中的static代码块,如果有的话,给Person.class类进行初始化。
3.在堆内存中开辟空间,分配内存地址。
4.在堆内存中建立对象的特有属性。并进行默认初始化。
5.对属性进行显示初始化。
6.对对象进行构造代码块初始化。
7.对对象进行对应的构造函数初始化。
8.将内存地址付给栈内存中的p变量。
六、设计模式
是为了解决某一类问题最行之有效的方法
java中23中设计模式:
单例设计模式:解决一个类在内存只存在一个对象。
用代码体现:
1.构造函数私有化。
2.在类中创建一个本类对象。
3.提供一个方法可以获取到该对象。

饿汉式:
class Single
{
   private Single(){}
   Private static Single s = new Single();
   public static Single getInstance()
   {
         return s;
   }
}
懒汉式:对象是方法被调用时,才初始化,也叫做对象的延时加载。
class Single
{
   private Single(){}
   Private static Single s = null;
   public static Single getInstance()
   {
         if(s==null)
                 s=new Single();
         return s;
   }
}

开发一般用饿汉式,而懒汉式存在着一些小问题。如果多个人同时调用这个方法就会出现问题。
解决方案:synchronized(同步)
public static Single getInstance()
   {
         if(s==null)
         {
                synchronized (Single.class)
           {
                 if(s==null)
                        s=new Single();
           }
         return s;
       }
   }

12 个回复

倒序浏览
好认真啊加油!!!
回复 使用道具 举报
加油!多多向你们学习!!!
回复 使用道具 举报
对Static了解很深,很透彻。
回复 使用道具 举报
加油加油加油 对Static了解很深,很透彻。
回复 使用道具 举报
总结好所啊…………
回复 使用道具 举报
总结的很详细,还有实例,很不错
回复 使用道具 举报
顶一下。。。。。。。。
回复 使用道具 举报
顶一下。。。。。。。。
回复 使用道具 举报
很详细,非常好
回复 使用道具 举报
向学霸致敬啊:lol
回复 使用道具 举报
顶顶~~~感谢楼主分享
回复 使用道具 举报
好好看看,从里面发觉些信息
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马