你的位置:首页 > Java教程

[Java教程]java学习笔记四:static的几个角落及小谈多态

最近有点事情,没有及时更新笔记,学习不可弃,总结一下最近的学习,其中重点是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各个不同的子类,这样就可以实现父类的一种打印操作分别打印不同的图形了。