JavaSE----static关键字的用法

来源:互联网 发布:java poi api下载 编辑:程序博客网 时间:2024/05/22 16:04

static关键字可以用于修饰属性、方法,还可以修饰类

1、static修饰属性:

对于普通的属性:

public class StaticTest {
public static void main(String[] args) {
MyStatic mystaic1 = new MyStatic();
MyStatic mystatic2 = new MyStatic();
mystaic1.a = 10;
System.out.println(mystatic2.a);
}
}
class MyStatic
{
int a;
}

输出结果:0;

mystatic1与mystatic2是MyStatic的两个相互独立的对象,每个对象都有一个a,相互间的操作不影响

对变量a之前加上static进行修饰:

public class StaticTest {
public static void main(String[] args) {
MyStatic mystaic1 = new MyStatic();
MyStatic mystatic2 = new MyStatic();
mystaic1.a = 10;
System.out.println(mystatic2.a);
}
}
class MyStatic
{
static
int  a;

}   

输出结果:10;

对于属性a用static进行了修饰,不管MyStatic生成了多少个实例,这些实例共同的拥有这一个唯一的static的成员变量a,a在内存中只有一份;一个实例对该静态成员变量进行了修改,其他实例的该静态成员变量的值也会随之发生变化

此时在进行访问a时,就不需要在生成a所属类的实例,可直接用“类名.成员变量”的方式进行访问,即:MyStatic.a(Java推荐使用这种方式来访问) 

2、static关键字修饰方法:即将一个方法声明为静态方法

对于普通的方法,我们进行访问的方式:

public class StaticTest {
public static void main(String[] args) {
MyStatic mystatic = new MyStatic();

mystatic.print();
}
}
class MyStatic
{
public void print()
{
System.out.println("hello");
}
}

输出结果:hello;

对于静态方法的访问:

public class StaticTest {
public static void main(String[] args) {
MyStatic.print();
}
}
class MyStatic
{
public
static void print()
{
System.out.println("hello");
}
}

对于静态方法可以使用类名.方法名的方式来访问。

3、static修饰类:一般情况下static修饰成员变量和成员方法,但是static还有一种比较特殊的用法就是修饰内部类。普通类是不可以声明为static的,只有内部类可以。被static修饰的内部类可以直接作为一个普通类来使用,但是不需要产生外部类的实例

class MyStatic
{
static class MyInnerStatic
{
public MyInnerStatic() {
System.out.println("I'm a Inner Class ");
}
}
}

调用的时候:new MyStatic.MyInnerStatic();//不需要生产MyStatic的实例

关于内部类的用法详见内部类讲解

4、static的继承

public class StaticTest {
public static void main(String[] args) {
MyStatic2 static2 = new MyStatic2();
static2.print();   //MyStatic2.print();
}
}
class MyStatic1
{
public static void print()
{
System.out.println("MyStatic1");
}
}
class MyStatic2 extends MyStatic1
{
public static void print()
{
System.out.println("MyStatic2");
}
}

输出结果:MyStatic2


public class StaticTest {
public static void main(String[] args) {
MyStatic
1 static1 = new MyStatic2();
static
1.print();;
}
}
class MyStatic1
{
public static void print()
{
System.out.println("MyStatic1");
}
}
class MyStatic2 extends MyStatic1
{
public static void print()
{
System.out.println("MyStatic2");
}
}

输出结果:MyStatic1

父类子类的同名方法都用static修饰时,父类的该方法将会被隐藏,子类不能重写

静态方法只能继承,不能重写(Override)

如将父类的方法声明为static,而子类的同名方法声明为普通方法,则会编译错误:

public class StaticTest {
public static void main(String[] args) {
MyStatic1 static1 = new MyStatic2();
static1.print();  
}
}
class MyStatic1
{
public static void print()
{
System.out.println("MyStatic1");
}
}
class MyStatic2 extends MyStatic1
{
public void print()
{
System.out.println("MyStatic2");
}
}

错误信息:MyStatic2中的output()无法覆盖MyStatic1中的output();被覆盖的方法为static

public class StaticTest {
public static void main(String[] args) {
MyStatic1 static1 = new MyStatic2();
static1.print();  
}
}
class MyStatic1
{
public  void print()
{
System.out.println("MyStatic1");
}
}
class MyStatic2 extends MyStatic1
{
public static void print()
{
System.out.println("MyStatic2");
}
}

编译错误: MyStatic2中的output()无法覆盖MyStatic1中的output();覆盖的方法为静态


静态的方法不能被覆盖,被覆盖的方法也不能是静态的,也就是说只要是静态的就不能覆盖。子类与父类在声明时要吗是全都是静态的要吗就是全都不是静态的

0 0
原创粉丝点击