zoukankan      html  css  js  c++  java
  • Java 基础入门随笔(8) JavaSE版——静态static

    面向对象(2)

    this:代表对象。代表哪个对象呢?当前对象。

    当成员变量和局部变量重名,可以用关键字this来区分。

    this就是所在函数所属对象的引用。(简单说:哪个对象调用了this所在的函数,this就代表哪个对象。)

    this也可以用于在构造函数中调用其他构造函数。注意:只能定义在构造函数的第一行。因为初始化动作要先执行。

            例如:person(String name){this.name = name;}

                      person(String name,int age){this(name);this.age = age;}

    一般在本类对象中用到了本类的对象,通常都是用this。

    static:

    特点:1.static是一个修饰符,用于修饰成员。

              2.static修饰的成员为所有的对象所共享的。

              3. static优先于对象存在,因为static的成员随着类的加载就已经存在了。

              4.static修饰的成员多了一种调用方式,就是可以直接被类名所调用,如:类名.成员变量。

              5.static修饰的数据是共享数据,对象中的存储的时特有数据。

    注意:成员变量也称实例变量;static修饰的变量称为静态变量或叫类变量。

    成员变量与静态变量的区别:

    1.两个变量的生命周期不同。

       成员变量随着对象的创建而存在,随着对象的回收而被回收释放;

       静态变量随着类的加载而存在,随着类的消失而消失。

    2.调用方式不同。

       成员变量只能被对象调用;

       静态变量可以被对象调用,还可以被类名调用(推荐)。

    3.别名不同。

       成员变量称为实例变量;

       静态变量称为类变量。

    4.数据存储位置不同。

    成员变量数据存储在堆内存的对象中,所以也叫对象的特有数据。

    静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据。

    静态使用的注意事项:

    1.静态方法只能访问静态成员。(非静态既可以访问静态,又可以访问非静态)(说明:注意此处针对同一个类的环境下,静态方法只能调用本类中的静态成员)

    2.静态方法中不可以使用this或者super关键字。

    3.主函数是静态的。

    静态什么时候用?

    1.静态变量。

       当分析对象中所具备的成员变量都是相同的,这时这个成员变量可以被静态修饰。

       只要数据在对象中都是不同的,那就是对象的特有数据,必须存储在对象中,是非静态的。

       如果是相同的数据,对象不需要做修改,只需要使用即可,不需要存储在对象中,定义成静态的。

    2.静态函数。

    函数是否用静态修饰,只要参考一点,就是该函数功能是否有访问到对象中的特有数据。

    简单点说,从源代码看,该功能是否需要访问非静态的成员变量,如果需要,该功能就是非静态的,如果不需要,就可以将功能定义为静态的。

    当然,也可以将该功能定义成非静态,但是非静态需要被对象调用,而仅创建对象调用非静态的没有访问特有数据的方法,该对象的创建时没有意义的。

    主函数特殊之处:

    1.格式是固定的;2.被jvm所识别和调用。

    public:因为权限必须是最大的。

    static:不需要对象的,直接用主函数所属类名调用即可。

    void:主函数没有具体的返回值。

    main:函数名,不是关键字,只是一个jvm识别的固定的名字。

    String[] args:这是主函数的参数列表,是一个数组类型的参数,而且元素都是字符串类型。(可在调用主函数时传入,例如:java mainDemo xx yy zz 即为传入了3个元素的字符串数组)

    静态代码块构造代码块局部代码块:

    静态代码块:随着类的加载而执行。而且只执行一次。作用:用于给类进行初始化。

    构造代码块:随着对象的创建而执行,对象创建几次即调用几次。作用:可以给所有对象进行初始化的。(与构造函数的区别:构造函数是给对应的对象进行针对性的初始化。而构造代码块对象初始化的通用性。)

    局部代码块的作用:限定局部变量的生命周期。

    三者的调用顺序如下:

    class StaticCode
    {
    	static int num ;
    	//静态代码块 (首先执行)
    	static 
    	{
    		num = 10;
    //		num *=3;
    		System.out.println("hahahah");
    	}
    	StaticCode(){}
    
    	static void show()
    	{
    		System.out.println(num);
    	}
    }
    
    class Person
    {
    	private String name;
    	
    	
    
    	{//构造代码块。可以给所有对象进行初始化的。(如有调用对象,即其次调用,与局部代码块视情况而定)
    
    		System.out.println("constructor code ");
    //		cry();
    	}
    	
    	static 
    	{
    		System.out.println("static code");
    	}
    	
    	Person()//是给对应的对象进行针对性的初始化。 
    	{
    		name = "baby";
    //		cry();
    	}
    	Person(String name)
    	{
    		this.name  = name;
    //		cry();
    	}
    	public void cry()
    	{
    		System.out.println("哇哇");
    		
    	}
    
    	public void speak()
    	{
    		System.out.println("name:"+name);
    	}
    
    	static void show()
    	{
    		System.out.println("show run");
    	}
    }
    
    
    class StaticCodeDemo 
    {
    	static
    	{
    //		System.out.println("a"); //先执行
    	}
    	public static void main(String[] args) 
    	{
    
    //		Person p = null;
    //		p.speak();
    
    //		Person.show();
    //		Person p1 = new Person();
    //		p1.speak();
    //		Person p2 = new Person("旺财");
    //		p2.speak();
    //		new Person();
    		
    
    //		new StaticCode().show();
    //		new StaticCode().show();
    //		StaticCode.show();
    //		System.out.println("b");	//后执行
    	}
    }
  • 相关阅读:
    [对android程序作代码混淆]
    用smali实现Android apk的简单汉化
    防止java反编译的一些常用方法
    http抓包工具推荐WSockExpert/httpwatch/HttpAnalyzer/DebugBar
    JSP动态网站环境搭建应用中的详细步骤(Tomcat和Apache/IIS的整合)
    22、Secondary Tiles
    21、磁贴和磁贴通知(tile)(下)
    19、Context Menu
    代码管理工具
    20、磁贴和磁贴通知(tile)(上)
  • 原文地址:https://www.cnblogs.com/Anand/p/4946318.html
Copyright © 2011-2022 走看看