java学习第八天
1:如何制作帮助文档(了解) //把构造方法私有,外界就不能创建对象了,可以用类名调用 private ArrayTool(){} (1)写一个类 (2)加入文档注释 /** *这是针对数组进行操作的工具类 *@author 朱家婷 *@version V.10 */ /** *@param int[] arr这是要获取最大值的数组 *@return int 返回数组中的最大值 */ (3)通过javadoc工具生成即可 javadoc -d 目录 -author -version ArrayTool.java 给一个.class文件和说明书即可以使用工具类中的方法 2:通过JDK提供的API学习了Math类(掌握) (1)API(Application Programming Interface) 应用程序编程接口(帮助文档) (2)如何使用呢? 请参照 1:打开帮助文档 2:点击显示,找到索引,看到输入框 3:知道你要找谁?以Scanner举例 4:在输入框里面输入Scanner,然后回车 5:看包 java.lang包下的类不需要导入,其他的全部需要导入。 要导入: java.util.Scanner 6:再简单的看看类的解释和说明,别忘了看看该类的版本 7:看类的结构 成员变量 字段摘要 构造方法 构造方法摘要 成员方法 方法摘要 8:学习构造方法 A:有构造方法 就创建对象 B:没有构造方法 成员可能都是静态的 9:看成员方法 A:左边 是否静态:如果静态,可以通过类名调用 返回值类型:人家返回什么,你就用什么接收。 B:右边 看方法名:方法名称不要写错 参数列表:人家要什么,你就给什么;人家要几个,你就给几个 (3)Math类 A:是针对数学进行操作的类 B:没有构造方法,因为它的成员都是静态的 C:产生随机数 public static double random(): [0.0,1.0) D:如何产生一个1-100之间的随机数 int number = (int)(Math.random()*100)+1; E:猜数字小游戏 3:代码块(理解) (1)用{}括起来的代码。 (2)分类: A:局部代码块 用于限定变量的生命周期,及早释放,提高内存利用率。 B:构造代码块 把多个构造方法中相同的代码可以放到这里,每个构造方法执行前,首先执行构造代码块。 C:静态代码块 对类的数据进行初始化,仅仅只执行一次。 (3)静态代码块,构造代码块,构造方法的顺序问题? 静态代码块 > 构造代码块 > 构造方法 4:继承(掌握) (1)把多个类中相同的成员给提取出来定义到一个独立的类中。然后让这多个类和该独立的类产生一个关系, 这多个类就具备了这些内容。这个关系叫继承。 //定义学生类 class Student { String name; int age; public Student(){} //getXxx()/setXxx() public void eat() { System.out.println("吃饭"); } } //定义老师类 class Teacher { String name; int age; public Teacher(){} //getXxx()/setXxx() public void eat() { System.out.println("吃饭"); } } --------------------------------------------- class Person{ String name; int age; public Person(){} //getXxx()/setXxx() public void eat() { System.out.println("吃饭"); } } class Student extends Person{ public Student(){} } class Teacher extends Person(){ public Teacher(){} } (2)Java中如何表示继承呢?格式是什么呢? A:用关键字extends表示 B:格式: class 子类名 extends 父类名 {} C:单独的这个类叫父类(又叫基类和超类),继承了父类的类叫子类(也叫派生类) (3)继承的好处: A:提高了代码的复用性 B:提高了代码的维护性 C:让类与类产生了一个关系,是多态的前提 (4)继承的弊端: A:让类的耦合性增强。这样某个类的改变,就会影响其他和该类相关的类。 原则:低耦合,高内聚。 耦合:类与类的关系 内聚:自己完成某件事情的能力 B:打破了封装性 (5)Java中继承的特点 A:Java中类只支持单继承(一个子类只能继承一个父类) class Son extends Father,Mother{}//是错误的 B:Java中可以多层(重)继承(继承体系) class Father extends GrandFather{} class Son extends Father{} (6)继承的注意事项: A:子类不能继承父类的私有成员 B:子类不能继承父类的构造方法,但是可以通过super去访问 C:不要为了部分功能而去继承 class A{ public show1(){} public show2(){} } class B{ public show2(){} public show3(){} } 这种情况下class B extends A{}不好,因为不但有了show2还有了show1,show1可能不是B需要的 (7)什么时候使用继承呢? A:继承体现的是:子类"is a"父类的关系。 B:采用假设法(如果a是b的一种或者b是a的一种,就可以考虑继承) (8)Java继承中的成员关系 A:成员变量 a:子类的成员变量名称和父类中的成员变量名称不一样,这个太简单 b:子类的成员变量名称和父类中的成员变量名称一样,这个怎么访问呢? 子类的方法访问变量的查找顺序: 在子类方法的局部范围找,有就使用。 在子类的成员范围找,有就使用。 在父类的成员范围找,有就使用。 找不到,就报错。 c: num表示当前方法的局部变量值,this.num表示当前类成员变量的num,super.num表示父类成员变量的num this和super的区别? this代表本类对应的引用 super代表父类存储空间的标识(可以理解为父类引用,可以操作父类的成员) 用法: 访问成员变量: this.成员变量 super.成员变量 访问构造方法: this(...) super(...) 访问成员方法: this.成员方法() super.成员方法() B:构造方法 a:子类的构造方法默认会去访问父类的无参构造方法 是为了子类访问父类数据的初始化 b:父类中如果没有无参构造方法,怎么办? 子类通过super去明确调用带参构造 子类通过this调用本身的其他构造,但是一定会有一个去访问了父类的构造 让父类提供无参构造 C:成员方法 a:子类的成员方法和父类中的成员方法名称不一样,这个太简单 b:子类的成员方法和父类中的成员方法名称一样,这个怎么访问呢? 通过子类对象访问一个方法的查找顺序: 在子类中找,有就使用 在父类中找,有就使用 找不到,就报错 (9)两个面试题: A:Override和Overload的区别?Overload是否可以改变返回值类型? B:this和super的区别和各自的作用? (10)数据初始化的面试题 A:一个类的初始化过程 B:子父类的构造执行过程 C:分层初始化 (11)案例: A:学生和老师案例 继承前 继承后 B:猫狗案例的分析和实现
(12)方法重写 方法重写:子类中出现了和父类中方法声明一模一样的方法。 方法重载: 本类中出现的方法名一样,参数列表不同的方法。与返回值无关。 子类对象调用方法的时候: 先找子类本身,再找父类。 方法重写的应用: 当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法。 这样,即沿袭了父类的功能,又定义了子类特有的内容。 案例: A:定义一个手机类。 B:通过研究,我发明了一个新手机,这个手机的作用是在打完电话后,可以听天气预报。 按照我们基本的设计,我们把代码给写出来了。 但是呢?我们又发现新手机应该是手机,所以,它应该继承自手机。 其实这个时候的设计,并不是最好的。 因为手机打电话功能,是手机本身就具备的最基本的功能。 所以,我的新手机是不用在提供这个功能的。 但是,这个时候,打电话功能就没有了。这个不好。 最终,还是加上这个功能。由于它继承了手机类,所以,我们就直接使用父类的功能即可。 那么,如何使用父类的功能呢?通过super关键字调用 class Phone{ public void call(String name){ System.out.println("给"+name+"打电话"); } } class NewPhone extends Phone{ public void call(){ //System.out.println("给"+name+"打电话"); super.call("zhuzhu"); System.out.println("可以听天气预报了"); } } class ReWrite{ public static void main(String[] args){ NewPhone p = new NewPhone(); p.call(); } } 方法重写注意事项: A:父类中私有方法不能被重写 因为父类私有方法子类根本就无法继承 B:子类重写父类方法时,访问权限不能更低 最好就一致 C:父类静态方法,子类也必须通过静态方法进行重写 其实这个算不上方法重写,但是现象确实如此,至于为什么算不上方法重写,多态中我会讲解 子类重写父类方法的时候,最好声明一模一样。