疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

static的几个角落及小谈多态


 

   

  对于static,主要有两点是我所学习的。

  1、首先简单的介绍一下static的定义。static是静态的意思,就是说这个类变量或者类方法不需要实例化就可以使用。使用static的变量是类变量,也成为静态域(static field)。这些是static的基本语义,了解了这些,继续向下看。

  java核心技术(卷一)对于静态有这样一段描述:“如果将变量定义为static,每个类都只有一个这样的变量。”

  这句话怎么理解呢,语言上表述是这样的,在一个main方法中,类变量(静态类)是所有对象所共享的(共享的意思有点像指针,你操作其中一个去改变数值,其他的数值都会发生改变)。这就是上面说的一个类只有一个这样的变量。

  在具体的代码中会更直接。我定义一个Test的类:

  public class Test{

  public static int age;

  public int a;

  }

  在Test类中有一个静态的int型变量age和一个非静态变量a。

  现在,下面的测试类中初始化3个Test对象,分别为t1,t2,t3;将t1的age设定为10,a设定为5,那么t2的age,a以及t3的age和a分别是多少呢?

  复制代码

  public class TetsT{

  public static void main(String[] args){

  Test t1=newTest();

  Test t2=new Test();

  Test t3=new Test();

  t1.age=10;

  t1.a=5;

  system.out.print(t1.age+" "+t2.age+" "+t3.age);

  system.out.print(t1.a+" "+t2.a+" "+t3.a);

  }

  复制代码

  结果是,t1.age=t2.age=t3.age=10;

  而t1.a=10;t2.a=0;t3.a=0;

  原因不用解释了吧,正如上面所说的,在一个main中一个类的类变量是共享的。这也是类变量危险的地方,尽量不要把静态的暴露出来,可能会对程序产生影响。

  2、静态变量在继承中是什么结果呢?

  由于有了上面的铺垫,直接写出一个例子,有father类和继承father的son类。结构很简单。

  复制代码

  public class father {

  public static int a=1;

  }

  public class son extends father{

  }

  复制代码

  father有静态的类变量a,son继承了father,这样son有father的静态变量a。

  现在的问题是这个静态变量有两种可能,一是father与son共享,或者是son自己私有的。写下面的代码验证:

  复制代码

  public class test {

  public static void main(String[] args) {

  father f1 = new father();

  father f2 = new father();

  father f3 = new father();

  father f4 = new son();

  son s1 = new son();

  f1.a=100;

  System.out.println(f1.a);

  System.out.println(f2.a);

  System.out.println(f3.a);

  System.out.println(s1.a);

  son s2=new son();

  s2.a=50;

  System.out.println(s2.a);

  System.out.println(s1.a);

  System.out.println(f1.a);

  System.out.println(f2.a);

  }

  }

  复制代码

  打印的是什么呢?在上一行中打印的都是100,下一排打印的都是50。

  得出结果,继承类,其父类的静态方法仍是与子类共享的关系。不论是父类还是子类对其值进行修改都会影响到其他对象的值。

  3、说完static,简单的说下我对多态的学习。

  多态是指一个方法名,多个行为结果。这是多态的定义。

  我感觉多态最核心的一句话是多态的实现。

  多态是通过重写(覆盖)override和方法重载overload来实现的。这句话看起来很平淡,其实不是,它包含了多态最重要的东西。

  举个例子,假如现在需要使用类的思想,打印等腰三角形、直角三角形、正方形。这样设计。

  首先设计一个超类图形类,他有一个变量n,用来存储需要打印的图形行数,还有一个方法,用来执行打印操作。

  三个子类等腰三角形、直角三角形和正方形继承超类图形。此时选择重写打印操作,为每一个子类写自己的打印操作。

  在测试类中,我们声明一个超类图形类,可以给他new各个不同的子类,这样就可以实现父类的一种打印操作分别打印不同的图形了。