一、static(修饰方法,变量)
简单来说,成员变量(方法)加了static成为类变量(类方法),只分配一个空间;不加为实例变量,给每一个对象分配一个空间,之间互不影响
类方法不需要创建对象,使用时直接类名调用就可以;
类方法只能直接访问类变量或类方法参数,不能直接访问实例变量。非静态方法可直接访问本类中的静态变量和非静态变量
public class scope {
static int a;//类变量或静态变量
int b;//实例变量
public static void main(String args[]) {
a++;//main就是类方法,所以main中可直接访问a
System.out.println("a="+a);
scope s1=new scope();
s1.a++;
System.out.println("s1.a="+s1.a);
s1.b++;//b是实例变量,访问前需创建对象,使用对象的句柄访问
System.out.println("s1.b="+s1.b);
scope s2=new scope();
s2.a++;
System.out.println("s2.a="+s2.a);
s2.b++;
System.out.println("s2.b="+s2.b);
scope.a++;//类变量可通过类名访问,也可直接用对象名访问
System.out.println("最后");
System.out.println("a="+a);
System.out.println("s1.a="+s1.a);
System.out.println("s2.a="+s2.a);
System.out.println("s1.b="+s1.b);
System.out.println("s2.b="+s2.b);
}
}
public class scope {
static int a;//类变量或静态变量
int b;//实例变量
public static void main(String args[]) {//类方法main对变量及非静态方法test的访问(访问前先创建对象)
scope s1=new scope();
s1.test();//静态方法不能直接访问非静态方法,要先创建对象
test1();//静态方法相互调用就直接调用就好
}
static void test1()
{
a++;
System.out.println("a="+a);
scope s2=new scope();
s2.b++;
System.out.println("b="+s2.b);
}
void test()
{
a++;
System.out.println("a="+a);
b++;
System.out.println("b="+b);
}
}
二、final(修饰类,方法,变量)
1、修饰类,final修饰的类为最终类,不能被继承(出于安全考虑,保证类中的成员变量或方法不被恶意更改)
2、修饰方法,final修饰的方法为最终方法,不能被覆盖
3、修饰变量,final修饰的变量是字符常量,代表常量,在一次赋值后其值不能改变
final class first{
final int a=1;
final void t() {
System.out.println("a"+a);
}
}
class second extends first{//错误,不能继承
void t() {//错误,不能覆盖
a++;//错误,不能修改
System.out.println("a"+a);
}
}
三、abstract(修饰类,方法)
1、修饰类,修饰的是抽象类,即类中有些内容还没有定义完整,只是将头部分定义完整了。不能创建抽象类的对象,抽象类一般是用来做父类的,即可被其他类继承。
2、修饰方法,修饰的是抽象方法,只定义了方法头部,没有方法体;抽象类不一定有抽象方法,但含有抽象方法的类一定是抽象类
//abstract class father{}
abstract class father{
abstract void tt1();//内方法为abstract型,类前必须也加abstract
abstract void tt();
}
abstract class scope extends father{//子类中没有完全实现父类中的抽象方法,因此子类中有抽象方法存在,子类也应该定义为抽象的
void tt()
{
System.out.println("son");
}
public static void main(String args[])
{
scope s=new scope();
s.tt();
}
}