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. 提供更好的封装,可把内部类隐藏在外部类之内,不允许同一包中的其他类访问该类
  2. 内部类的方法可以直接访问外部类的所有数据,包括私有的数据
  3. 内部类所实现的功能虽然用外部类同样可以实现,可有时用内部类更方便

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方法时,只需指定集合名即可

posted @ 2018-10-28 09:55  huinina  阅读(96)  评论(0)    收藏  举报