java-基础2
1.6 封装
封装特点:
只能通过规定的方法访问数据
隐藏类的实例细节,方便修改和实现
包作用:
管理java文件
解决同名文件冲突
1)java中同一个包里不能存在同名类
2)包命名:域名倒叙+模块+功能,域名全部小写
3)加载类效率高的方式是import,“import 包名.*”:只能访问指定包名下的类,无法访问子包下的类
4)包名必须放在java源文件中的第一行
5)常用系统包
java.lang 包含java语言基础的类
java.util 包含java语言中各种工具类
java.io 包含输入、输出相关功能的类
1.7 内部类
在java中,将一个类定义在另一个类里面或者一个方法里面。包含内部类的类被称为外部类。
内部类分类:
成员内部类:普通内部类。内部类中定义的方法可直接访问外部类中的数据,不受访问控制符的影响。外部类不能直接使用内部类的成员和方法,需要借由内部类对象完成。内部类需要通过外部类对象来创建内部类实例。外部类和内部类具有相同成员时,内部类默认优先访问自己的成员;可通过“外部类.this.对象成员”以及“外部类.静态成员”的方式访问外部类成员。
静态内部类:其对象可不依赖于外部类,直接创建。不能直接访问外部类的非静态成员,但可通过“外部类对象.成员”方式访问。外部类中可通过“类名.成员名”方式直接访问内部类中静态成员。
方法内部类:定义在外部类方法中的内部类,也称局部内部类。只在其定义所在的方法的内部可见,只能在该方法内使用。不能使用访问控制符和static修饰符,可用final和abstract洗漱。
匿名内部类:将类的定义和创建放在一起完成。场景为:只用到类的一个的实例;类在定义后马上用到;给类命名并不会导致代码更容易被理解。原则:不能有构造方法,可通过构造代码块实现数据初始化;不能定义任何静态成员、静态方法;不能使用public、protected、private、static、abstract、final修饰;也是局部内部类,要满足所有局部类的所有限制。
作用:
- 提供更好的封装,可把内部类隐藏在外部类之内,不允许同一包中的其他类访问该类
- 内部类的方法可以直接访问外部类的所有数据,包括私有的数据
- 内部类所实现的功能虽然用外部类同样可以实现,可有时用内部类更方便
1.8 Object类
所有类的父类;
没有使用extends关键字明确标识继承关系的类,默认继承Object(包括数组);
Java中每个类都可以使用Object中定义的方法。
equals()方法:比较的是对象的引用是否指向同一块内存地址。
实现了equals(),就要实现相应的HashCode方法
1.9 继承
特点:
利于代码复用
缩短开发周期
继承的关系
满足“A is a B”的关系就可以行成继承关系
1) 继承的关键字是 extends
2) java中的类只能继承一个父类
3) 如果一个类没有显示的extends 关键字,则默认继承 Object类
方法重写和方法重载:
|
方法重写 |
方法重载 |
|
在满足继承关系的子类中 |
同一个类中 |
|
方法名、参数个数、顺序、返回值、类型与父类相同 |
方法名相同 参数个数、顺序、类型不同 返回值类型任意 |
|
访问修饰符的限定范围大于等于父类方法 |
访问修饰符任意 |
默认访问修饰符:本类、同包内的可以访问
关键字final
1) final修饰类时,可以和public互换位置,只要在class之前。
2) 修饰方法,不希望被重写,但是可以正常被子类继承使用。不能修饰构造方法。
3) 修饰变量,变量被赋值后不允许再被修改,变为常量。方法内的局部变量,只要在使用前被赋值即可,赋值后不可被修改。修饰成员变量时,1声明2构造方法3构造代码块中赋值。修饰引用类型的变量,初始化之后不能再指向另一个对象,但对象的内容是可变的。
4) 可配和static使用。修饰方法和变量。
5) 提高性能,降低可扩展性
1.10 多态
多态:允许不同类的对象对同一消息作出不同的响应。编译时多态(设计时多态如方法重载)、运行时多态。
必要条件:
满足继承关系;
父类引用指向子类对象。
向上类型转换(Upcast):子类型转换为父类型
父类引用指向子类实例。其实就是子类对象向上转型为父类类型。
隐式/自动类型转换,是小类型到大类型的转换,但是范围是缩减。
不需要显示指定,即不需要加上前面的小括号和父类类型名。
注意:
父类引用指向子类实例时,可以调用子类重写的方法、直接继承父类的方法,无法调用子类特有的方法;
静态static方法属于特殊情况,静态方法只能继承,不能重写。调用时用谁的引用则调用谁的版本。
向下类型转换(Downcast):父类型转换为子类型
一个指向子类对象的父类引用赋值给一个子类的引用。
强制类型转换,是大类型到小类型,范围扩大
父类型的引用必须指向转型的子类的对象,即指向谁才能转换成谁。
通过instanceof来解决引用对象的类型,避免类型转换的安全性问题,提高代码的强壮性
1) 引用的多态
父类的引用可以指向本类的对象
父类的引用可以指向子类的对象
2) 方法多态
创建本类时,调用的方法为本类方法
创建子类对象时,调用的方法为子类重写的方法或者继承的方法
运算符instanceof
是否是某个类的实例,是否具有某个类实例的特征。
动态绑定
绑定将一个方法调用痛给一个方法所在的类型连接在一起。分为静态绑定和动态绑定。
静态绑定:在程序运行之前进行绑定(由编译器和链路程序完成),也叫前期绑定。
动态绑定:在程序运行期间由JVM根据对象的类型自动的判断应该调用哪个方法。
1.11 抽象类
某个父类只知道子类应该包含怎样的方法,但不知道具体实现,无足够的信息以描绘一个具体的对象时,这样的类就是抽象类。
用abstract修饰的类。
不能被实例化,只能被继承,抽象类不能创建对象,只能作为其他类的父类,可通过向上转型,指向子类。
抽象类是被用来创建继承层级里子类的模板。
关键字abstract,只能修饰类、方法,不能修饰字段
抽象类中可含有普通方法(必须要实现),因为抽象中可以没有抽象方法。
含有抽象方法的类一定是抽象类。
抽象类是用来捕捉子类的通用特性的 。
static final private不能与abstract共存。
父类是具体,子类也可以是抽象的,如Object具体的,但可以创建抽象子类。
意义:
为其子类提供一个公共的类型(父类引用指向子类对象);
封装子类中的重复内容(成员变量和方法);
将父类设计成抽象类后,既可借由父子继承关系限制子类的设计随意性,在一定程度上避免了无意义父类的实例化。
抽象方法
用abstract关键字修饰的方法。
抽象方法只有声明,不能有实现,仅有方法头没有方法体和操作实现。但可以有默认行为,当没有方法体时,用分号结束。
含抽象方法的类一定为抽象类,但抽象类不一定含有抽象方法。
1.12 接口
接口,定义了某一批类所需要遵守的规范,不关心类的内部数据,也不关心类方法的实现细节,它只规定类里必须提供某些方法。
接口可以理解为一种特殊的类,由全局常量和公共抽象方法组成。
类是具体实现体。
接口是抽象方法的集合。如果一个类实现了某个接口,那么它就继承了这个接口的抽象方法。这就像契约模式,如果实现了这个接口,那么就必须确保使用这些方法。接口只是一种形式,接口自身不能做任何事情。
接口和抽象类的区别:
抽象类在java中表示一种继承关系,是被用来创建继承层级里子类的模板,一个类只能使用一次继承关系,但一个类可以实现多个接口;
抽象类可赋方法默认行为,接口中的方法不能有默认行为;
抽象类可以有自己的数据成员,即普通变量,接口只能有静态的不能被修改的数据成员(static final);
抽象类是“is a”的关系,接口是”like a”的关系
抽象类和接口
相同点:
均可以包含抽象方法;
都不能被实例化;
都是引用数据类型,抽象类的子类或接口的实现类都可以向上转型。
不同点:
|
参数 |
抽象类 |
接口 |
|
默认的方法实现 |
它可以有默认的方法实现。并且可以有非抽象方法(必须实现)。 抽象类中的抽象方法(加了abstract关键字的方法)不能实现。 |
接口完全是抽象的。它根本不存在方法的实现,都是public abstract方法,可以包含方法体。 |
|
实现 |
子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。 |
子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现 |
|
构造器 |
抽象类可以有构造器 |
接口不能有构造器 |
|
与正常Java类的区别 |
除了你不能实例化抽象类之外,它和普通Java类没有任何区别 |
接口是完全不同的类型 |
|
访问修饰符 |
抽象方法可以有public、protected和default这些修饰符 |
接口方法默认修饰符是public。你不可以使用其它修饰符。 |
|
main方法 |
抽象方法可以有main方法并且我们可以运行它 |
接口没有main方法,因此我们不能运行它。 |
|
多继承 |
一个类只能继承一个抽象类,单继承。 |
一个类可以实现多个接口。 接口可以继承接口,并且可以多继承。 |
|
速度 |
它比接口速度要快 |
接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。 |
|
添加新方法 |
如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。 |
如果你往接口中添加方法,那么你必须改变实现该接口的类。 |
|
成员变量 |
可以是各种类型 |
接口中的成员变量只能是public static final类型的,且定义时就初始化。 变量是所有实现类共有的,既然共有,肯定是不变的东西。 |
|
静态代码 |
可以有静态代码块和静态方法 |
不能含有静态代码块以及静态方法 |
|
修饰符 |
Final、abstract、private等 |
Final、abstract |
- 如果你拥有一些方法并且想让它们中的一些有默认实现,那么使用抽象类吧。
- 如果你想实现多重继承,那么你必须使用接口。由于Java不支持多继承,子类不能够继承多个类,但可以实现多个接口。因此你就可以使用接口来解决它。
- 如果基本功能在不断改变,那么就需要使用抽象类。如果不断改变基本功能并且使用接口,那么就需要改变所有实现了该接口的类。
1.13 异常
所有异常都继承自Throwable,主要是Error和Exception。Error主要是虚拟机错误和线程死锁。Exception主要是编码、环境、用户操作输入出现的问题,主要分为非检查异常(RuntimeException)和检查异常。非检查异常常见有:空指针异常、数组下标越界异常、类型转换异常、算术异常。检查异常常见有:文件异常IOException和SQL异常SQLException。
异常常用try-catch-finally的方式捕获。catch是一般是由子类到父类。
throw:将产生的异常抛出(动作)
throws:声明将要抛出何种类型的异常(声明)
eg:
public void 方法名(参数列表) throws 异常列表
{
//调用会抛出异常的方法或者:
throw new Exception()
}
异常可以自定义,但是要继承异常。
实际应用中的经验和总结:

1.14 包装类
基本数据类型是不具有对象的特性的,不能调用方法,为让基本数据类型具有对象的特性,java为基本数据类型提供了包装类。

方法:

Date:时间
SimpleDateFormat时间
Calendar 日历
Math类
String实例具有对象的特性。
1.15 String
String对象创建后则不能被修改,是不可变的,若要改变一个字符串,可以使用StringBuilder或者StringBuffer


1、== 比较的都是内存地址,而不是值。
2、num1 = 10,num2 – 5;
System.out.println("" + num1 + num2);//105
System.out.println(num1 + num2);//15
String和int类型直接串接时,会把int类型也当做String直接打印,但是int和int是可以当做表达式执行计算的。
1.16 集合
集合类:一种工具类,就像是容器,储存任意数量的具有共同属性的对象。





Iterator(迭代器)
Iterator接口可以以统一的方式对各种集合元素进行遍历;
hasNext()方法检测集合中是否还有下一个元素;
next()方法返回集合中的下一个元素。
List

List的特征是其元素以线性方式存储,集合中可以存放重复对象。
ArrayList() : 代表长度可以改变得数组。可以对元素进行随机的访问,向ArrayList()中插入与删除元素的速度慢。元素可以为null。
LinkedList(): 在实现中采用链表数据结构。插入和删除速度快,访问速度慢。 对顺序访问进行了优化,向List中间插入与删除的开销并不大。随机访问则相对较慢。
次序是List最重要的特点:它保证维护元素特定的顺序。
对于List的随机访问来说,就是只随机来检索位于特定位置的元素。 List 的 get(int index) 方法返回集合中由参数index指定的索引位置的对象,下标从“0” 开始。
Set
Set是最简单的一种集合,集合中的对象不按特定的方式排序,并且没有重复对象。
Set接口主要实现了两个实现类:
HashSet: HashSet类按照哈希算法来存取集合中的对象,存取速度比较快。为快速查找设计的Set。存入HashSet的对象必须定义hashCode()。只允许一个null元素。
TreeSet :TreeSet类实现了SortedSet接口,能够对集合中的对象进行排序。 保存次序的Set, 底层为树结构。使用它可以从Set中提取有序的序列。
LinkedHashSet:具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入的次序)。于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。
Map
Map 是一种把键对象和值对象映射的集合,它的每一个元素都包含一对键对象和值对象。Key-value以Entry类型的对象实例存在。一个映射不能包含重复的键,每个键最多只能映射到一个值。
HashMap基于哈希表的map接口的实现,就是使用对象的hashCode()进行快速查询的。此方法能够显着提高性能。允许使用null键和null值,key值不允许重复,HashMap中的Entry对象时无序排列的。Map基于散列表的实现。插入和查询“键值对”的开销是固定的。
LinkedHashMap: 类似于HashMap,但是迭代遍历它时,取得“键值对”的顺序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一点。而在迭代访问时发而更快,因为它使用链表维护内部次序。
TreeMap : 基于红黑树数据结构的实现。查看“键”或“键值对”时,它们会被排序(次序由Comparabel或Comparator决定)。TreeMap的特点在 于,你得到的结果是经过排序的。TreeMap是唯一的带有subMap()方法的Map,它可以返回一个子树。
排序
1、Collection接口的sort方法。
2、Comparator接口
强行对某个对象进行整体排序的比较函数;
可以将comparator传递给sort方法。
1、 comparable接口
强行对实现它的每个类的对象进行整体排序,类的自然排序;compareTo方法被称为它的自然比较方法;
对于集合,通过调用Collections.sort方法进行排序;
对于数组,通过调用Arrays.sort方法进行排序。
CompareTo方法中该对象小于、等于或大于指定对象,则分辨返回负数、零或正整数。
Comparator和comparable区别
|
Comparator |
comparable |
|
位于java.util包 |
位于java.lang包 |
|
在要比较的类的外部实现该接口 |
在要比较的类里实现该接口 |
|
调用sort方法时,要指定comparator的实现类 |
调用sort方法时,只需指定集合名即可 |

浙公网安备 33010602011771号