java学习---第四篇static关键字以及主函数定义

1,static关键字

用法:

是一个修饰符,只能用于修饰成员(成员变量,成员函数)。对象的共有属性数据可以存储为static。

当成员被静态修饰后,就多了一个调用方式,除了可以被对象调用,还可以被类名调用(类名.静态成员)。

class Person{
<span style="white-space:pre">	</span>String name;//实例变量
<span style="white-space:pre">	</span>static String country = "CN"//类变量
}
class StaticDemo{
<span style="white-space:pre">	</span>public static void main(String[] args){
<span style="white-space:pre">	</span>Person p = new Person();
        // 两种调用方式
<span style="white-space:pre">	</span>System.out.println(p.country);
<span style="white-space:pre">	</span>System.out.println(Person.country);
<span style="white-space:pre">	</span>}
}
<strong>实例变量和类变量的区别:</strong>
1,存在位置。类变量随着类的加载而存在于方法区(数据区)中,实例变量随着对象的建立而存在于堆内存中。
2,声明周期。类变量生命周期较长,随着类的消失而消失;实例变量生命周期随着对象的消失而消失。
<strong>static特点:</strong>
1)随着类的加载而加载,也就是所静态会随着类的消失而消失。说明它的生命周期最长。上例中,当类加载到内存中时,country="CN<span style="font-family: Arial, Helvetica, sans-serif;">"也已经被加载到了内存的数据区中,而只有创建对象时才会有</span><span style="font-family: Arial, Helvetica, sans-serif;">name属性。</span>
2)优先于对象存在
3)被所有对象所共享
4)可以直接被类名所调用
<strong>静态的使用注意事项:</strong>
1,静态方法只能访问静态成员(方法和变量)。非静态方法既可以访问静态也可以访问非静态。
2,静态方法中不可以定义this,super关键字。因为静态优先于对象存在,而this指代对象所以静态方法中不可以出现this字样。
3,主函数是静态的
4,当创建了对象后,静态方法可以访问该对象的非静态成员
<pre name="code" class="java">class Person{
	public String name;
	public static String country = "CN";
	public static void show(String a){
		System.out.println(a);
	}
}
class staticDemo{
	public static void main(String[] args){
		Person p = new Person();
		p.name = "zhai";
		p.show(p.name);
	}
}


 
<strong>静态有利有弊:</strong>
利处:对对象的共享数据进行单独空间的存储,节省内存空间,没有必要每个对象中都存储一份。
      可以直接被类名调用。
弊端:生命周期过长
      访问出现局限性(静态只能访问静态)
<span style="font-size:12px;">2,主函数 public static void main(String[] args),格式是固定的</span>
主函数:是一个特殊的函数,作为程序的入口,可以被jvm调用
主函数的定义:
public:代表该函数访问权限是最大的。
static:代表主函数随着类的加载就已经存在了。
void:主函数没有具体的返回值。虚拟机调用主函数,目的是执行程序,所以不用返回值。
main:不是关键字,但是是一个特殊的单词,可以被jvm识别为主函数。
(String[] args):<span style="font-family: Arial, Helvetica, sans-serif;">函数的参数,字符串类型的数组。</span>
<span style="font-family: Arial, Helvetica, sans-serif;">jvm在调用主函数时,默认传入的是new String[0];</span>
<span style="font-family: Arial, Helvetica, sans-serif;">
</span>
3,什么时候使用静态
1)当对象中出现共享数据<span style="font-family: Arial, Helvetica, sans-serif;">时,该数据被静态修饰。对象中的特有数据要定义为非静态存在于堆内存中。</span><span style="font-family: Arial, Helvetica, sans-serif;">(共享数据指的是属性的值。张三李四都有姓名属性,但各自姓名不同所以不定义姓名属性为静态。但张三李四国籍都是中国,属于共享数据所以国籍定义为静态)</span>
<span style="font-family: Arial, Helvetica, sans-serif;">2)当功能内部没有访问到非静态数据(对象的特有数据),则该功能可以定义成静态的。</span>

class Person{
	public String name;
	public static String country = "CN";
<span style="white-space:pre">	</span>//show()方法中并没有对象的特有数据,所以要定义成静态。这样调用show()时,支持Person.show()的调用方式
	public static void show(){
		System.out.println("haha");
	}
<span style="white-space:pre">	</span>//showName()方法中含有name这个对象的特有数据,所以不能定义成static。
<span style="white-space:pre">	</span>public void showName(){<span style="font-family: Arial, Helvetica, sans-serif;">	</span>
<span style="white-space:pre"></span><pre name="code" class="java"><span style="white-space:pre">		</span>System.out.println(this.name);
 
<span style="white-space:pre">	</span>}
}
4)静态的应用
每个应用程序中都有共性的功能,可以将这些功能进行抽取,独立封装,以便复用。
eg:数组工具类的创建。
class ArrayTool{
<span style="white-space:pre">	</span>private ArrayTool{}
<span style="white-space:pre">	</span>public static void max(int arr[]){
<span style="white-space:pre">		</span>......( 求最大值代码)
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span><pre name="code" class="java"><span style="white-space:pre">	</span>public static void sort(int arr[]){
<span>		</span>......( 排序代码)
<span>	</span>}
<span style="white-space:pre">	</span>......(其他功能)
 
class ArrayDemo{
<span style="white-space:pre">	</span>public static void main(String[] args){
<span style="white-space:pre">		</span>int[] arr = {1,55,66,22,36,54}
<span style="white-space:pre">		</span>ArrayTool.max(arr);
<span style="white-space:pre">	</span>}
上例中有两点需要注意:
1)所有功能都定义为静态,使用功能时采用的是:类名.方法名(参数)的方式。因为工具类中每个方法的定义并没有用到对象(这里指的是工具类的对象)的特有数据,这个方法处理的数据是作为参数传进来的数据。所以在使用该方法时没有必要创建工具类的对象,因此使用<span style="font-family: Arial, Helvetica, sans-serif;">类名.方法名(参数)的方式即可,将方法设置成静态。</span>
<span style="font-family: Arial, Helvetica, sans-serif;">2)将构造函数私有化。这样迫使该类无法再创建对象。因为工具类一般是对传进来的参数进行计算,方法都设为静态,基本用不到对象。所以这里将构造函数私有化则似的该类只能使用</span><span style="font-family: Arial, Helvetica, sans-serif;">类名.方法名(参数)的方式进行调用。</span>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值