设为首页 加入收藏

TOP

Java 回顾 ( Revisiting Java )(一)
2018-01-09 06:06:36 】 浏览:29
Tags:Java 回顾 Revisiting

最近在看一些工程代码,于是看了看设计模式,看设计模式之前发现Java是先修知识,又重新补了一遍Java,温故知新,获得一些新的体会。
本文不打算作为“Java知识点详细梳理”,“10分钟学会Java”之类的文章,仅作为博主自己的一个回顾,涉及的内容也无定法。

Java应该是目前用的最多的编程语言,以前觉得Java老要点点点(调用方法),变量名也很长,C++/Python很少代码写完的东西Java可能要写很多行……
觉得挺麻烦的,不过Java风靡自有其风靡的理由,在面向对象语言中她是一个标杆,虽然繁琐,但比较清晰,比较简单。

拿变量类型来说,Java只有两种变量类型,primitive主数据类型和引用数据类型。

Java中最关键的概念是面向对象,面向对象最关键的东西就是类和对象,所有的Java程序都定义在类中,你不能像python那样,打开.py文件就开始写东西,就可以执行了,也不像C++,定义一个main函数即可运行。在Java中即使main函数也要包括在类中。

为什么面向对象是核心内容?它的好处在哪呢?可以说,OO(面向对象)无处不在,OO使得我们很方便的扩展功能,而不需要重复写很多代码!另外,OO的设计思想其实是抽象思维的一种体现,它改变了我们设计程序的方式,我们不再是根据程序需要什么功能就开始从头到尾实现什么功能,我们更多考虑的是类和对象,程序包含几种类型的实体?有什么共同点?可以进行怎样的抽象?用继承还是接口?……

说说类和对象,类是对象的模板,类定义好“像我这样的人应该有什么状态,特征,能够做到那些事”,而对象具体化了类,真正获得了具体的状态,具体的特征,以及做某些事的方法。

我们说到,Java只有两种变量,primitive主数据类型和引用数据类型。主数据类型包括我们所指的int,double,float等等,这些不是对象。而引用变量是一个到对象的引用,相当于一个遥控器,指向堆上的某个对象,通过此引用可以获得对象,重新赋值此引用并不改变对象,只是引用指到了另一个对象上而已。没有对象变量,只有指向对象的引用变量。
==: 比较primitive主数据类型是否相同,或两个引用是否指向同一对象

话题回到面向对象,提到面向对象,不得不提其三大特性,这也是面试中经常会问到的,即封装,继承和多态。

  • 封装(encapsulation),即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;
  • 多态(polymorphism),一句话,“接口的多种不同的实现方式即为多态”,但是这个不太好理解,甚至我觉得它不够准确,因为光说接口是不是有点不够?换一种说法,多态即允许将子类对象的引用赋值给父类对象的引用,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。因为:编译器根据引用类型来判断可以调用哪些方法,而不是根据确实的类型。
  • 继承(inheritance) 是指一个对象直接使用另一对象的属性和方法,很简单,父类是球,子类是足球,那么足球可以直接使用“滚动”这个方法,如果需要特殊的“滚”,那子类自己实现就好了。

之所以继承放在最后讲,是因为我们关于继承有更多要说的。

【继承方法调用时的最近原则】调用对象引用的方法时,会调用到与该对象类型最接近的方法,就是说如果子类实现了某继承的方法,那就调用子类的,如果没有实现,那就往上找最近的实现的类的方法。

继承的IS-A测试,即“足球”IS-A“球”,总得满足这样的关系才好说继承,就像你不太好意思继承隔壁王叔叔财产。

继承的意义何在?这是显然的,首先避免了大量重复的程序代码,其次可以定义出一组共同的协议,所有继承者都需要满足这个协议,你知道,在很多时候大家遵守一些共同的规则是很重要的。

继承的一些使用建议:
1) 当某个类会比其父类更具有特定意义时使用继承
2)行为程序需要被多个相同基本类型的类共享时,考虑使用继承
3)集成并不一定是达成重用行为程序的最佳方式,具体可参见设计模式
4)继承结构并不匹配两者的关系,不要用继承
5)不能通过IS-A测试一定不要用继承

如果最高的父类不能抽象出一些对所有族类都使用的方法,或者不太好初始化,比如你不好新建一个“球”对象,它是啥球呢?地球还是足球?这样一些情况我们可以定义抽象类,它不能被初始化,只能被继承。。抽象类中可以定义抽象方法,抽象方法只存在于抽象类中,一个类只要有一个抽象方法,那他必是抽象类。

有时候,你会想要继承多个父类,以便使用更多的已有代码,但是不幸的是Java并不支持多重继承,要多重继承请关闭本文,搜索”C++”关键词谢谢。

为啥不支持多重继承呢?因为存在多重继承(继承多个类)的“致命方块”问题,即如果两个父类继承自同一个祖父类,都实现了某个方法,那么子类(如果没有实现该方法)该调用那个版本?

解决“致命方块”问题?接口!

接口是100%纯抽象类,每个方法都是抽象的,必须被实现。

如果想要定义出类可以扮演的角色,使用接口。

接下来从生物学的角度谈谈对象?什么是生物学角度??即生老病死~

对象生存在堆上(可以理解为垃圾堆,随时可能有人来回收…),引用变量或局部变量生存在栈上。

一旦一个对象,它的引用没有了或者离弃了它,那么他就可以等待被回收了。Java有一套垃圾回收机制(GC)保证对象的回收来腾出堆空间,有时候,GC又常常被人诟病,在大数据应用中常常面临这大量的shuffle,大量的对象,有时候需要花费大量的时间来做GC,体验不佳。

总的来说,对象的出生靠调用构造函数,生存在堆上,一旦没了引用,就向生命的终点走去,直到GC(黑白无常)带走了它。。

新建对象时,父类的构造函数先于子类被调用,以此类推,Object的构造函数先被执行,然后往下推,直到目标对象类型
(先有父母才有你)
只有当完全没写构造函数时,Java才会自动帮你写一个无参构造函数。
super()调用父类的构造函数,this是对对象本身的引用

谈谈实例变量,实例变量即对象的成员变量。

JAVA的实例变量具有如下特点:
1)实例变量声明在一个类中,但在方法、构造方法和语句块之外;
2)当一个对象被实例化之后,每个实例变量的值就跟着确定;
3)实例变量在对象创建的时候创建,在对象被销毁的时候销毁;
4)实例变量的值应该至少被一个方法、构造方法或者语句块引用,使得外部能够通过这些方式获取实例变量信息;
5)实例变量可以声明在使用前或者使用后;
6)访问修饰符可以修饰实例变量;
7)实例变量对于类中的方法、构造方法或者语句块是可见的。一般情况下应该把实例变量设为私有。通过使用访问修饰符可以使实例变量对子类可见;
8)实例变量具有默认值。数值型变量的默认值是0,布尔型变量的默认值是false,引用类型变量的默认值是null。变量的值可以在声明时指定,也可以在构造方法中指定;实例变量可以直接通过变量名访问。但在静态方法以及其他类中,就应该使用完全限定名:ObejectReference.VariableName。

你可能想问,如果Java中只有对象和primitive主数据类型,那么我想定义全局变量或者常量怎么办?比如PI=3.141592653589..(后面忘了)
这时候,静态变量可以帮你。静态变量定义在类中,它属
编程开发网

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇如何编写相对标准的后端项目 (一.. 下一篇一次 Maven 事故

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

最新文章

热门文章

C 语言

C++基础

windows编程基础

linux编程基础

C/C++面试题目