静态方法和静态成员

一、静态成员
1、Why?为什么要有静态变量、静态常量、静态方法
   有时候处理问题时需要两个类在同一个内存区共享一个数据,例如PI这个常量。静态数据和静态方法的作用通常是为了提供共享数据或方法,如
数学的计算公式等。
2、在静态方法中可以调用的方法和成员变量必须是静态的。如例:

StaticAccessNonStatic.java

package Test8;

public class StaticAccessNonStatic {
//方法info()没用static修饰,不是静态的。所以它是对象相关的方法而不是类相关的方法。
public void info(){
System.out.println("调用了info()方法");
}
public static void main(String[] args) {
//这样调用是 错误 的,因为这相当于this.info();main是静态方法,而info()是非静态方法。static修饰的方法中不能使用this引用,即静态成员不能访问非静态成员。
info(); 这里是 错误 的,如果运行该代码一定把这行注释掉
//如果确实需要在静态方法中访问一个普通方法,则创建一个对象
StaticAccessNonStatic sans=new StaticAccessNonStatic();
sans.info();
}

}

这是为什么呢?

我也是Java初学者。前几天在Core Java这本书里面看到的解释是:
静态方法实际是类的方法,而不是关于对象的方法。所以不是“可以不通过对象调用方法”,而是恰恰应该使用类来调用,而且鼓励这种写法,而不
是通过对象调用。即:静态方法不和对象相关,而是仅仅和类相关。
为啥呢?解释是这样的:在一般的类中定义的方法中,非静态类其实不仅仅有他们后面括号里面的显式参数(比如 public int getField(String 
param1, int param2)这个方法,显式参数是param1和param2),还包括一个隐式参数:即这个调用方法的对象(即this)。而静态方法,则没有这
个隐式的参数,仅仅就只有括号中的显式参数。
既然是因为静态方法不和对象关联,那么它就只能用同样仅仅和类关联而不和对象关联的实例域,毕竟不是静态的实例域在不同对象中基本上都是不
同的嘛。
3、Java中规定不能将方法体内局部变量声明为static
4、静态方法中不可以使用this关键字。Why? 
static方法类方法,先于任何的实例(对象)存在。即static方法在类加载时就已经存在了,但是对象是在创建时才在内存中生成。而this指代的
是当前的对象
,在方法中定义使用的this关键字,它的值是当前对象的引用.也就是说你只能用它来调用属于当前对象的方法或者使用this处理方法中
成员变量和局部变量重名的情况
.。而且,更为重要的是this和super都无法出现在static 修饰的方法中,static 修饰的方法是属于类的,该方法的调用
者可能是一个类,而不是对象.如果使用的是类来调用而不是对象,则 this就无法指向合适的对象.所以static 修饰的方法中不能使用this。这也与静
态成员不能访问非静态成员一致。

二:当想访问一个方法而不是构造方法时,可以将访问的方法设为static静态方法,然后直接使用类名.方法名就可以访问;如果在同一个类中,类名都可以省略,直接写方法名即可。

Test.java

package Test1;
//一个文件里面可以有多个类,但是只能有一个声明为public标识主类,且该主类里面必须有main()主方法,
class Person {
public String name="not know";//5   
public int age=0;//6
//父类Person的无参构造方法
public Person(){
}
//父类Person的有参数构造方法
public Person(String name,int age){//4
//注意调用完super后不会立马执行方法体里面的代码,而是转而执行在类定义时进行的变量初始化
this.name=name;//7
this.age=age;//8
}
public void showInfo(){//13
System.out.println("Name is :"+name+"Age is :"+age);
}
}
class Student extends Person{
//执行完父类的类定义时变量的初始化,会执行父类构造方法的方法体;然后再执行子类的类定义时变量的初始化
public String school="not known";//9
   //子类Student的无参构造方法
public Student(){
super();
}
//子类Student的有参构造方法
public Student(String name,int age,String school){//2
//在构造函数里,首先检查是否有this或super,二者只能出现其一,并且只能作为构造函数的第一句
//在子类的构造函数中调用父类的构造函数用super,并且把参数传递给父类的构造函数

super(name,age);//3
//执行完子类的类定义时变量的初始化,再执行子类构造方法的方法体
this.school=school;//10
}
//子类的方法,用它时需要调用。调用时用(对象名.方法名)方式
public void showInfo(){
super.showInfo();//12
System.out.println("School is :"+school);//14
}
}
public class Test {
public static void main(String[] args) {
//实例化对象stu,调用类Student的有参构造方法,并传递参数给构造方法
Student stu=new Student("wanghao",21,"qinghuadaxue");//1
//使用(对象名.方法名)调用showInfo()方法
stu.showInfo();//11
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值