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各个不同的子类,这样就可以实现父类的一种打印操作分别打印不同的图形了。