java初学者获得的一些知识点

范围:java编程思想 第五章~第十一章
本人是java初学者,作为初学者的建议,一开始需要读java核心技术,个人感觉java编程思想套路过深,满满的细节,很不容易读懂。

1.初始化与清理

1.1.类的初始化

java中,当要创建一个新的类的时候,一定要首先初始化它(initialize())。所以需要构造器:来初始化新创造了类。创造完构造器后,每次新创造一个对象,系统会自动调用构造器,而不需要我们自己去调用。
注:构造器的名字要和类的名字一样,而且不需要返回值。
如果没有构造器的话,java文档通常会使用术语无参构造器。但是如果你创建了一个构造器了的话,就不能在调用无参构造器了,否则系统就会报错。在java中,初始化创建捆绑在一起,两者不可分离。

1.2.方法重载

当创建一个对象时,也就给此对象的分配到的存储空间取了一个名字。以后通过使用名字,就可以引用所有的方法和对象。
当想要将一个对象以多种方式创建的时候,构造器的方法重载就派上了用场。
区分重载方法:根据参数类型列表来区分。每一个重载的方法都必须有一个独一无二的参数类型列表。 至于想要根据返回值来区分方法的,因为返回值不一定是需要的,所以这不是一个区分的好标准。

1.3.this关键字

当一个方法被多个对象调用时,方法如何知道是谁调用了自己呢?实际上是编译器暗自把“所操作的对象的引用”作为第一个参数传递给了方法
利用这个机制,就创造了一个关键字:this。this只能在方法内部使用,表示对调用方法的那个对象的引用
static:static方法没用this的方法。在static方法的内部不能调用非静态方法。
对于垃圾的清理,java特有的垃圾回收器会自动帮我们消除没有用的对象,所以我认为在此处不必深究。

1.4.成员的初始化

当一个基本数据类型没有被初始化时,就会被置为0。当一个对象没有被初始化时,就会被置为null。
切记:在构造器初始化之前,自动的初始化已经完成。
静态数据的初始化:无论创建多少个对象,静态数据都只占用一份存储空间。静态的初始化只在对象首次加载的时候进行一次。初始化的顺序:先是静态对象,然后是非静态对象。

1.5.枚举类型

在枚举方法中有一个整形常量集,且均按照大写字母表示(因为是常量)。
注:对于直接print(对象)的时候。因为所有对象都是继承自object。而object中有一个方法toString。这个方法能够在打印的时候自动调用这个方法。

2.访问权限控制

java设置了访问权限修饰词:public,protected 和private

2.1.包:库单元

包内包含有一组类,它们在单一的名字空间之下被组织在了一起。
java可运行程序是一组可以打包并压缩为一个java文档文件(JAR)的.class文件。

2.2.三个访问权限修饰词

如果不添加任何权限,那么默认是“包访问权限”。即在一个包内所有其他类对那个成员都有访问权限。但仅限于包内的类。

public:
public之后紧跟着的成员声明自己对每个人都是可用的。不论在不在一个包内。
private:
除了包含该成员的类以外,其他任何类都无法访问这个成员。
private可以阻止别人直接访问某个特定的构造器。
protected:
包内的其他类和自本类继承出去的类均可以访问这个类。
publicprotected均具有包访问权限。

2.3.接口和类的访问权限

访问权限的控制常常称为是具体实现的隐藏
如果希望某个类可以为某个客户端程序员所用,就可以用关键字public
一些限制:
1.每个编译单元都只能有一个public类。即每个编译单元都有单一的公共接口。
2.public类的名称必须和该编译单元的文件名完全相同。

3.组合和继承

组合:只需在新的类中产生现有的类的对象。由于新的类是由现有类的对象所组成,所以被称为组合。
继承:无需改变现有类的形式,采用现有类的形式并在其中添加新的代码,编译器可以完成大部分的工作。

3.1.组合语法

个人感觉组合就是在函数中调用函数,和在C中的函数调用没有什么区别。
在这个再次强调print(对象)会调用该对象的toString语法,并在显示屏中显示。

3.2.继承语法

继承是所有OOP(面向对象编程)和java语言不可缺少的组成部分。
除非已明确指出要从其他类中继承,否则就是在隐式地从Object继承。
class one extends two{}
其中one是继承类,two是基类。
java用super关键字表示这个对象所继承的对象。上面的对象中用super的话就是在引用two
既然继承来的也是对象,所以也是需要初始化(构造器)的。在这里也需要将基类也给初始化了。在这里分两个条件:
1.如果基类的构造器没有参数列表或者想调用没有参数列表的构造器的话,那么java会自动在导出类的构造器中插入对基类构造器的调用。
2.如果想调用有参数列表的基类构造器的话,那么需要使用super关键字了。
**注:构造过程是从基类向外构造的。**而消除是从外向基类消除的。

3.3.向上转型

继承将继承类和基类之间建立了联系。
由于新类(继承类)完全继承了基类的所有的方法,而且可能会覆盖基类的某个方法,也可能会添加某个新方法。所以基类所具有的接口,继承类都具有。所以有时可以从一个专用类型(继承类)向较通用类型(基类)转换。

3.4.final关键字

个人感觉,final指定了一个引用对象一旦指定了一个存储位置,那么以后不能再更改存储位置了,但是在这个存储位置上改变值域还是有可能的。接下来按照书上的知识看一下:
书中讨论了final应用的三种情况:数据,方法,类。
final数据
对一个永不改变的编译常量和不希望改变的值可以使用这个关键字。
在java中,这类常量必须是基本类型,并且是以关键字final表示。对这个常量定义的时候,必须对其赋值。
一个既是static又是final的域只占据一段不能改变的存储空间。
对于基本类型,final使数值恒定不变(在这里我认为因为基本类型都是immutable的,所以既不能改变值,又不能改变存储空间)。而对于对象引用,final使引用恒定不变
final方法
使用final方法的情况:把方法锁住,以防止任何继承类修改它的含义。(确保在继承中使方法行为保持不变,并且不会被覆盖。)
注:类中所有的private方法都隐式地指定为final。
如果在继承类中仍固执地使用覆盖的话,那么创造的方法不会覆盖原方法,编译器也不会报错,但会创造一个新的方法,进而得到一个错误的结果。
final类
当将某个类的整体定义为final时,就表明你不打算继承该类,也不允许别人这样做。由于final类禁止继承,所以final类中所有的方法都是隐式指定为final的。

4.多态

自己的理解:基类接受所有继承类的回归

4.1.忘记对象类型

如果为一个基类创造了一个接口,那么接下来的继承类也能使用这个接口。这样提供了一个便利,那就是每当新创建了一个对象之后,不用为它再创建一个新的且和前面的方法相像的新方法。
那么方法怎么知道是继承类还是基类调用了它呢?这就用到了绑定的概念。
绑定:将一个方法同一个方法主体关联起来。
解决的办法是后期绑定,就是在运行时根据对象的类型进行绑定。
java中除了static和final方法之外,其他所有方法都是后期绑定。

4.2.复杂的构造器

对于复杂方法的构造器要遵循下面的顺序:
0.在任何其他事物发生之前,将分配的对象的存储空间初始化成二进制的零。
1.调用基类构造器。这个步骤会不断反复递归下去,首先是构造这种层次结构的根,然后是下一层导出类,等等,直到最底层的导出类。
2.按声明顺序调用成员的初始化方法。
3.调用导出类构造器的主体。

5.接口

接口和内部类为我们提供了一种将接口实现分离的更加结构化的方法。

5.1.抽象

java可以提供一个叫做抽象方法的机制。这种方法是不完整的,仅有声明而没有方法体。
例: abstract void f();
如果一个类包含一个或多个抽象方法,该类必须被限定为抽象的。
如果想从一个抽象类中继承出一个对象,那么必须为基类中的所有的抽象方法提供方法定义。
例:
abstract class f{}
class g extends f{}

5.2.接口

interface这个关键字产生一个完全抽象的类,没有提供任何具体的实现。
它允许创建者确定方法名,参数列表和返回类型,但是没有任何方法体。
想创建一个接口,需要用interface关键字来代替class关键字,且如果不想只具有包访问特权的话,就在interface前面加上public
例:
interface f{}
class g implements f{}

5.3.多重继承

因为接口是根本没有任何具体实现的,也就是说,没有任何与接口相关的存储,因此,就无法阻止多个接口的组合。
extends可以引用多个基类接口,只需用逗号将接口名一一分隔开即可

6.持有对象(个人感觉这章最有用了)

数组有一个短处,就是必须要有固定的尺寸,在一般情况下,在写程序之前并不知道要使用多少个对象,所以java库提供了很多的容器。

6.1.List

有两种类型的List:
ArrayList:可以很快访问随机元素,但是中间插入和移除元素很慢。
LinkedList:可以很快在中间插入或删除元素,但是在随机访问元素方面较慢。
ArrayList
add():添加某个元素。
remove():删除某个元素。
subList():从较大的列表中创建出一个片段。
contains():判断是否含有这个对象。
retainAll():将两个List做交集操作。
isEmpty():判断是否为空。

LinkedList
peek():返回列表的头元素。
removeFirst():删除表头的元素。
addFirst():向表头添加元素。

6.2.Set

Set不保存重复元素。
HashSet出于速度原因的考虑,使用了散列技术。
TreeSet存储在红黑树的结构中。
LinkedHashSet因为查询速度的原因也使用了散列技术。
其中HashSet中的元素没有顺序,其他两个有顺序。

6.3.Map

Map包含关键字(key)和值(value)。可以通过containsKey()和containsValue()来测试一个Map。

6.4.Queue

队列遵循先进先出。
offer():将一个元素加入队尾。
remove():将队头的元素删除并返回这个元素。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值