今天来对java进行一个系统上的理解,这部分内容相对抽象,不好理解,因为比较散乱,所以写日志的思路了不是很明了,但愿至少能让人看懂。
书中的已经总结出的11个特性
简单性 可移植性 面向对象
解释型 网络技能 高性能
健壮性 多线程 安全性
动态性 体系结构中立
§简单性
书中阐述了java相较于C++而言的一些优势和借鉴
关于简单的另一个方面是小。Java基本的解释器及类支持大约仅为40KB;加之基础的标准类库和对线程的支持(基本上是一个自包含的微内核)约需要增加175KB。这使java能够很好地在小型机器上独立运行。
§面向对象
对象的概念相对抽象,有句话相当经典——万物皆对象。确实,几乎所有的事物都可以被看成对象,如显视器,它就好比java中的System.out.print()能够给用户显示出需要的数据。
关于面向对象的概念,应该是编程语言将重点放在数据/对象和对象的接口上(没什么编程基础,对面向方法的语言根本不了解)
§网络技能
Java有一个扩展的例程序库,用于处理像HTTP和FTP这类的TCP/IP协议。Java应用程序能够通过URL打开和访问网络上的对象,其便捷程度就好像访问本地文件一样。
§健壮性
没有编程经验,所以对于这一特性没有什么概念
§安全性
学习Java还并不深入,所以对于java都有哪些安全特性还不很清楚。书里陈述了数字签名类,通过数字签名类,可以确定类的作者。若信任该作者,这个类就可以在机器上拥有更多的权限。
§体系结构中立
不懂,木有办法,囧
§可移植性
这个无非是在夸赞java中二进制数据以固定的格式进行的存储和传输,消除了字节顺序的困扰。
§解释型
Java解释器可以在任何移植了解释器的机器上执行Java字节码。链接是一个增值且简便的过程,所以,开发过程也变得更加快捷,更加具有探索性。
§高性能
个人感觉没有什么说明的必要性,略过。
§多线程
多线程带来更好的交互响应和实时行为。
§动态性
不懂,略过。
首先我觉得我应该先感谢视频里老师直白易懂的语言,真心觉得看书真的是很难理解,不懂的主要原因还是专业知识的匮乏。
现在我是理解对象与类的概念的,具体举例,如杯子可以被描述为一个类,其具备储存饮料的功能或者说是特性(属性),酒杯、茶杯或者马克杯等等,则是通过该类事物杯子的共享属性具体形成的个体即对象。
人们都很喜欢玩游戏,我觉得通过游戏也可以很好的说明对象与类之间的关系。比如在游戏中,我们需要建立游戏角色,玩家们建立角色就是类,这个类包含了名称、性别、职业、或者游戏系统中的一些基础参数,而玩家们建立的一个个游戏角色就是对象。
其实对于对象的理解个人觉得不必要特别地通过实例来进行理解,人对于事物的认知过程本身就会自发地进行抽象化,要不然也不会在具有相同特性的事物产生联想。
先撇开Java的特性不谈,学编程什么是最重要的?当然是思想!而且这个思想的作用域不仅仅在编程领域,可以说思想是作用于方方面面的。不管做什么事,首先我们需要知道我们的需求是什么?比如说我们需要喝水,首先我们得知道水源,河水,湖水,地下水还是家中的自来水,然后是用什么方式喝水,饮用水是否安全等等一系列问题,而那些问题都是因为我们喝水的需求而纳入考虑的,所以不管什么,知道自己要什么,才是第一位,个人觉得,也许这种思想,正是面向对象的一种体现吧。喝水的例子可能还不够深入,比如说一个人,他从小的梦想就是当一个程序员或者从事相关职业,他甚至没有成为一名程序员的方法,但他会为了这种需求而去思考,如何去为了这种需求而行动,然后通过不断地尝试和努力,他会想到通过学习,通过想象等等。当然成为程序员早就有一堆的方法摆在人们面前了,但如果他的这种需求并不是已知的,甚至是尚未存在的,那么这种思考的过程便成为了一种创造的行为,如果能够深入理解这种思想,那么无论是编程学习还是其他的,那种热情便会源源不断!
又扯远了… …文字一多了就想抒下情,囧。
关于书中对于面向对象程序设计的概述
面向对象程序设计(简称OOP)是当今主流的程序设计范型,它已经取代了70年代的“结构化”过程化程序设计开发技术。Java是完全面向对象的,必须熟悉OOP才能够编写Java程序。
面向对象的程序是由对象组成的,每个对象包含对用户公开的特定功能部分和隐藏的实现部分。程序中的很多对象来自于标准库,还有一些是自定义的。
类(class)是构造对象的模板或蓝图。由类构造(construst)对象的过程称为创建类的实例(instance)。可以说对象是类的一个实例。
用Java编写的所有代码都位于某个类的内部。标准的Java库提供了几千个类。
封装(encapsulation,有时称为数据隐藏)是与对象有关的一个重要概念。从形式上看,封装不过是将数据和行为组合在一个包中,并对对象的使用都隐藏了数据的实现方式。对象中的数据称为实例域(instance fields),操纵数据的过程称为方法(method)。对于每个特定的类实例(对象)都有一级特定的实例域值。这些值的集合就是这个对象的当前状态(state)。无论何时,只要向对象发送一个消息,它的状态就有可能发生改变。
类之间的关系
在类之间,最常见的关系有
l 依赖(“uses-a”)
l 聚合(“has-a”)
l 继承(“is-a”)
书中以一个订单处理系统来说明类的三种关系。
在建立这个订单系统时,创建以下类
u 商品(Item)
u 订单(order)
u 送货地址(Shipping address)
u 付款(Payment)
u 账户(Account)
商品项目被添加到订单中。订单被发送或取消。订单货款被支付。“添加”、“发送”、“取消”以及“支付”,都要标识出主要负责完成相应动作的对象。
依赖(dopendence),即“uses-a”关系,是一种最明显的、最常见的关系。如果一个类的方法操纵另一个类的对象,我们就说一个类依赖于另一个类。
用上面的例子进行说明,假如Order是否被生成取决于账户是否已经付款,但Item类不依赖于Account类,因为商品对象与客户账户无关。
实际应用中,应当尽可能地将相互依赖的类减至最少。如果类A不知道B的存在,它就不会关心B的任何改变(这意味着B的改变不会导致A产生分生任何bug)。
聚合(aggregation),即“has-a”关系,是一种具体且易于理解的关系。聚合关系意味着类A的对象包含类B的对象。
例如,Order对象中包含一些Item对象。
继承(inheritance),即“is-a”关系,是一种用于表示特殊与一般关系的。如果类A扩展类B,类A不但包含从类B继承的方法,还拥有一些额外的功能。(这个在之后的日志里用较多篇幅来说明)
显然对于类与对象,我使用了大量的文字,其实从代码来理解其关系是非常直观的。
能过基础测试题中的这一题来看。
5、定义一个学生类,需要有姓名,年龄,考试成绩三个成员属性.属性(成员变量)需要私有并提供get, set方法,可以通过构造函数进行初始化。
先撇开私有、get、set方法和构造函数,先来创建这么一个学生类。
class Student
{
String name;
int age;
double score;
}
这就是一个具有姓名,年龄和考试成绩的学生类,由此类构造出的对象都具有这三种属性。
上面的类中,name;age;score这三个变量在Student类中被称为成员变量,作用于整个类中,而像之前学习的for()中定义的变量叫做局部变量,作用于方法(函数)或语句中。
接下来说明下构造函数(书中又称构造器)
以上面的Student类为例。
class Student
{
String name;
int age;
double score;
void show()
{System.out.println("name:"+name+";age:"+age+";score"+score);}
}
class StuRun
{
public static void main(String[] arge)
{
Student a= new Student();/**/
a.show();
}}
Student类中并没有直接写出构造函数,但这并不代表其不存在,此句代码一旦被执行,就会调用类中隐式的构造函数Student(){},其参数默认为空,这点从运行结果就可以看出。
name:null;age:0;score0.0
构造函数与类名同名,在创建该类的对象时,构造函数就会被调用,以便将实例域初始化为所希望的状态。
与其他方法(函数)的一个重要的不同,构造函数总是伴随着new操作符的执行而被调用,而不能对一个已经存在的对象调用构造函数来达到重新设置实例域的目的。
当然,我们也可以自定义构造函数,使得我们在建立对象时其初始化值为我们预设的值。如
Student()
{
name="Jack";
age=15;
score=60.0;
}
这样我们在Student a= new Student()时,a的name、age和score属性就不再是name:null;age:0;score0.0 而是 “Jack” “15”和“60.0”。
因为构造函数也是函数,所以其可以被重载,即其可以被重载为可以传递参数的构造函数。