Chapter 06 Advanced Language and Features 1.final final修饰的类不能被继承; final修饰的方法不能被override final修饰的变量是常量,常量不可修改,但有例外: 实例常量: A.若定义时为赋值,则可以在构造器或者实例代码块中赋值 B.构造器或者代码块赋值只能有一个 静态常量: 若定义时没有赋值,可在静态代码块中赋值 2.抽象类: 定义: 具有部分实现的类. 格式: abstract class(){ } 使用: 1.不能实例化 2.可有零到多个抽象方法 3.可有构造器 4.具体类继承抽象类时,必须实现所有的抽象方法 5.抽象类可以间接地被子类调用其构造器,并且在内存中分配空间,间接实例化 6.抽象类可以有静态方法,可以返回其子类的实例 7.抽象类可以被执行 抽象类使用注意事项: 1.把各个类中可以共用的方法和逻辑放到抽象的父类中,越多越好 2.属性应该尽可能地放在子类中 模板方法的使用: 1.在抽象的父类中定义高层的业务逻辑final method( ){ }; 2.在抽象类父类中定义抽象的方法:abstract step1(); abstract step2();...... 3.子类实现相应的抽象方法 4.调用者调用final方法 5.抽象方法的扩展可以在final方法中加入前置或者后置方法(这些方法应该是实例方法,提供空的实现)
为什么要使用抽象类? 里氏代换:基类(父类)能够出现的地方,子类一定能够出现. 大部分情况下,是从大多数对象中抽象出的属性和方法,是为了方便代码的复用. 抽象类的存在,就是为了继承.
怎样使用抽象类? A.在抽象类中共有的代码和逻辑,应该尽量地多.共用的业务逻辑(具体方法)应该;尽可能地放在抽象类中. B.属性尽可能放在具体类中. 3. interface(接口) 一 什么是接口? (1) 接口应该是一个规范(宏观) (2) 接口是一种抽象类型: (1)属性是常量,一定要赋值 (2)方法是抽象方法 (3)没有构造器 (4)接口支持casting (5)类中,接口中定义内部的接口 A implements ID.IE:不必要实现ID中的方法 A implements ID:不必要实现IE中的方法 类中定义的接口,可以有修饰符 (6)接口可以继承多个接口 (7)实现接口的类必须要实现所有的方法,如果是抽象类可以选择实现部分的方法 (8)如果又要继承类又要继承接口: A extends SuperA implements I1,I2
接口没有任何实现,但有抽象方法(默认为abstract和public))和属性(默认为常量 public staitc final) 格式: interface IA{ //不能有构造器 //属性必须赋值 String str="Hello"; //省略了public static final //方法必须是抽象方法 void f(); //default : public final 为什么要使用接口?抽象类和接口如何区别,有了抽象类为什么还要使用接口? 答: (1)接口不能有构造器,但是抽象类可以; (2)一个抽象类一次只可以被实现一个,而接口可以多个 (3)一个抽象类可以被一个类继承,而接口可以多个 (4)如果只有抽象类没有接口,就会导致不同设计类型无法匹配 (5)类以后要继承其他的类,所以目前不能继承,但可以用接口 (6)两种完全不同的类型,从逻辑上说不应该继承,但可以用接口转化成另一种类型
(3)为什么要使用接口? (1)可插入性的保证,可以随意更换接口的实现类; (2)接口可以解决多重继承的问题 sample: A extends B implement I1,I2, 一个类可以转化成多种类型,继承永远只能是一种类型 (3)接口使规范的制订者 实现者 使用者分开 规范的制订者:国家/组织或机构对方法的特征(methodname,return type,aguments), 负责声明抽象方法 规范的实现者:implements 使用者: 分开的好处:使各个变化独立实现 4. 接口的基本使用 (1)实现接口的类,必须要实现其所有的方法 具体类:全部实现 抽象类:部分实现甚至可以不实现 Tips: 实现:implements (2)一个类可以实现多个接口 Syntax: classname implements <interfacename1,interfacename2>;
(3)一个接口可以继承另外一个接口,并且可以多个,还可以多重继承 (4)接口可做类型的声明,支持类型转换(Casting) sample: IA a; a=new AImpl; (5)接口定义在另外的一个类或者接口里 (6)接口的常用的用法 1) 常量接口:public static final,直观 方便 代码精简 2) 标识接口:没有任何的方法的空的接口:唯一的作用就是用来标识类型 5. 接口与抽象类的区别 1) 接口没有任何的实现,而抽象类它可以有部分的实现也可以没有; 2) 如果需要复用或者共享部分代码,应该用抽象类而不是接口; 3) 继承无法解决类型的转换问题,接口就是为了解决这一问题而产生的 (Java的单继承是接口产生的根本原因) 接口是一种抽象的第三方规范,跟对象没什么直接关系。 6.访问控制: (1)包的作用 A.区别同名的 类 B.访问控制 C.组织类 (2)import A. 一个类要使用其他包中的类,需要引入 B. "*"可以引入包中的所有的类,但不会引入子包 C. 引入包是,引入到类名 D.位置
7.Object中的方法 (1) equals() (2)toString() (3)hashCode() (4)clone()
8.Inner classes (1)静态内部类 (2)成员内部类 (3)方法内部类 1)不能用修饰符 2)只能访问其所在方法的常量 3)如何调用方法内部类中的方法 (4)匿名内部类 1)没有类名 2)格式 3)内部类的作用: 封装 多重继承 内外部类之间可以方便地访问 简化编程 4)包装类: 把基本类型转化成一个类 转换类型的方法 hashCode MIN_VALUE MAX_VALUE 在需要将基本类型包装为一个类的时候,比如collection方法 9. Collection Framework 一组类和接口,用来方便地管理对象 (1)组成部分: Collection Map Iterator(迭代器) 其它: Collections类 (2)Collection Set A.无序,不允许重复元素 HashSet 主意自定义类,要实现equals hashCode TreeSet 排序 A.类实现Comparable接口 B.提供一个实现Comparator接口的比较器(高优先级) List A.有序 B.允许重复 ArrayList 基于数组,长度可以动态地变化 查询的效率比较高(相对LinkerList) LinkerList 基于链表实现 插入与删除效率高
Advanced Features: Inheritance The intrinsic reason of using interface is single inheritance. 使用接口最本质的原因是Java的单继承特性。
Polymorphism: 可以把一个子类对象当做一个父类对象看,只能调用父类中有的属性和方法。 如果子类覆盖了父类的方法,那么把子类对象当父类看时,调用子类覆盖后的方法。 Animal() eat() | | 狮子 马 eat() 吃肉 eat()吃草
左边:把它当什么看,右边:对象本身
什么时候可以强转:认为有可能强转时才能转。 Animal a=new Dog(); Dog d=a; //编译时出错不兼容类型 Dog d=(Dog) a; //认为有可能对的情况才会通过编译 Animal b=new Cat();
instanceof 是用于判断一个对象是否属于某个类型,常用在强制类型转换之前。
1 static 修饰符:
static:静态的,可以修饰: (1)属性:静态属性,全类公有,常叫做类变量,和具体对象无关,无多态,类名去访问,类加载的时 候初始化,像动物园动物个数。不是某个具体对象的行为。
(2)方法:静态方法中只能访问类的静态成员(包括静态属性和静态方法),非静态方法中可以 问静态方法的属性和成员。 工具类的对象都是static的 (java。math就是工具类)
(3)代码块注:初始代码块是在类中而不再任何方法之内的代码块。被static修饰的代码块称静 态代码块,静态初始代码块在类加载的时候运行一次。
2 变量: 局部变量 实例变量 非静态 属性 类变量 静态 属性 3 类加载:虚拟机从磁盘上将字节码文件中的内容通过I/O流读到内存的过程。在虚拟机的生命周 期中一个类只被加载一次,什么时候加载什么时候运行。类的对象在类加载的时候被创建。 注: Java命令的作用是启动JVM。
4 final修饰符,可以修饰: (1)属性:表示这个属性的值不可变。 例:身份证号 赋值时间两种: 在定义时赋值,一般和static合用,不加也相当于static, 加上static省空间 在构造方法中赋值,每个对象的值可以不一样。但值给定了,就不能变。 (2)方法:表示这个方法不能被覆盖 (3)类:表示这个类不能被继承。 (4)方法中的局部变量:局部变量值不可变,常量。
5 abstract: 抽象的,可以修饰:
(1)方法:只有定义,没有实现, public abstract void move(); //用分号代替一对大括号 (2) 类:含抽象方法的类必须是抽象类,但抽象类不一定含抽象方法。
抽象类不能实例化,即不能构造对象不能new。 Animal a1 =new Animal() //error!!! 抽象类可以定义引用。让子类覆盖,抽象类作用,就是让子类继承。构造方法不能抽象。
注意:abstract不能和final 合用
6 接口 interface:一个特殊的抽象类
使用接口不能理解成继承接口,而应该理解为实现接口,关键字:implements 接口里的属性都是公开静态的属性;方法都是公开的抽象方法。接口没有构造方法。
例1: abstract class Myclass{ 例2: interface IA{ public static final int A=10; int A=10; public static final int B=20; int B=20; public abstract void m1(); void m1(); public abstract void m2(); void m2(); } } 例1 和 例2 是等价的。
接口和接口间存在继承关系,接口之间可以多继承,之间用逗号隔开。 一个类在继承另外一个类时还可以实现接口,要先写继承后写实现。 class1 extends class2 class implements interface1 interface extendsinterface1
把接口当成功能模块,标准 标准的制定者和标准的实现者分开。
7 对象相等判断:equals方法 写equals方法原则: (1) 满足自反性 a.equals(a) 必须为真 (2) 传递性 a.equals(b) b.equals(c) -> a.equals(c) 为真 (3) 对称性 a.equals(b) 为真, 那么b.equals(a) 为真 (4) 一致性 对象属性不改变时,返回值要一致。
|