JAVASE第四章(面向对象下)


前言

本章节内容主要介绍面向特征中的继承和多态两个特征,以及接口和抽象类的内容。这一章节的内容是面向对象编程思想的重中之重,可以提高代码的复用性和可扩展性,使我们的程序更加高效。


一、 面向对象特征–继承

1.继承的基本概念

继承:继承是面向对象程序设计不可缺少的设计思想,是实现代码可重用的根基,是提高代码可扩展性的主要途径。

1.在JAVA中使用extends关键字来表示继承关系。
2.JAVA不支持多继承,单继承使JAVA的继承关系很简单,一个类只能有一个直接父类。
3.继承之后子类可以调用父类的所有非私有属性和非私有方法
4.虽然一个类只能有一个直接父类,但继承具有传递性,类从B类继承,B类又从A类继承,那么C类就具有B类和A类的所有非私有属性和非私有方法
5.当一个没有继承任何一个类时,jvm会默认让类继承Object类,Object是 java为所有类提供的基类

怎么用?
继承与真实世界类似,例如猫是动物,狗也是动物,是一种is的关系,可以将子类共有的属性和行为放到父类中。

2.继承中的构造方法

1.子类构造方法总是先调用父类构造方法,默认情况下,调用父类无参构造方法。
2.可以在子类构造方法的第一行,使用super关键字调用父类任意一个构造方法。
3.如果用super,必须写在构造方法的第一句。
4.如果子类的构造方法中没有显式地调用类构造方法,则系统默认调用基类无参数的构造方法。

注意:一般情况下,在我们定义了有参的构造方法后,最好在定义一个无参的构造方法,因为当我们显性的定义了一个有参的构造方法,系统不会默认提供无参的构造方法,这在以后的使用中可能会出现问题。

3.super关键字

super关键字:代表父类的引用,可以在子类中调用父类的构造方法以及成员变量和成员方法等。

1.在子类构造方法中要调用父类的构造方法,需要注意:super语句只能出现在子类构造方法体的第一行。
2.用“super.成员变量名”来引用父类成员变量
3.用“super.方法名(参数列表)”的方式访问父类的方法。

4.方法的重写

什么是方法重写?
当父类的方法实现不能满足子类需求时,可以对方法进行重写(override),子类只能对继承过来的方法进行重写。

方法重写规则:
1.方法名相同、参数列表相同;
2.返回值类型相同;
3.访问权限不能小于父类权限;

注意:构造方法,静态方法不能重写,成员变量不存在重写(子类不会去重写覆盖父类的成员变量,所以成员变量的访问不能像方法一样使用多态去访问)。

5. 继承的代码部分

package com.ffyc.oop.day3.demo1;
public class Animal {
    /*当一个没有继承任何一个类时,jvm会默认让类继承Object类
    Object是 java为所有类提供的基类*/
    private int age;
     String name;
    public Animal(){
        super();
        System.out.println("调用了Animal的无参构造方法");
    }
    public void eat(){
        System.out.println("吃东西");
    }
    public void sleep(){
        System.out.println("睡觉");
    }
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

public class Cat extends Animal {
    public void yell(){
        System.out.println("学猫叫");
    }
}

public class Dog extends Animal{
    private String type;
     String name;
    public Dog(){
        super();
        System.out.println("调用了dog的无参构造方法");
    }
    public Dog(String type){
        this.type=type;
        System.out.println("调用了dog的有参构造方法");
    }
    @Override
    /*当父类的功能已经不能满足子类时,子类可以重写父类的方法
      重写要求参数列表,返回值和方法名相同,构造方法、静态方法不能重写,成员变量不存在重写'
      重写访问权限不能小于父类权限;*/
    public void eat() {
        System.out.println("调用了dog类重写animal类的方法");
        super.eat();   //也可以调用原本父类的方法;
    }
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
    public void play(){
        System.out.println("狗会玩");
    }
}

public class XiaoTianQuan extends Dog{
    public XiaoTianQuan(){
        /*super(); 调用父类的构造方法,不写系统会默认调用父类无参的构造方法
        显性调用父类有参的构造方法;
        当用super()调用父类的构造方法时必须写在子类构造方法的第一行,调用其他方法可以不写在第一行;
        因为父类的变量要先初始化子类接下来可能要马上使用*/
        super("导盲犬");
        super.play();
        System.out.println("调用了哮天犬无参的构造方法");
    }
    public void fly(){
        System.out.println("哮天犬会飞");
    }
}


public class Test {
    public static void main(String[] args) {
      //  继承:提高代码的复用性,一个类只能有一个父类
        //如果一个类没有显性的继承一个父类,那么这个类会自动继承object类
        //将子类共有的属性和行为放到父类中
        //子类构造方法总是先调用父类构造方法(默认无参)
        //可以在子类构造方法的第一行,使用super关键字调用父类任意一个构造方法
        //如果用super,必须写在构造方法的第一句
        Dog xh=new Dog();
        xh.setAge(10);   //子类通过set方法调用父类的私有属性
        xh.sleep();   //子类调用父类的公开方法;
        xh.play();   //子类调用自身的方法;
        System.out.println(xh.getAge());
        Cat gg=new Cat();
        gg.yell();   //子类调用自身方法;
        gg.setName("乖乖");
        System.out.println(gg.getName());
        XiaoTianQuan xt=new XiaoTianQuan();
        xt.fly();   //调用自身方法;
        xt.play();   //调用父类的方法
        xt.eat();    //调用父类的父类的方法;
        System.out.println(xt.getType());
    }
}

public class Test2 {
    public static void main(String[] args) {
        Dog xb=new Dog();
        xb.eat();   //调用重写的方法
        //成员变量不存在重写,每个类里面要有自己的一份成员变量
        xb.name="小白";     //这是dog类自己的成员变量
        System.out.println(xb.getName());   //这里调用的是Animal的name成员变量(没有显性赋值,所以为默认值null)
        System.out.println(xb.name);//调用Dog类的name成员变量
    }
}


6.抽象方法和抽象类

1.抽象方法

抽象方法:一种特殊的方法,它只有声明,而没有具体的实现,用abstract关键字进行修饰。

2.抽象类

如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
1.抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法
2.用abstract修饰的类就是抽象类。如果某个类中包含有抽象方法,那么该类就必须定义成抽象类。

1.抽象类不能被实例化,但可以有构造方法,因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象。
2.一个类如果继承了抽象类 要么重写抽象类中所有的抽象方法,要么将该类也定义为抽象类
3.抽象类中可以没有抽象方法,有抽象方法必定是抽象类

3.抽象方法和抽象类的层面

抽象方法和抽象类在软件开发过程中都是设计层面的概念。也就是说,设计人员会设计出抽象类,抽象方法,程序员都是来继承这些抽象类并覆盖抽象方法,实现具体功能。

4.抽象类和抽象方法的代码部分

package com.ffyc.oop.day3.demo2;
public abstract class Animal {
    /*如果一个类没有足够的信息来描述一个具体的对象,那么这个类可以定义为抽象类;
      抽象类中可以没有抽象方法,如果包含抽象方法一定要声明成抽象类
      抽象类的其他功能依然存在,成员变量,构造方法,成员方法*/
    int number;
    public abstract void eat();//抽象方法没有具体的代码块;
    /*抽象类不能被实例化,但可以有构造方法,因为抽象类中含有无具体实现的方法,
    所以不能用抽象类创建对象。*/
    public Animal(){
        System.out.println("调用了Animal的构造方法");
    }
    public void sleep(){
        System.out.println("睡觉");
    }
}
//继承抽象类必须实现抽象类中的所有抽象方法,不然该类也要被定义成抽象类
public class Dog extends Animal{
    /*抽象类,抽象方法,在软件开发过程中都是设计层面的概念。也就是说,
    设计人员会设计出抽象类,抽象方法,程序员都是来继承这些抽象类并
    覆盖抽象方法,实现具体的功能*/
    @Override
    public void eat() {     //实现抽象方法  已实现方法的参数、返回值要和抽象类中的方法一致
        System.out.println("狗在吃");
    }
}
public class Test {
    public static void main(String[] args) {
        Dog xb=new Dog();
        xb.eat();    //调用实现了的抽象方法
        xb.sleep();   //调用普通方法
        System.out.println(xb.number);
    }
}

二、面向对象特征–多态

1.多态的基本概念

多态:同一种事物,在不同时刻表现不同的状态。
多态存在的三个必要条件:

1.要有继承(包括接口的实现)(前提条件)
2.要有重写(前提条件)
3.父类引用指向子类对象
class Animal{
    .....
}
class Cat extends Animal{
    .....
}
Animal  x=new Cat()   //父类引用指向子类对象

2.多态的三种调用

1.多态环境下对成员方法的调用(编译看左边,运行看右边)。

class Animal{
    void show(){
        System.out.println("Animal");
    }
}
class Cat extends Animal{
    void show(){
        System.out.println("Cat");
    }
}
...........
Animal  x=new Cat()   //父类引用指向子类对象
x.show();  //调用的是Cat中的方法,因为重写了父类的方法,这就是多态的特性

2.多态环境下对静态成员方法的调用(编译看左边,运行看左边)。

class Animal{
   static void show(){
        System.out.println("Animal");
    }
}
class Cat extends Animal{
   static void show(){
        System.out.println("Cat");
    }
}
...........
Animal  x=new Cat()   //父类引用指向子类对象
x.show();  //调用的是Animal中的方法,因为静态的不存在重写,为类所有。

3.多态环境下对成员变量的调用(编译看左边,运行看左边)。

class Animal{
   static void show(){
        int num=3}
}
class Cat extends Animal{
   static void show(){
        int num=4}
}
...........
Animal  x=new Cat()   //父类引用指向子类对象
x.num;  //调用的是Animal的成员变量,成员变量不存在重写

3.多态的转型

向上转型:父类引用指向子类对象,为了提高程序的可扩展性。

例如:可以定义一个方法,参数是Animal,我们可以把Cat类和Dog类和Bird都丢到这个方法中去执行,这样就可以做到一个方法接收不同的对象类型。
缺点:不能调用子类特有的方法,需要向下转型。

class Animal{
   static void show(){
        System.out.println("Animal");
    }
}
class Cat extends Animal{
   static void show(){
        System.out.println("Cat");
    }
    void look(){
         ........
    }
}
...........
Animal  x=new Cat()   //向上转型,Cat对象提升到Animal对象。
x.show();  //只能调用子类重写父类的方法
x.look();   //报错,不能使用子类中特有的方法

向下转型:把父类引用向下强制转换为子类引用,目的是使用子类中特有的方法。

class Animal{
   static void show(){
        System.out.println("Animal");
    }
}
class Cat extends Animal{
   static void show(){
        System.out.println("Cat");
    }
    void look(){
         ........
    }
}
...........
Animal  x=new Cat()   //向上转型,Cat对象提升到Animal对象。
Cat m=(Car)x;  //向下转型
m.show();  
m.look();   //子父类的方法都可以调用

总结:我们可以把向上转型和向下转型结合起来,进一步提高程序的可扩展性。

4.多态的代码部分

public abstract class Animal {
    public abstract void eat();
}

public class Cat extends Animal{
    @Override
    public void eat() {    //重写
        System.out.println("猫吃鱼");
    }
}

public class Dog extends Animal {
    @Override
    public void eat() {    //重写
        System.out.println("狗吃肉");
    }
    public void play(){
        System.out.println("狗会玩");
    }
}

public class Test {
     // 多态:同一种事务在不同时刻表现不同的状态
    //多态的三个条件:1.要有继承 2.要有重写 3.父类引用指向子类对象
    //多态环境下对成员方法的调用:编译看左边,运行看右边
    //多态环境下对静态成员方法的调用:编译和运行都看左边
    //多态环境下对成员变量的调用:编译和运行都看等号左边
    public static void main(String[] args) {
        Animal xb=new Dog();   //父类引用指向子类对象;
        xb.eat();
        xb=new Cat();     //父类引用指向子类对象
        xb.eat();
    }
}

public class Test2 {
    public static void main(String[] args) {
        //方法参数多态性的好处:提高代码的扩展性
        Animal dog=new Dog();
        Animal cat=new Cat();   //向上转型 :特高程序的扩展性
        feed(dog);
        feed(cat);
    }
    public static void feed(Animal animal){
         animal.eat();   //调用子类重写父类的方法
         if(animal instanceof  Dog){        //使用instance关键字判断是否为特定类型
             ((Dog) animal).play();     //向下转型 :为了使用子类中的特有的方法
         }
    }
}


三、final关键字

final 用于声明属性,方法和类。
1.修饰属性的时候:定义就必须直接赋值或者在构造方法中进行赋值,并且后期都不能修改。
2.修饰方法的时候:子类里不可以重写。
3.修饰类的时候:不能被定义为抽象类或是接口,不可被继承。

public class FinalDemo {
    //final关键字可以修饰类,属性,方法
    //final修饰的类不能被继承,不能被定义为抽象类或者接口,因为抽象类和接口必须被继承才能实现
    //final修饰的属性必须直接赋值或者在构造方法里面赋值,并且后期不能修改
    //final修饰的方法不能被重写
    public static final int number=1;   //直接赋值,一般加上static关键字,所有对象共享一份,值相同
    final int id;   //使用构造方法赋值; 每个对象可以有不同的值

    public FinalDemo(final int a) {  //在方法参数前面加final关键字,为了防止数据在方法体中被修改。
     //    a=9;    报错,因为a是final类型的形参不能被修改值
        id = a;
    }
    public FinalDemo(){
       id=0;
    }
    public final void play(){
        System.out.println("测试");
    }

    public static void main(String[] args) {
        FinalDemo f1=new FinalDemo(10);
        FinalDemo f2=new FinalDemo(20);
       //总的原则:保证创建每一个对象的时候,final属性的值是确定的
        System.out.println(f1.id);
        System.out.println(f2.id);
    }
}

四、接口

1.什么是接口

接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过实现接口的方式,从而来继承接口的抽象方法。

例如:在日常的生活之中,接口这一名词经常听到的,例如:USB接口、打印接口、充电接口等等。
如果要进行开发,要先开发出USB接口标准,然后设备厂商才可以设计出USB设备。

接口存在的意义:java中一个类只能有一个父类,所以用接口可以实现多继承的逻辑 (一个类可以实现多个接口)。

2.接口的定义

接口的定义:使用 interface 关键字用来声明一个接口。

public interface  Myinterface extends Myinterface3, Myinterface2{   //一个接口能继承其它多个接口。
   /*    接口不可以被实例化
         实现类必须重写接口的所有方法
         实现类可以实现多个接口
         接口中的变量都是静态常量*/
    //所有属性默认为public static final
    int number=10;
    //所有方法都是public abstract(java8之前)
    //定义抽象方法
    public abstract void eat();
    //定义默认方法(java8之后还可以定义默认方法和静态方法)  用子类对象调用
    default void play(){
        System.out.println("玩");
    }
    //定义静态方法 直接用接口名调用
    static void sleep(){
        System.out.println("睡觉");
    }

}

接口的使用:类使用implements关键字实现接口。

public class MyinterfaceImpl implements  Myinterface,Myinterface2 {
    @Override //实现接口中的方法
    //实现类可以实现多个接口;
   /* 当类实现接口的时候,类要实现接口中所有的方法。否则,类必须声明
    为抽象的类*/
    public void eat() {
        System.out.println("吃");
    }
    @Override
    public void jump() {
        System.out.println("跳");
    }
    @Override
    public void work() {
        System.out.println("工作");
    }
    public static void main(String[] args) {
        MyinterfaceImpl m1=new MyinterfaceImpl();
        m1.play();  //子类对象调用默认方法;
        Myinterface.sleep(); //接口名调用静态方法
        m1.eat();
        m1.jump();
        m1.work();
    }

}

3.抽象类和接口的区别

1.在语法方面

抽象类:
1.由abstract关键词修饰的类称之为抽象类。
2.抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法。
3.抽象类中也可以没有抽象方法。

4.继承抽象类的非抽象类必须实现其中的所有抽象方法,而已实现方法的参数、返回值要和抽象类中的方法一样。否则,该类也必须声明为抽象类。

接口:
1.由interface关键词修饰的称之为接口;
2.接口中可以定义成员变量,但是这些成员变量默认都是public static final的常量。
3.接口中的所有方法都是public abstract(java8之前)
4.接口中没有已经实现的方法,全部是抽象方法(java8之后还可以定义默认方法和静态方法)
5.一个类可以实现多个接口,一个接口可以继承多个接口。

6.接口不能实例化对象(无构造方法),但可以声明对象的引用(多态性)。

2.在使用方面

先来举一个简单的例子:
狗都具有 eat() 、sleep() 方法,我们分别通过抽象类和接口定义这个抽象概念。

//通过抽象类定义
  public abstract class Dog {
      public abstract void eat();
      public abstract void sleep();  
  }  
  //通过接口定义
  public interface Dog {
      public abstract void eat();
      public abstract void sleep();
  }

思考:但是我们现在如果需要让狗拥有一项特殊的技能——钻火圈 DrillFireCircle(),如何增加这个行为呢?

1.将钻火圈方法与前面两个方法一同写入抽象类中,但是这样的话,但凡继承这个抽象类狗都具有了钻火圈技能,明显不合适。
2.将钻火圈方法与前面两个方法一同写入接口中,当需要使用钻火圈功能的时候,就必须实现 接口中的eat() 、sleep() 方法(重写该接口中所有的方法)显然也不合适 。

那么该如何解决呢 ? 我们可以仔细想一想,eat和sleep都是狗本身所应该具有的一种行为,而钻火圈这种行为则是后天训练出来的,只能算是对狗类的一种附加或者延伸, 两者不应该在同一个范畴内,所以我们考虑将这个单独的行为,独立的设计一个接口,其中包含DrillFireCircle()方法, Dog设计为一个抽象类, 其中又包括eat() 、sleep() 方法.一个SpecialDog即可继承Dog类并且实现DrillFireCircle()接口。

//定义接口,含有钻火圈方法
  public interface DrillFireCircle() {
      public abstract void drillFireCircle();
  }//定义抽象类狗类
  public abstract class Dog {
      public abstract void eat();
      public abstract void sleep();
  }
   
  //继承抽象类且实现接口
  class SpecialDog extends Dog implements drillFireCircle {
      public void eat() {
        //....
      }
      public void sleep() {
        //....
      }
      public void drillFireCircle() () {
        //....
      }
  }

总结:
继承是一个 "是不是"的关系,而接口实现则是 "有没有"的关系。如果一个类继承了某个抽象类,则子类必定是抽象类的种类,而接口实现则是有没有、具备不具备的关系,比如狗是否能钻火圈,能则可以实现这个接口,不能就不实现这个接口。


五、总结

本章节的内容知识点较多,难度较大,需要大家勤加练习,在自己动手编写代码的过程中感受JAVA继承和多态的魅力。同时,因为接口和抽象类的存在,赋予了JAVA强大的面向对象的能力。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
本书为中南大学精品教材立项项目,分为上下两篇共21,涵盖了面向对象技术中Java开发环境配置、程序设计基础、面向对象原理以及UML的知识。本书使用的开发环境是JDK 1.6+Eclipse 3.3+Rational Rose 2003,逐步引领读者从基础到各个知识点进行学习。全书内容由浅入深,并辅以大量的实例说明,书本阶段性地提供了一些实验指导。 本书提供了所有实例的源代码以及开发过程中用到的软件下载地址,供读者学习参考使用。 本书为学校教学量身定做,供高校面向对象技术相关课程使用,对于缺乏项目实战经验的程序员来说可用于快速积累项目开发经验。 本书是中南大学精品教材建设中的一本特色教材,为高校计算机相关专业提供面向对象技术和UML的讲解。本书采用Java语言进行描述,针对Java技术标准编程进行详细的讲解,以简单通俗易懂的案例,逐步引领读者从基础到各个知识点进行学习。本书涵盖了JavaSE开发环境配置、程序设计基础、面向对象相关技术、常用API、UML基础知识。在节中穿插了上机习题,并提供了答案,用于对该内容进行阶段性总结演练。 作者长期从事教学工作,积累了丰富的经验,其“实战教学法”取得了很好的效果。本书适合教学。书中节安排适当,将习题融于讲解的过程中,教师可以根据情况选用,也可以进行适当增减。 本书的知识体系结构如下所示,遵循了循序渐进的原则,逐步引领读者从基础到各个知识点进行学习。 上篇面向对象技术 第1Java入门 第2程序设计基础: 变量及其运算 第3程序设计基础: 流程控制和数组 第4实验指导1 第5类、对象和成员 第6封装 第7继承和多态 第8实验指导2 第9异常处理 第10Java常用API 第11Java IO操作 第12多线程开发 第13反射技术 第14实验指导3 下篇UML 第15UML入门 第16用例图 第17类图和对象图 第18实验指导4 第19顺序图、协作图、状态图和活动图 第20包图、构件图和部署图 第21实验指导5 本书提供了全书所有实例的源代码,供读者学习参考使用,所有程序均经过了作者精心的调试。 由于时间仓促和作者水平有限,书中的错误和不妥之处敬请读者批评指正。 有关本书的意见反馈和咨询,读者可在清华大学出版社相关版块中与作者进行交流。 郭克华 2013年11月 目录 上篇面向对象技术 第1Java入门 1.1认识Java 1.1.1认识编程语言 1.1.2Java的来历 1.1.3Java为什么流行 1.1.4Java的三个版本 1.1.5编程前的准备工作 1.2安装JDK 1.2.1获取JDK 1.2.2安装JDK步骤 1.2.3安装目录介绍 1.2.4环境变量设置 1.3开发第一个Java程序 1.3.1如何编写源代码 1.3.2如何将源代码编译成.class文件 1.3.3如何执行.class文件 1.3.4新手常见错误 1.4用Eclipse开发Java程序 1.4.1Eclipse的概念 1.4.2安装Eclipse 1.4.3如何建立项目 1.4.4如何开发Java程序 1.4.5如何维护项目 1.5小结 第2程序设计基础:变量及其运算 2.1认识变量 2.1.1变量的定义 2.1.2变量有哪些类型 2.2如何使用变量 2.2.1如何使用整型变量 2.2.2如何使用浮点型变量 2.2.3如何使用字符型变量 2.2.4如何使用布尔型变量 2.2.5基本数据类型之间的类型转换 2.2.6基本数据类型和字符串之间的转换 2.2.7变量的作用范围 2.3注释的书写 2.4Java中的运算 2.4.1算术运算 2.4.2赋值运算 2.4.3关系运算 2.4.4逻辑运算 2.4.5运算符的优先级 2.5小结 第3程序设计基础:流程控制和数组 3.1判断结构 3.1.1为什么需要判断结构 3.1.2if结构 3.1.3switch结构 3.2认识循环结构 3.2.1为什么需要循环结构 3.2.2while循环 3.2.3dowhile循环 3.2.4for循环 3.2.5循环嵌套 3.2.6break和continue 3.3数组 3.3.1为什么需要数组 3.3.2如何定义数组 3.3.3如何使用数组 3.3.4数组的引用性质 3.3.5数组的应用 3.3.6多维数组 3.4小结 第4实验指导1 4.1关于变量和数据类型的实践 4.2流程控制和数组的综合实践 第5类、对象和成员 5.1认识类和对象 5.1.1为什么需要类 5.1.2如何定义类 5.1.3如何使用类实例化对象 5.1.4如何访问对象中的成员变量 5.1.5对象的引用性质 5.2认识成员函数 5.2.1为什么需要函数 5.2.2如何定义和使用成员函数 5.2.3函数参数的传递 5.2.4认识函数重载 5.3认识构造函数 5.3.1为什么需要构造函数 5.3.2如何定义和使用构造函数 5.4静态变量和静态函数 5.4.1为什么需要静态变量 5.4.2静态变量的常见应用 5.4.3认识静态函数 5.4.4静态代码块 5.5小结 第6封装 6.1使用封装 6.1.1为什么需要封装 6.1.2如何实现封装 6.2使用包 6.2.1为什么需要包 6.2.2如何将类放在包中 6.2.3如何访问包中的类 6.3使用访问控制修饰符 6.3.1什么是访问控制修饰符 6.3.2类的访问控制修饰符 6.3.3成员的访问控制修饰符 6.4使用类中类 6.5小结 第7继承和多态 7.1使用继承 7.1.1为什么需要继承 7.1.2如何实现继承 7.1.3继承的底层本质 7.2成员的覆盖 7.2.1什么是成员覆盖 7.2.2成员覆盖有何作用 7.3使用多态性 7.3.1什么是多态 7.3.2如何使用多态性 7.3.3父子类对象的类型转换 7.4抽象类和接口 7.4.1为什么需要抽象类 7.4.2为什么需要接口 7.5其他内容 7.5.1final关键字 7.5.2Object类 7.6一些工具的使用 7.6.1将字节码打包发布 7.6.2文档的使用 7.7小结 第8实验指导2 8.1单例模式的设计 8.1.1需求简介 8.1.2不用单例模式的效果 8.1.3最原始的单例模式 8.1.4首次改进 8.1.5再次改进 8.1.6思考题 8.2利用继承和多态扩充程序功能 8.2.1需求简介 8.2.2实现方法 8.2.3出现的问题 8.2.4改进 8.2.5测试 第9异常处理 9.1认识异常 9.1.1生活中的异常 9.1.2软件中的异常 9.1.3为什么要处理异常 9.1.4异常机理 9.1.5常见异常 9.2异常的就地捕获 9.2.1为什么要就地捕获 9.2.2如何就地捕获异常 9.2.3如何捕获多种异常 9.2.4用finally保证安全性 9.3异常的向前抛出 9.3.1为什么要向前抛出 9.3.2如何向前抛出 9.4自定义异常 9.4.1为什么需要自定义异常 9.4.2如何自定义异常 9.5小结 第10Java常用API 10.1数值运算 10.1.1用Math类实现数值运算 10.1.2实现随机数 10.2用String类进行字符串处理 10.3用StringBuffer类进行字符串处理 10.4基本数据类型的包装类 10.4.1认识包装类 10.4.2通过包装类进行数据转换 10.5认识Java集合 10.5.1为什么需要集合 10.5.2Java中的集合 10.6使用一维集合 10.6.1认识一维集合 10.6.2使用List集合 10.6.3使用Set集合 10.6.4使用Collections类对集合进行处理 10.6.5使用泛型简化集合操作 10.7Java中的二维集合 10.7.1使用Map集合 10.7.2使用Hashtable和Properties 10.8小结 第11Java IO操作 11.1认识IO操作 11.2用File类操作文件 11.2.1认识File类 11.2.2使用File类操作文件 11.2.3使用File类操作目录 11.3字节流的输入输出 11.3.1认识字节流 11.3.2如何读写文件 11.3.3如何读写对象 11.4字符流的输入输出 11.4.1认识字符流 11.4.2如何读写文件 11.4.3如何进行键盘输入 11.5和IO操作相关的其他类 11.5.1用RandomAccessFile类进行文件读写 11.5.2使用Properties类 11.6小结 第12多线程开发 12.1认识多线程 12.1.1为什么需要多线程 12.1.2继承Thread类开发多线程 12.1.3实现Runnable接口开发多线程 12.1.4两种方法有何区别 12.2控制线程运行 12.2.1为什么要控制线程运行 12.2.2传统方法的安全问题 12.2.3如何控制线程的运行 12.3线程同步安全 12.3.1什么是线程同步 12.3.2一个有问题的案例 12.3.3如何解决 12.3.4小心线程死锁 12.4认识定时器 12.4.1为什么需要定时器 12.4.2如何使用定时器 12.5小结 第13反射技术 13.1为什么要学习反射 13.1.1引入配置文件 13.1.2配置文件遇到的问题 13.2认识Class类 13.2.1什么是Class类 13.2.2如何获取一个类对应的Class对象 13.2.3如何获取类中的成员信息 13.3通过反射机制访问对象 13.3.1如何实例化对象 13.3.2如何给成员变量赋值 13.3.3如何调用成员函数 13.4何时使用反射 13.5动态异常处理框架 13.5.1框架功能简介 13.5.2重要技术 13.5.3框架代码编写 13.5.4使用该框架 13.6小结 第14实验指导3 14.1字符频率统计软件 14.1.1软件功能简介 14.1.2重要技术 14.1.3项目结构 14.1.4代码编写 14.1.5思考题 14.2文本翻译软件 14.2.1软件功能简介 14.2.2重要技术 14.2.3项目结构 14.2.4代码编写 14.2.5思考题 14.3用享元模式优化程序性能 14.3.1为什么需要享元模式 14.3.2重要技术 14.3.3代码编写 14.3.4思考题 下篇UML 第15UML入门 15.1认识UML 15.1.1为什么需要UML 15.1.2UML的来历 15.2用Rational Rose进行UML建模 15.2.1什么是Rational Rose 15.2.2安装Rational Rose 15.2.3如何使用Rational Rose 15.2.4UML图的种类 15.3小结 第16用例图 16.1认识用例图 16.1.1为什么需要用例图 16.1.2什么是用例图 16.2详解用例图 16.2.1系统边界 16.2.2参与者 16.2.3用例 16.2.4箭头 16.2.5注释 16.2.6用Rational Rose画用例图 16.2.7用例规约 16.3一个案例 16.3.1案例描述 16.3.2画出用例图 16.3.3写出用例描述 16.4小结 第17类图和对象图 17.1认识类图 17.1.1为什么需要类图 17.1.2什么是类图 17.2详解类图 17.2.1类 17.2.2箭头 17.2.3注释 17.2.4用Rational Rose画类图 17.3对象图 17.4小结 第18实验指导4 18.1用例图练习 18.1.1软件功能简介 18.1.2识别系统中的参与者和用例 18.1.3画出用例图 18.1.4用例描述 18.2类图练习 18.2.1练习1: 根据代码画出类图 18.2.2练习2: 根据需求构建类图 18.3思考题 第19顺序图、协作图、状态图和活动图 19.1顺序图 19.1.1什么是顺序图 19.1.2详解顺序图 19.1.3用Rational Rose画顺序图 19.2协作图 19.2.1什么是协作图 19.2.2详解协作图 19.2.3用Rational Rose画协作图 19.3状态图 19.3.1什么是状态图 19.3.2详解状态图 19.3.3用Rational Rose画状态图 19.4活动图 19.4.1什么是活动图 19.4.2详解活动图 19.4.3用Rational Rose画活动图 19.5小结 第20包图、构件图和部署图 20.1包图 20.1.1什么是包图 20.1.2详解包图 20.1.3用Rational Rose画包图 20.2构件图 20.2.1什么是构件图 20.2.2详解构件图 20.2.3用Rational Rose画构件图 20.3部署图 20.3.1什么是部署图 20.3.2详解部署图 20.3.3用Rational Rose画部署图 20.4小结 第21实验指导5 21.1顺序图、协作图练习 21.1.1功能简介 21.1.2创建顺序图 21.1.3创建协作图 21.2状态图、活动图练习 21.2.1功能简介 21.2.2创建状态图 21.2.3创建活动图 21.3包图、构件图和部署图练习

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JinziH Never Give Up

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值