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

时间: 2024-10-16 06:30:16

java学习笔记四:static的几个角落及小谈多态的相关文章

Java学习笔记四:static关键字

1.static表示什么? static表示"全局"或者"静态"的意思.在Java中没有全局变量的概念,static 可以简单的理解为全局的,独立的一个功能. (1)当我们在使用 static 修饰成员变量或者成员方法的时候,通常会在Java内存中为这些变量或者方法指定了一块独立的区域(这块区域可能在栈中,也有可能在堆中). (2)如果静态的变量或方法在不出其作用域的情况下,其 引用句柄是不会发生改变的. (3)这块区域是内存共享的,它的引用都指向同一个位置,就是说

面向对象三大特征之封装与static——(Java学习笔记四)

面向对象     编程本质:以类的方式组织代码,以对象的方式组织(封装)数据 对象:具体的事物,某个类的对象(实例) 类:是对对象的抽象,用于描述同一类型的对象的一个抽象概念 对象和类的关系:特殊到一般,具体到抽象 三大特征: 封装 继承 多态 构造器:又叫构造方法(constructor),用于构造类的实例 格式:修饰符 类名(形参列表){ //语句 } 构造器的方法名与类名一致 通过new关键字调用 当没有定义构造方法时,系统会自定义一个无参构造函数 构造方法可以重载 作用:构造该类的对象,

java学习笔记之 static

java中的static 说明:这只是本人的学习java的个人心得与见解,分享出来,也算是自己的笔记.(本人小白,有错误的话望大神指出,不喜勿喷.-.-) 静态变量 – 在一个Java类中,可以使用static关键字来修饰成员变量,该变量被称作静态变量 – 静态变量被所有实例共享,可以使用“类名.变量名”的形式来访问 – static关键字只能用于修饰成员变量,不能用于修饰局部变量,否则编译会报错,下面的Demo是违反语法的. 1 public class Student{ 2 public v

Java学习笔记四(代码块 )

1 代码块的分类:java中的代码块是指使用{}括起来的一段代码,根据位置不同可以分为四种: 普通代码块 构造快 静态代码块 同步代码块 今天主要学习前三种代码块,同步代码块在学习到多线程部分的时候再加学习. 2 普通代码块:直接定义在方法中的代码块,如下: public class CodeSpace { public static void main(String args[]){ { int x = 30; System.out.println("普通代码块x="+x); } /

JAVA学习笔记(四十七)- 事件监听

定义ActionListener接口的实现类实现事件监听 import java.awt.Button; import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; /* * 事件监听 */ public class Te

JAVA学习笔记(四十九)- Swing相关组件

JFrame组件 import java.awt.Color; import javax.swing.JFrame; import javax.swing.JPanel; /* * Swing是在AWT基础上的扩展 * javax.swing包及其扩展包,组件的命名多以J开关 * * JFrame组件 */ public class Test08 { public static void main(String[] args) { JFrame frame=new JFrame("我的窗体&qu

JAVA学习笔记(四十三)- ThreadLocal

死锁 /* * 死锁:多个线程使用不同的锁,每个线程都需要另一个线程持有的锁 * 出现:同步的嵌套 * */ public class Test01 { public static void main(String[] args) { Tom tom = new Tom(); Alice alice = new Alice(); MyThread mt1 = new MyThread(tom, alice, true); MyThread mt2 = new MyThread(tom, alic

【Java学习笔记】static方法和非static方法的区别

static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法.被static修饰的成员变量和成员方法独立于该类的任何对象.也就是说,它不依赖类特定的实例,被类的所有实例共享.静态方法可以直接通过类名调用,任何的实例也都可以调用.因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法. 因此以下代码中,func_static方法只能访问num2成员,而func方法可以同

JAVA学习笔记(四十八)- 适配器类 Adapter

适配器类 Adapter,对接口中的抽象方法进行空实现 import java.awt.Button; import java.awt.Frame; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEve