Java-面向对象编程-几个关键字

经过前面几章的介绍。我们已经对面向对象编程的概念及相关的知识点进行了初步的介绍。也意味着我们的java-面向对象编程系列即将完结。也希望通过前面所介绍的内容能够对您有所帮助。今天,我们就来讲解关于在java编程中会遇上的几个比较常用的关键字。它们虽然不是面向对象的内容,但却像是粘合剂一般串联在整个项目中去。可以说,它们的存在是非常值得肯定的。我们自然也需要郑重而隆重的对它们进行介绍~
好了,闲话不说,下面有请第一位佳丽–>static小姐
关于static,其实我们在前面已经有见过了,如果忘记了的朋友可以翻看内部类的相关内容。那么,什么是static呢?static翻译过来是“静态的”,可以用来修饰类、属性或者方法。所以又叫“静态修饰符”。那么,static的作用是什么呢?它的最主要的作用就是去依懒性,什么意思呢?我们知道,在面向对象编程中,一般而言,数据或者方法都是依赖于一个个对象(实例)而存在的。比如说我们要知道老虎是怎么吃东西的。那么我们就要先创建出一个老虎对象,再调动老虎对象中的吃东西的方法。比如:

Tiger tiger = new Tiger();
tiger.eat();

那么,如果我们这个eat()方法是使用了static关键字进行定义的话,那么它就称作一个静态方法。当我们要调用它时,就不需要先new出一个tiger对象才能调用了,而是可以直接通过类名.静态方法的格式直接调用。如下:

Tiger.eat();

如此,便使得eat方法拜托了tiger对象的限制,也就是我们所说的去依赖性。那么,这个去依赖性是怎么实现的呢?我们从内存的层面来进行分析。首先,java程序是运行在jvm(java虚拟机)中并且由jvm为其分配相关内存的。而java的内存区简单来说可以分为以下几个部分:
这里写图片描述

其中,stack,也就是堆栈,存放的是我们的变量名,类名,方法引用等。而heap,也就是堆,存放的则是对象实例,也就是说,我们所new出来的对象,当然还有数组,都是集中存在这一块。而我们所说的常量、静态变量等一些信息则是存放在方法区(也有人叫静态区)中。因为该部分的内容过于超纲,所以在这里不多做阐述,有兴趣的朋友可以参考《Java虚拟机规范(第2版)》。我们通过以上的描述,可以用一个简单的图示来区别static和非static的区别:
这里写图片描述
注意:这个图只是为了引导理解,并不是真实的jvm存储结构,包括存储类型以及顺序结构

好了,我们继续理解static,我们假设eat()是静态方法,那么其所在的区域则为方法区。而sleep()为非static方法,那么其内存保存在堆内存中的tiger对象内。当我们需要调用sleep()方法时,首先就先new出一个tiger对象,使其加载到堆内存中,再进行调用。而我们要调用eat方法时,则不需new出对象,而是直接从堆栈的引用变量(Tiger)中直接指向eat方法即可。那么,原理何在呢?这就涉及到了static的一个关键特性:在类的加载过程中,被static修饰的静态对象、成员或者方法以及等最先被加载,并且静态代码块只会加载一次也就是说,被static的修饰的类,成员,方法以及代码块等会首先被加载到方法区中,并且会一直在方法区中保存,直到程序退出或者手动清除。从而减少了每次调用都要重新加载,导致内存被消耗的问题。因此,在一个程序中,我们也常在程序开始阶段,用静态代码块的方式去加载启动程序所需要的信息。比如我们在游戏开始前经常会看到的一个加载游戏信息局面。

好了,接下来,就是我们的第二位佳丽 –> final小姐
final 通常用来修饰一个常量,也就是说,被final修饰后的变量使不可以改变其值的。其主要特性主要有

final类不能被继承,没有子类,final类中的方法默认是final的。
final方法不能被子类的方法覆盖,但可以被继承。
final成员变量表示常量,只能被赋值一次,赋值后值不再改变。
final不能用于修饰构造方法。
    注意:父类的private成员方法是不能被子类方法覆盖的,因此private类型的方法默认是final类型的。

接下来出场的是第三位佳丽–>this小姐

this小姐使我们在以后的学习中经常会碰到的一个知识点了。它的含义可以理解为指向当前对象的引用。什么意思呢?我们在创建一个对象的时候,系统会默认分配一个引用来代表这个对象,这个引用就是this。那么,为什么要用这个this呢?我们来看一下例子:

public class Test1 {
    String name;

    public String getName() {
        return name;
    }
    public void setName(String name) {
    name = name;
    }   
    public static void main(String[] args) {
        Test1 test1 = new Test1();
        test1.setName("我是this小姐");
        System.out.println(test1.getName());
    }
}

运行以上代码,结果会是什么?请看:
这里写图片描述
你看,我们明明定义了setName()方法,为什么最终却还是为null呢?这是因为,我们在setName()方法中,因为我们的成员变量和局部变量是一致的,所以通过代码块的优先级,系统默认两个name都是局部变量。也就是说,我们的成员变量并没有发生任何的改变,自然就只能是null了。那么,怎么办呢?两种办法,要么,我们把局部变量名给改了,要么我们就要找到一个能够让系统知道属于成员变量的标志。这里就用了this。我们在生成这个test1对象的时候,系统默认为我们提供了一个this引用。我们可以通过这个引用来指向我们的成员变量,方法,构造方法等。比如this.name。修改后的结果如下:
这里写图片描述

好了,下面是我们的最后一位佳丽 –>super小姐
什么是super呢?从意义来解就是超级的意思。而在实际的应用过程中,它其实代表的是父类(也叫超类)。它主要存在子类方法中,用来指向子类对象中父类对象的属性,方法,以及构造方法(指向并不等于继承,构造方法是不可以被继承的)等。和this比较相似,只是指向对象不同而已。

好了,至此,我们的java-面向对象编程系列至此结束。希望博客内容对你有所帮助。我们下一系列的内容是java-java进阶篇。敬请期待。如果对文章有疑问的地方,可在下方评论探讨。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值