码迷,mamicode.com
首页 > 编程语言 > 详细

No_16_0229 Java基础学习第八天

时间:2016-02-29 23:00:56      阅读:436      评论:0      收藏:0      [点我收藏+]

标签:

文档版本 开发工具 测试平台 工程名字 日期 作者 备注
V1.0 2016.02.29 lutianfei none


工具类中使用静态

  • 当报错无法从静态上下文中引用非静态 方法xxx
    • 表明在静态方法中引用了非静态方法
  • 在工具类中当把构造方法私有后,外界就不能再创建对象了,此时将所有方法设为静态后。可以根据静态方法的特点:通过类名来调用。

  • Eg:

  1. /*
  2. 我想要对数组进行操作
  3. 在同一个文件夹下,类定义在两个文件中和定义在一个文件中其实一样的。
  4. */
  5. class ArrayDemo {
  6. public static void main(String[] args) {
  7. //定义数组
  8. int[] arr = {28,55,37,46,19};
  9. //静态方法
  10. //printArray(arr);
  11. //非静态方法
  12. //ArrayDemo ad = new ArrayDemo();
  13. //ad.printArray(arr);
  14. //测试类的作用:创建其他类的对象,调用其他类的功能。
  15. //而我们现在的操作是跟数组相关的,所以,你应该把这些操作定义到数组操作类中
  16. //定义一个数组的操作类
  17. //有了数组操作类之后的调用
  18. //ArrayTool at = new ArrayTool();
  19. //at.printArray(arr);
  20. //方法改进为静态后,就可以直接通过类名调用
  21. ArrayTool.printArray(arr);
  22. }
  23. /*
  24. public static void printArray(int[] arr) {
  25. for(int x=0; x<arr.length; x++) {
  26. if(x == arr.length-1) {
  27. System.out.println(arr[x]);
  28. }else {
  29. System.out.print(arr[x]+", ");
  30. }
  31. }
  32. }
  33. */
  34. //假设该方法不是静态的
  35. /*
  36. public void printArray(int[] arr) {
  37. for(int x=0; x<arr.length; x++) {
  38. if(x == arr.length-1) {
  39. System.out.println(arr[x]);
  40. }else {
  41. System.out.print(arr[x]+", ");
  42. }
  43. }
  44. }
  45. */
  46. }
  47. class ArrayTool {
  48. //把构造方法私有,外界就不能在创建对象了
  49. private ArrayTool(){}
  50. public static void printArray(int[] arr) {
  51. for(int x=0; x<arr.length; x++) {
  52. if(x == arr.length-1) {
  53. System.out.println(arr[x]);
  54. }else {
  55. System.out.print(arr[x]+", ");
  56. }
  57. }
  58. }
  59. }

帮助文档的制作

  • 制作工具类
    • ArrayTools
  • 制作帮助文档(API)

    • javadoc -d 目录 -author -version ArrayTool.java
      • 目录可以写一个文件的路径
  • 制作帮助文档出错:

  • 找不到可以文档化的公共或受保护的类:告诉我们类的权限不够。修改方法在类前面加public修饰。

如何使用帮助文档

  • 点击显示,找到索引,出现输入框
  • 你应该知道你找谁?举例:Scanner
  • 看这个类的结构(需不需要导包) 注:java.lang包下的类不需要导入,其他的全部需要导入。
    • 成员变量 说明书中对照为字段摘要
    • 构造方法 说明书中对照为构造方法摘要
      • 有构造方法 : 创建对象
      • 没有构造方法:成员可能都是静态的,通过类名调用。
    • 成员方法 方法摘要
      • 看左边
        • 是否静态:如果静态,可以通过类名调用
        • 返回值类型:定义返回的是说明,就用什么接收。
      • 看右边
        • 方法名,不要打错
        • 参数列表:需要什么参数,就给什么,需要几个给几个
    • 看版本说明
  • 看这个类的说明
    • 看构造方法
    • 看成员方法

Math类学习

  1. /*
  2. Math:类包含用于执行基本数学运算的方法
  3. 由于Math类在java.lang包下,所以不需要导包。
  4. 特点:
  5. 没有构造方法,因为它的成员全部是静态的。
  6. 掌握一个方法:
  7. 获取随机数
  8. public static double random():返回带正号的 double 值,该值大于等于 0.0 且小于 1.0。
  9. */
  10. class MathDemo {
  11. public static void main(String[] args) {
  12. //获取一个随机数
  13. //double d = Math.random();
  14. //System.out.println(d);
  15. //需求:我要获取一个1-100之间的随机数,肿么办?
  16. for(int x=0; x<100; x++) {
  17. int number = (int)(Math.random()*100)+1;
  18. System.out.println(number);
  19. }
  20. }
  21. }

代码块

  • 在Java中,使用{}括起来的代码被称为代码块,根据其位置和声明的不同,可以分为局部代码块构造代码块静态代码块同步代码块(多线程讲解)。
  • 局部代码块
    • 方法中出现;限定变量生命周期,及早释放,提高内存利用率
  • 构造代码块
    • 在类中,方法外出现;
    • 多个构造方法方法中相同的代码存放到一起,每次调用构造都执行,并且在构造方法执行。
      • 作用:可以把多个构造方法中的共同代码放到一起。
  • 静态代码块

    • 在类中方法外出现,加了static修饰
    • 在类中方法外出现,并加上static修饰;用于给类进行初始化,在加载的时候就执行,并且只执行一次
  • eg1 :

  1. class Code {
  2. static { //静态代码块
  3. int a = 1000;
  4. System.out.println(a);
  5. }
  6. //构造代码块
  7. {
  8. int x = 100;
  9. System.out.println(x);
  10. }
  11. //构造方法
  12. public Code(){
  13. System.out.println("code");
  14. }
  15. //构造方法
  16. public Code(int a){
  17. System.out.println("code");
  18. }
  19. //构造代码块
  20. {
  21. int y = 200;
  22. System.out.println(y);
  23. }
  24. //静态代码块
  25. static {
  26. int b = 2000;
  27. System.out.println(b);
  28. }
  29. }
  30. class CodeDemo {
  31. public static void main(String[] args) {
  32. //局部代码块
  33. {
  34. int x = 10;
  35. System.out.println(x);
  36. }
  37. //找不到符号
  38. //System.out.println(x);
  39. {
  40. int y = 20;
  41. System.out.println(y);
  42. }
  43. System.out.println("---------------");
  44. Code c = new Code();
  45. System.out.println("---------------");
  46. Code c2 = new Code();
  47. System.out.println("---------------");
  48. Code c3 = new Code(1);
  49. }
  50. }
  51. /*
  52. * 程序运行结果:
  53. 10
  54. 20
  55. ---------------
  56. 1000
  57. 2000
  58. 100
  59. 200
  60. code
  61. ---------------
  62. 100
  63. 200
  64. code
  65. ---------------
  66. 100
  67. 200
  68. code
  69. */


  • Eg2 :
  1. class Student {
  2. static {
  3. System.out.println("Student 静态代码块");
  4. }
  5. {
  6. System.out.println("Student 构造代码块");
  7. }
  8. public Student() {
  9. System.out.println("Student 构造方法");
  10. }
  11. }
  12. class StudentDemo {
  13. static {
  14. System.out.println("林青霞都60了,我很伤心");
  15. }
  16. public static void main(String[] args) {
  17. System.out.println("我是main方法");
  18. Student s1 = new Student();
  19. Student s2 = new Student();
  20. }
  21. }
  22. /*
  23. 写程序的执行结果。
  24. 林青霞都60了,我很伤心
  25. 我是main方法
  26. Student 静态代码块
  27. Student 构造代码块
  28. Student 构造方法
  29. Student 构造代码块
  30. Student 构造方法
  31. */


继承

继承概述

  • 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。
  • 通过extends关键字可以实现类与类的继承
    • ** class 子类名 extends 父类名 {} **
  • 单独的这个类称为父类基类或者超类;这多个类可以称为子类或者派生类
  • 有了继承以后,我们定义一个类的时候,可以在一个已经存在的类的基础上,还可以定义自己的新成员。
  1. class Dad(){}
  2. class Son extends Dad {}


继承的好处

  • 提高了代码的复用性
    • 多个类相同的成员可以放到同一个类中
  • 提高了代码的维护性
    • 如果功能的代码需要修改,修改一处即可
  • 让类与类之间产生了关系,是多态的前提

    • 其实这也是继承的一个弊端:类的耦合性很强
  • 开发的原则:低耦合,高内聚

    • 耦合:类与类的关系。
    • 内聚:就是自己完成某件事情的能力。

Java中继承的特点

  • Java只支持单继承,不支持多继承。
    • 一个类只能有一个父类,不可以有多个父类。
      • class SubDemo extends Demo{} //ok
      • class SubDemo extends Demo1,Demo2…//error
  • Java支持多层继承(继承体系)
    • class A{}
    • class B extends A{}
    • class C extends B{}

Java中继承的注意事项

  • 子类只能继承父类所有非私有的成员(成员方法和成员变量)
    • 其实这也体现了继承的另一个弊端:打破了封装性
  • 子类不能继承父类的构造方法,但是可以通过super关键字去访问父类构造方法。
  • 不要为了部分功能而去继承

  • Eg1:

  1. class Father {
  2. private int num = 10;
  3. public int num2 = 20;
  4. //私有方法,子类不能继承
  5. private void method() {
  6. System.out.println(num);
  7. System.out.println(num2);
  8. }
  9. public void show() {
  10. System.out.println(num);
  11. System.out.println(num2);
  12. }
  13. }
  14. class Son extends Father {
  15. public void function() {
  16. //num可以在Father中访问private
  17. //System.out.println(num); //子类不能继承父类的私有成员变量
  18. System.out.println(num2);
  19. }
  20. }
  21. class ExtendsDemo3 {
  22. public static void main(String[] args) {
  23. // 创建对象
  24. Son s = new Son();
  25. //s.method(); //子类不能继承父类的私有成员方法
  26. s.show();
  27. s.function();
  28. }
  29. }


什么时候使用继承呢?

  • 继承中类之间体现的是:”is a”的关系。
  • 假设法:如果有两个类A,B。只有他们符合A是B的一种,或者B是A的一种,就可以考虑使用继承。

继承中成员变量的关系

  • 案例演示
    • 子父类中同名和不同名的成员变量
  • 结论:
    • 在子类方法中访问一个变量
    • 首先在子类局部范围找
    • 然后在子类成员范围找
    • 最后在父类成员范围找(肯定不能访问到父类局部范围)
    • 如果还是没有就报错。(不考虑父亲的父亲…)
super关键字
  • super的用法和this很像
    • this代表本类对应的引用。
    • super代表父类存储空间的标识(可以理解为父类引用)
  • 用法(this和super均可如下使用)
    • 访问成员变量
      • this.成员变量
      • super.成员变量
    • 访问构造方法(子父类的构造方法问题讲)
      • this(…) :调用本类的构造方法
      • super(…):调用父类的构造方法
    • 访问成员方法(子父类的成员方法问题讲)
      • this.成员方法()
      • super.成员方法()

继承中构造方法的关系

  • 子类中所有的构造方法默认都会访问父类中空参数的构造方法
    • 因为子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化。
    • 每一个构造方法的第一条语句默认都是:super()
  1. class Father {
  2. int age;
  3. public Father() {
  4. System.out.println("Father的无参构造方法");
  5. }
  6. public Father(String name) {
  7. System.out.println("Father的带参构造方法");
  8. }
  9. }
  10. class Son extends Father {
  11. public Son() {
  12. //super();//默认都会有的
  13. System.out.println("Son的无参构造方法");
  14. }
  15. public Son(String name) {
  16. //super();//默认都会有的
  17. System.out.println("Son的带参构造方法");
  18. }
  19. }
  20. class ExtendsDemo6 {
  21. public static void main(String[] args) {
  22. //创建对象
  23. Son s = new Son();
  24. System.out.println("------------");
  25. Son s2 = new Son("林青霞");
  26. }
  27. }
  • 程序运行结果:
    技术分享


  • 如果父类没有无参构造方法,那么子类的构造方法会出现什么现象呢,如何解决?
    • 会报错
    • 解决办法:
      • A:在父类中加一个无参构造方法
      • B:通过使用super关键字去显示的调用父类的带参构造方法
    • 子类中一定要有一个访问了父类的构造方法,否则父类数据就没有办法初始化。
  • 注:super(…)必须放在第一条语句上,否则就可能出现对父类的数据进行了多次初始化,所以必须放在第一条语句上面。

  • 一个类的初始化过程

    • 成员变量进行初始化
    • 默认初始化
    • 显示初始化
    • 构造方法初始化

  • A:一个类的静态代码块,构造代码块,构造方法的执行流程

    • 静态代码块 > 构造代码块 > 构造方法
  • B:静态的内容是随着类的加载而加载
    • 静态代码块的内容会优先执行
  • C:子类初始化之前先会进行父类的初始化


  • 练习1
  1. /*
  2. 看程序写结果:
  3. A:成员变量 就近原则
  4. B:this和super的问题
  5. this访问本类的成员
  6. super访问父类的成员
  7. C:子类构造方法执行前默认先执行父类的无参构造方法
  8. D:一个类的初始化过程
  9. 成员变量进行初始化
  10. 默认初始化
  11. 显示初始化
  12. 构造方法初始化
  13. 结果:
  14. fu
  15. zi
  16. 30
  17. 20
  18. 10
  19. */
  20. class Fu{
  21. public int num = 10;
  22. public Fu(){
  23. System.out.println("fu");
  24. }
  25. }
  26. class Zi extends Fu{
  27. public int num = 20;
  28. public Zi(){
  29. System.out.println("zi");
  30. }
  31. public void show(){
  32. int num = 30;
  33. System.out.println(num); //30
  34. System.out.println(this.num); //20
  35. System.out.println(super.num); //10
  36. }
  37. }
  38. class ExtendsTest {
  39. public static void main(String[] args) {
  40. Zi z = new Zi();
  41. z.show();
  42. }
  43. }
  • 练习2:
  1. /*
  2. 看程序写结果:
  3. A:一个类的静态代码块,构造代码块,构造方法的执行流程
  4. 静态代码块 > 构造代码块 > 构造方法
  5. B:静态的内容是**随着类的加载而加载**
  6. 静态代码块的内容会优先执行
  7. C:子类初始化之前先会进行父类的初始化
  8. 结果是:
  9. 静态代码块Fu
  10. 静态代码块Zi
  11. 构造代码块Fu
  12. 构造方法Fu
  13. 构造代码块Zi
  14. 构造方法Zi
  15. */
  16. class Fu {
  17. static {
  18. System.out.println("静态代码块Fu");
  19. }
  20. {
  21. System.out.println("构造代码块Fu");
  22. }
  23. public Fu() {
  24. System.out.println("构造方法Fu");
  25. }
  26. }
  27. class Zi extends Fu {
  28. static {
  29. System.out.println("静态代码块Zi");
  30. }
  31. {
  32. System.out.println("构造代码块Zi");
  33. }
  34. public Zi() {
  35. System.out.println("构造方法Zi");
  36. }
  37. }
  38. class ExtendsTest2 {
  39. public static void main(String[] args) {
  40. Zi z = new Zi();
  41. }
  42. }


  • 练习3(有难度理解不深刻)
  1. /*
  2. 看程序写结果:
  3. A:成员变量的问题
  4. int x = 10; //成员变量是基本类型
  5. Student s = new Student(); //成员变量是引用类型
  6. B:一个类的初始化过程
  7. 成员变量的初始化
  8. 默认初始化
  9. 显示初始化
  10. 构造方法初始化
  11. C:子父类的初始化(分层初始化)
  12. 先进行父类初始化,然后进行子类初始化。
  13. 结果:
  14. YXYZ
  15. 问题:
  16. 虽然子类中构造方法默认有一个super()
  17. 初始化的时候,不是按照那个顺序进行的。
  18. 而是按照分层初始化进行的。
  19. 它仅仅表示要先初始化父类数据,再初始化子类数据。
  20. */
  21. class X {
  22. Y b = new Y();
  23. X() {
  24. System.out.print("X");
  25. }
  26. }
  27. class Y {
  28. Y() {
  29. System.out.print("Y");
  30. }
  31. }
  32. public class Z extends X {
  33. Y y = new Y();
  34. Z() {
  35. //super
  36. System.out.print("Z");
  37. }
  38. public static void main(String[] args) {
  39. new Z();
  40. }
  41. }


继承中成员方法的关系

方法重写概述

  • 子类中出现了和父类中一模一样的方法声明,也被称为方法覆盖方法复写
  • 使用特点:
    • 如果方法名不同,就调用对应的方法
    • 如果方法名相同,最终使用的是子类自己的
  • 方法重写的应用:
    • 当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容。

方法重写的注意事项

  • 父类中私有方法不能被重写
  • 子类重写父类方法时,访问权限不能更低
  • 父类静态方法,子类也必须通过静态方法进行重写。(其实这个算不上方法重写,但是现象确实如此,至于为什么算不上方法重写,多态中会讲解)
  1. class Phone {
  2. public void call(String name) {
  3. System.out.println("给"+name+"打电话");
  4. }
  5. }
  6. class NewPhone extends Phone {
  7. public void call(String name) {
  8. //System.out.println("给"+name+"打电话");
  9. super.call(name);
  10. System.out.println("可以听天气预报了");
  11. }
  12. }
  13. class ExtendsDemo9 {
  14. public static void main(String[] args) {
  15. NewPhone np = new NewPhone();
  16. np.call("林青霞");
  17. }
  18. }

练习题

  • Eg1:方法重写和方法重载的区别?方法重载能改变返回值类型吗?

    • 方法重写(Override)
      • 在子类中,出现和父类中一模一样的方法声明的现象。
    • 方法重载(Overload)
      • 同一个类中,出现的方法名相同,参数列表不同的现象。
        方法重载能改变返回值类型,因为它和返回值类型无关。
  • Eg2: this关键字和super关键字分别代表什么?以及他们各自的使用场景和作用。

    • this:代表当前类的对象引用
    • super:代表父类存储空间的标识。(可以理解为父类的引用,通过这个东西可以访问父类的成员)
    • 场景:
      • 成员变量:
        • this.成员变量
        • super.成员变量
      • 构造方法:
        • this(…)
        • super(…)
      • 成员方法:
        • this.成员方法
        • super.成员方法
  • Eg3:

  1. //定义人类
  2. class Person {
  3. //姓名
  4. private String name;
  5. //年龄
  6. private int age;
  7. public Person() {
  8. }
  9. public Person(String name,int age) { //"林青霞",27
  10. this.name = name;
  11. this.age = age;
  12. }
  13. public String getName() {
  14. return name;
  15. }
  16. public void setName(String name) {
  17. this.name = name;
  18. }
  19. public int getAge() {
  20. return age;
  21. }
  22. public void setAge(int age) {
  23. this.age = age;
  24. }
  25. }
  26. //定义学生类
  27. class Student extends Person {
  28. public Student() {}
  29. public Student(String name,int age) { //"林青霞",27
  30. //this.name = name;
  31. //this.age = age;
  32. super(name,age);
  33. }
  34. }
  35. //定义老师类
  36. class Teacher extends Person {
  37. }
  38. class ExtendsTest4 {
  39. public static void main(String[] args) {
  40. //创建学生对象并测试
  41. //方式1
  42. Student s1 = new Student();
  43. s1.setName("林青霞");
  44. s1.setAge(27);
  45. System.out.println(s1.getName()+"---"+s1.getAge());
  46. //方式2
  47. Student s2 = new Student("林青霞",27);
  48. System.out.println(s2.getName()+"---"+s2.getAge());
  49. //补齐老师类中的代码并进行测试。
  50. }
  51. }




No_16_0229 Java基础学习第八天

标签:

原文地址:http://www.cnblogs.com/lutianfei/p/5229121.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!