继承 继承是面向对象三大特征之一。可以使得子类具有父类的属性和方法,还可以在子类中重新定义,追加属性和方法。 格式:public class 子类名 extends 父类名 {} 范例:public class ZI extends Fu {} Fu:是父类,也是被称为基类、超类 Zi:是子类,也被称为派生类 继承中子类的特点: 子类可以有父类的内容 子类还可以有自己特有的内容 继承的好处 提高了代码的复用性(多个类相同的成员可以放到同一个类中) 提高了代码的维护性(如果方法的代码需要修改,修改一处即可) 继承的弊端 继承体现的关系:is a 假设法:我有两个类A和B,如果他们满足A是B的一种,或者B是A的一种,就说明他们存在继承关系,这个时候可以考虑使用继承来体现,否则不能滥用继承 举例:苹果和水果,猫和动物 继承中变量的访问特点supersuper 关键字的用法和this关键字的用法相似 this:代表本类对象的引用 super:代表父类存储空间的标识(可以理解为父类对象引用) this.成员变量:访问本类成员变量 this(...):访问本类构造方法 this.成员方法(...):访问本类成员方法 super.成员变量:访问父类成员变量 super(...):访问父类构造方法 super.成员方法(...):访问父类成员方法 继承中构造方法的访问特点子类中所有的构造方法默认都会访问父类中的无参构造方法 子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化 每一个子类构造方法的第一条语句默认都是:super() 如果父类中没有无参构造方法,只有带参构造方法,该怎么办呢? 通过使用super关键字去显示的调用父类的带参构造方法 在父类中自己提供一个无参构造方法 推荐:自己给出无参构造方法 继承中成员方法的访问特点通过子类对象访问一个方法 子类成员范围找 父类成员范围找 如果都没有就报错(不考虑父亲的父亲。。。。) 方法重写 子类中出现了和父类中一模一样的方法声明 方法重写的应用 当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样,即沿袭了父类的功能,有定义了子类特有的内容 方法重写注意事项 私有方法不能被重写(父类私有成员子类是不能继承的) 子类方法访问权限不能更低(public>默认>私有) 修饰符包其实就是文件夹 作用:对类进行分类管理 包的定义格式: 格式:package 包名:(多级包用.分开) 范例:package com.itheima; 自动建包:javac -d . HelloWorld.java java com.itheima.HelloWorld 导包格式:import 包名; 范例:import cn.itcast.Teacher 权限修饰符状态修饰符final(最终态) final 关键字是最终的意思,可以修饰成员方法,成员变量,类 final 修饰的特点 修饰方法:表明该方法是最终方法,不能被重写 修饰变量:表明该变量是常量,不能再次被修改 修饰类:表明该类是最终类,不能被继承 fianl 修饰局部变量变量是基本类型:final修饰指的是基本类型的数据值不能发生改变 变量是引用类型:final修饰指的是引用类型的地址值不能发生改变,但是地址里面的内容是可以发生改变的 staticstatic 关键字是静态的意思,可以修饰成员方法,成员变量 static 修饰的特点 被类的所有对象共享 这也是我们判断是否使用静态关键字的条件 可以通过类名调用 也可以通过对象名调用 推荐使用类名调用 静态的成员方法只能访问静态成员 多态同一个对象,在不同时刻表现出来的不同形态 多态中成员访问特点 成员变量:编译看左边,执行看左边 成员方法:编译看左边,执行看右边 为什么成员变量和成员方法的访问不一样呢? 因为成员方法有重写,二成员变量没有 多态的好处:提高了程序的扩展性 具体体现:定义方法的时候,使用父类型作为参数,将来在使用的时候,使用具体的子类型参与操作 多态的弊端:不能使用子类的特有功能 抽象类在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类 抽象类和抽象方法必须使用abstract关键字修饰 public abstract class 类名 {} public abstract void eat(); 抽象类中不定有抽象方法,有抽象方法的类一定是抽象类 抽象类不能实例化 抽象类如何实例化呢?参照多态的方式,通过子类对象实例化,这叫抽象类多态 抽象类的子类 要么重写抽象类中的所有抽象方法 要么是抽象类 成员变量:可以是变量 也可以是常量 构造方法: 有构造方法,但是不能实例化 那么,构造方法的作用是什么呢?用于子类访问父类数据的初始化 成员方法 可以有抽象方法:限定子类必须完成某些动作 也可以有非抽象方法:提高大代码复用性 接口接口就是一种公共的规范标准,只要符合规范标准,大家都可以通用 java中的接口更多的体现在对行为的抽象 接口用关键字interface修饰 public interface 接口名 {} 类实现接口用implements表示 public class 类名 implements 接口名 {} 接口不能实例化 接口如何实例化呢?参照多态的方式,通过实现类对象实例化,这叫接口多态。 多态的形式:具体类多态,抽象类多态,接口多态。 多态的前提:有继承或者实现关系;有方法重写;有父(类/接口)引用指向(子/实现)类对象 接口的实现类 要么重写接口中的所有抽象方法 要么是抽象类 接口的成员特点成员变量 只能是常量 默认修饰符:publi static final 构造方法 接口没有构造方法,因为接口主要是对行为进行抽象的,是没有具体存在一个类如果没有父类,默认继承Object类 成员方法 只能是抽象方法 默认修饰符:public abstract 关于接口中的方法,JDK8和JDK9中有一些新特性 类和接口的关系类和类的关系 继承关系,只能单继承,但是可以多层继承 类和接口的关系 实现关系,可以单实现,可以多实现,还可以在继承一个类的同时实现多个接口 接口和接口的关系 继承关系,可以单继承,也可以多继承 形参和返回值类名作为形参和返回值方法的形参是类名,其实需要的是该类的对象 方法的返回值是类名,其实返回的是该类的对象 抽象类名作为形参和返回值方法的形参是抽象类名,其实需要的是该抽象类的子类对象 方法的返回值是抽象类名,其实放回的是该抽象类的子类对象 接口名作为形参和返回值方法的形参是接口名,其实需要的是该接口的实现类对象 方法的返回值是接口名,其实返回的是该接口的实现类对象 内部类内部类:就是在一个类中定义一个类。举例:在一个类A的内部定义一个类B,类B就被称为内部类 内部类的定义格式 格式:public class 类名 { 修饰符 class 类名 { } } 内部类的访问特点 内部类可以直接访问外部类的成员,包括私有 外部类要访问内部类的成员,必须创建对象 成员内部类成员内部类,外界如何创建对象使用呢? 格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象; 范例:Outer.Inner oi = new Outer().new Inner(); 局部内部类局部内部类是在方法中定义的类,所以外界是无法直接使用的,需要在方法内部创建对象并使用 该类可以直接访问外部类的成员 匿名内部类前提:存在一个类或者接口,这里的类可以是具体类,也可以是抽象类 格式: new 类名或者接口名(){ 重写方法; } 范例: new Inter() { public void show(){ } } 常用apiMathMath 包含执行基本数字运算方法 没有构造方法,如何使用类中的成员呢? 看类的成员是否都是静态的,如果是,通过类名就可以直接调用 public static int abs(int a) 返回参数的绝对值 public static double ceil(double a) 返回大于或者等于参数的最小double值,等于一个整数 public static double floor(double a) 返回小于或者等于参数的最大double值,等于一个整数 public static int round(float a) 按照四舍五入返回最接近参数的int public static int max(int a,int b) 返回两个int值中的较大值 public static int min(int a,int b) 返回两个int值中的较小值 public static double pow(double a,double b) 返回a的b次幂的值 public static double random() 返回值为double的正值,[0.0,1.0) SystemSystem 包含几个有用的类字段和方法,它不能被实例化 public static void exit(int status) 终止当前运行的java虚拟机,非零表示异常终止 public static long currentTimeMillis() 返回当前时间(以毫秒为单位) ObjectObject 是类层次结构的根,每个类都可以将Object作为超类。所有类都直接或者间接的继承自该类 构造方法:public Object() 回想面向对象中,为什么说子类的构造犯法默认访问的是父类的无参构造方法? 因为它们的顶级父类只有无参构造方法 public String toString() 返回对象的字符串表示形式。建议所有子类重写该方法,自动生成 public boolean equals(Object obj) 比较对象是否相等。默认比较地址,重写可以比较内容,自动生成 Array工具类的设计思想: 构造方法用private 修饰 成员用public static 修饰 Arrays类包含用于操作数组的各种方法 public static String toString(int[] a) 返回指定数组内容的字符串表示形式 publicstatic void sort(int[] a) 按照数字顺序排列指定的数组 基本类型包装类将基本数据类型封装成对象的好处在于可以在对象中定义更多的功能方法操作该数据 常用的操作之一:用于基本数据类型与字符串之间的转换 基本数据类型 包装类 byte Byte short Short int Integer long Long float Float double Double char Character boolean Boolean Integer 类的概述和使用Integer:包装一个对象中的原始类型int值 Int 和 String 的相互转换基本类型包装类的最常见操作就是:用于基本类型和字符串之间的相互转换 1.int 转换为 String public static String valueOf(int i):返回int参数的字符串表示形式。该方法是String类中的方法 2.String 转换为 int public static int parseInt(String s):将字符串解析为int类型。该方法是Integer类中的方法 自动装箱和拆箱 装箱:把基本数据类型转换为对应的包装类类型 拆箱:把包装类类型转换为对应的基本数据类型 Integer i = 100; //自动装箱 i += 200; // i = i +200 自动拆箱; i = i + 200; 是自动装箱 注意:在使用包装类类型的时候,如果做操作,最好先判断是否为null 我们推荐的是,只要是对象,在使用前就必须进行不为null的判断 日期类Date类概述和构造方法 Date 代表了一个特定的时间,精确到毫秒 public Date() 分配一个Date对象,并初始化,以便它代表它被分配的时间,精确到毫秒 public Date(long date) 分配一个Date对象,并将其初始化为表示从标准基准时间指定的毫秒数 date 类的常用方法 public long getTime() 获取的是日期对象从1970年1月1日00:00:00到现在的毫秒值 public void setTime() 设置时间,给的是毫秒值 SimpleDateFormat 类概述 SimpleDateFormat 是一个具体的类,用于区域设置敏感的方式格式化和解析日期。我们重点学习日期格式化和解析 日期和时间格式由日期和时间模式字符串指定,在日期和时间模式字符串中,从'A' 到 'Z' 以及从 'a' 到 'z' 引号的字母被解释为表示日期或时间字符串的组件的模式字母 常用的模式字母及对应关系如下: y 年 M 月 d 日 H 时 m 分 s 秒 Calendar 的常用方法 public int get(int field) 返回给定日历字段的值 public abstract void add(in field,int amount) 根据日历的规则,将制定的时间量减去给定的日历字段 public final void set(int year,int month,int date) 设置当前日历的年月日 异常Throwable类是Java语言中所有错误和异常的超类。 异常:就是程序出现了不正常的情况 异常体系 Throwable Error Exception RuntimeException 非RuntimeException Error:严重问题,不需要处理 Exception:称为异常类,它表示程序本身可以处理的问题 RuntimeException:在编译期是不检查的,出现问题后,需要我们回来修改代码 非RuntimeException:编译期就必须处理的,否则程序不能通过编译,就更不能正常运行了 JVM的默认处理方案如果程序出现了问题,我们没有做任何处理,最终JVM会做默认的处理 把异常的名称,异常原因及异常出现的位置等信息输出在了控制台 程序停止运行 异常处理之try...catch...格式: try { 可能出现异常的代码; } catch(异常类名 变量名) { 异常的处理代码; } 执行流程: 程序从try里面的代码开始执行 出现异常,会自动生成一个异常类对象,该异常对象将被提交给Java运行时系统 当Java运行时系统接收到异常对象时,会到catch中去找匹配的异常类,找到后进行异常的处理 执行完毕之后,程序还可以继续往下执行 Throwable 的成员方法public String getMessage() 返回次throwable的详细消息字符串 public String toString() 返回此可抛出的简短描述 public void printStackTrace() 把异常的错误信息输出在控制台 编译时异常和运行时异常的区别Java 中的异常被分为两大类:编译时异常和运行时异常,也被称为受检异常和非受检异常 所有的RuntimeException类及其子类被称为运行时异常,其他的异常都是编译时异常 编译时异常:必须显示处理,否则程序就会发生错误,无法通过编译 运行时异常:无需显示处理,也可以和编译时异常一样处理 异常处理之throws虽然我们通过try...catch...可以对异常进行处理,但是并不是所有的情况我们都有权限进行异常的处理 也就是说,有些时候可能出现的异常时我们处理不了的,这个时候该怎么办呢? 针对这种情况,Java提供了throws的处理方案 格式: throws 异常类名; 注意:这个格式是跟在方法的括号后面的 编译时异常必须要进行处理,两种方案:try...catch...或者throws,如果采用throws这种方案,将来谁调用谁处理 运行时异常可以不处理,出现问题后,需要我们回来修改代码 自定义异常格式: public class 异常类名 extends Exception { 无参构造 带参构造 } 范例: public class ScoreException extends Exception { public ScoreException() {} public ScoreException(String message) { super(message); } } throws和throw的区别throws: 用在方法声明后面,跟的是异常类名 表示抛出异常,由该方法的调用者来处理 表示出现异常的一种可能,并不一定会发生这些异常 throw: 用在方法体内,跟的是异常对象名 表示抛出异常,由方法体内的语句处理 执行throw一定抛出了某种异常 集合进阶-CollectionCollection 集合概述和使用Collection 集合概述 是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素 JDK不提供此接口的任何直接实现,他提供更具体的子接口(如Set和List)实现 创建Collection集合的对象 多态的方式 具体的实现类ArrayList Collection 集合的遍历Iterator:迭代器,集合的专用遍历方式 Iterator<E> iterator():返回此集合中元素的迭代器,通过集合的Iterator()方法得到 迭代器是通过集合的Iterator()方法得到的,所以我们说它是依赖于集合而存在的 Iterator中的常用方法 E next():返回迭代中的下一个元素 boolean hasNext():如果迭代具有更多元素,则返回true List集合概述和特点List集合概述 有序集合(也称为序列),用户可以精确控制列表中每个元素的插入位置。用户可以通过整数索引访问元素,并搜索列表中的元素 与Set集合不同,列表通常允许重复的元素 List集合特点 有序:存储和取出的元素顺序一致 可重复:存储的元素可以重复 List集合特有方法 void add(int index,E element),在此集合中的指定位置插入指定元素 E remove(int index),删除指定索引处的元素,返回被删除的元素 E set(int index,E element),修改指定索引处的元素,返回被修改的元素 E get(int index),返回指定索引处的元素 ListIteratorListIterator:列表迭代器 通过List集合的listIterator()方法得到,所以说它是List集合特有的迭代器 用于允许程序员沿任一方向遍历列表的列表迭代器,在迭代期间修改列表,并获取列表中迭代器的当前位置 ListIterator中的常用方法 E next():返回迭代的下一个元素 boolean hasNext():如果迭代具有更多元素,则返回true E previous():返回列表中的上一个元素 boolean hasPrevious():如果此列表迭代器在相反方向遍历列表时具有更多元素,则返回tru void add(E e):将指定的元素插入列表 |