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

posted @ 2015-04-27 23:32  谷粉  阅读(328)  评论(0编辑  收藏  举报