您的位置:首页 > 编程语言 > Java开发

Java基础知识复习(static关键字)

2018-03-08 15:09 274 查看
Q:为什么需要static关键字的存在?有什么作用呢?
A:Java是面向对象的,但若处于某种特殊情况下,通常是实用方法,则不需要类的对象。static这个关键字可以标记出不需要实例的方法。
static的特点(静态变量)
1、static是一个修饰词,用于修饰成员。
2、static修饰的成员被所有的对象所共享。
3、static优先于对象存在,因为static的成员随着类的加载就已经存在了。
4、static修饰的成员多了一种调用方式,可以直接被类名所调用(如:类名.静态成员)
5、static修饰的静态变量是共享数据,而对象中的成员变量是特有数据
成员变量和静态变量的区别?
1、生命周期不同
     成员变量随着对象的创建而存在,随着对象的被回收而释放。
     静态变量随着类的加载而存在,随着类的消失而消失。
2、调用方式不同
     成员变量只能被对象调用。
     静态变量可以被对象调用,还可以被类名直接调用。
3、别名不同
     成员变量也称为实例变量。
     静态变量称为类变量。
4、数据存储位置不同
     成员变量数据存储在堆内存的对象中,所以也叫对象的特有数据。
     静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据。
5、影响范围不同
      成员变量,每个对象一个。

      静态变量,每个类一个。
static使用的注意事项:
1、静态方法只能访问静态变量。(非静态方法既可以访问静态变量,又可以访问非静态变量)
2、静态方法中不可以使用this或者super关键字!
3、主函数是静态的。
主函数特殊之处:public static void main(String[] args)
1、格式是固定的。
2、被JVM所识别和调用。
public 因为权限必须是最大的
static  不需要对象的,直接用主函数所属类名调用即可
void   主函数没有具体的返回值
String[] args    主函数的参数列表,是数组类型的参数,而且元素都是字符串类型public static void main(String[] args)//new String[0]
{
System.out.println(args);// ([Ljava.lang.String;@4554617c)
System.out.println(args.length);// 0
}static关键字在什么情况下使用?
1、静态变量
分析对象中所具备的成员变量的值是否都相同?
如果都是相同的,那么这个成员变量可以被static修饰;
如果存在不相同的情况,那该成员变量将是对象的特有数据,必须用非静态存储在对象中。
2、静态方法
函数是否能用静态修饰,参考一点,就是该方法功能是否需要访问非静态的成员变量
如果需要,则该方法是非静态的;
如果不需要,则将该方法定义成静态的。虽然也可以定义成非静态的,但是非静态方法的调用需要创建对象,而该对象的创建是没有意义的,因为并没有用到实例变量。(静态的方法是可以在无关特定类的实例情况下执行的,即可以不用创建对象直接调用静态的方法,用法:类名.静态成员。因为静态的方法是通过类的名称来调用,所以静态的方法无法引用到该类的任何实例变量)class Fair
{
String length;
static String color = "black";
Fair(String length)
{
this.length = length;
}
//非静态方法
public void work()
{
System.out.println("长度:"+length);
}
//静态方法
public static void work2()
{
System.out.println("颜色:"+color);
}
}
public class text1 {
public static void main(String[] args)
{
//new Fair("long").work();
Fair p = new Fair("long");
p.work();
Fair.work2();
}
}总结:
1、静态的方法不能调用非静态的变量。(静态的方法不知道堆上有哪些实例)
2、静态的方法不能调用非静态的方法。
Q:如果从静态方法调用非静态方法,但此非静态方法没有用到实例变量,这样可以通过编译吗?
A:不可以。如果子类继承覆盖了这个方法成有用到实例变量,则会矛盾。
3、静态变量的值对同一类的所有的对象来说都是相同的,共享一份静态变量。
静态代码块
随着类的加载而执行,而且只执行一次
作用:用于给进行初始化
构造函数是对对象进行初始化class StaticCode
{
static
{
System.out.println("hahha");
}
void show()
{
System.out.println("show");
}
}
public class StaticCodeDemo {
public static void main(String[] args)
{
new StaticCode().show();
new StaticCode().show();
}
}显示:
hahha
show
show
构造代码块,可以给所有对象进行初始化的(通用性)
构造函数是给对应对象进行针对性的初始化(针对性)
private Person(){}
如果类中的方法都是静态的,所以该类是不需要创建对象的,为了保证不让其他创建该类对象,可以将构造私有化
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: