Java面向对象(二)

一、继承(extends)

1.super关键字

  super→父类对象

  •         通过super关键字来实现对父类成员的访问,来引用当前对象的类
  •         super调用构造方法时只能是第一句
  •         super不能访问父类的private

2.继承

  • 作用:

        子类拥有父类的属性和方法,减少重复的代码,维护性高(代码简洁、提高了代码的复用性)

  • 缺点:

        提高了类之间的耦合性,会造成代码之间的联系越紧密,代码独立性越差

3.extends 与 implements 的区别


extends → 继承父类

interface → 定义接口

implements → 实现接口

相同点:都属于Java中的继承,都发生在多个类中
不同点:
        extends只能是单继承,implements是多继承
        extends继承父类时,父类中可以存在方法的默认实现
        implements在实现接口时接口中不能有方法实现
        extends发生在子类和父类之间,implements发生在实现类和接口之间


二、抽象类 (abstra)

  1. 抽象类特性:有构造方法,但是不可以创建对象
  2. 抽象类不能实例化对象,所以抽象类必须被继承才能被使用
  3. 一个类只能继承一个抽象类,一个类却可以实现多个接口
  4. 抽象子类可以继承抽象父类
  • 抽象方法无方法体,不能创建对象
  • abstra一般不与private、final、static共存
  • 抽象类有构造函数,抽象类的构造函数由子类的super语句来调用,用于给抽象类中的成员初始化
  • Java抽象类中可以包含main方法,它是一个静态方法

//抽象类

public abstract class Pet{

      // 抽象方法

      public abstract void toHospital();

}

抽象方法与抽象类的使用

  • A  抽象类中可以没有抽象方法,但包含了抽象方法的类就必须被定义为抽象类
  • B 没有抽象构造方法,也没有抽象静态方法
  • C 抽象类中可以有非抽象的构造方法,创建子类的实例时可能调用
  • 如果子类没有实现父类的所有抽象方法,子类必须被定义为抽象类
public abstract class Base {
           // A
           public abstract void method1();
           public abstract void method2();
           public void method3(){}
           // B
           //public abstract Base(){}
           //static abstract void method4();
           // C
           public Base(){
    System.out.println("父类的无参构造方法");
           }
            // B
           static void method4(){
    System.out.print("静态方法表示类所特有的功能,这种功   能的实现不依赖于类的具体实例,也不依赖于它的子类。因此,当前类必须为静态方法提供实现");
            }
    
}


三、重写(override)


外壳不变,核心重写

方法名、参数列表、返回值必须一致

class ElectricAppliance{
   public void move(){
      System.out.println("电器需要电压");
   }
}
 
class Television extends Animal{
   public void move(){
      System.out.println("电视需要220伏");
   }
}
 
public class TestTelevision {
   public static void main(String args[]){
     // ElectricAppliance对象
      ElectricAppliance a = new ElectricAppliance();
      // Television 对象
      ElectricApplianceb = new Television (); 
 
      a.move();// 执行 ElectricAppliance类的方法
 
      b.move();//执行 Television 类的方法
   }
}


四、接口(interface)


1.接口 (无构造方法)→提高代码的可拓展性、后期的维护性

  • 接口不是类,是抽象方法的集合
  • 接口无法被实例化,但是可以被实现
  • 接口包含类要实现的方法
  • 接口必须以 I 开头命名

2.接口特性

  •         接口里的所有方法必须是抽象方法
  •         接口中只能声明静态常量
  •         接口是被类实现的,而且可以多实现
  •         接口中的方法都不能被static修饰
  •         一个类只能继承一个抽象类,一个类却可以实现多个接口

3.接口的继承

  •         一个接口能继承另一个接口,和类之间的继承方式比较相似。接口的继承使用extends关键字,子接口继承父接口的方法
  •         Hockey接口自己声明了四个方法,从Sports接口继承了两个方法,这样,实现Hockey接口的类需要实现六个方法
  •         相似的,实现Football接口的类需要实现五个方法,其中两个来自于Sports接口
// 文件名: Sports.java
public interface Sports{
   public void setHomeTeam(String name);
   public void setVisitingTeam(String name);
}
 
// 文件名: Football.java
public interface Football extends Sports{
   public void homeTeamScored(int points);
   public void visitingTeamScored(int points);
   public void endOfQuarter(int quarter);
}
 
// 文件名: Hockey.java
public interface Hockey extends Sports{
   public void homeGoalScored();
   public void visitingGoalScored();
   public void endOfPeriod(int period);
   public void overtimePeriod(int ot);    
}

五、多态


        1.概念

  •         多态是同一个行为具有多个不同表现形式或形态的能力
  •         多态就是同一个接口,使用不同的实例而执行不同操作
  •         多态也就是同一个事件发生在不同的对象上产生不同的结果

        2.多态的三个必要条件
        继承、重写、父类引用指向子类对象

abstract class ElectricAppliance{  
    abstract void form();  
}  
  
class Television extends ElectricAppliance{  
    public void form() {  
        System.out.println("扁平的长方体");  
    }  
    public void work() {  
        System.out.println("播放电视节目");  
    }  
}  
  
class Refrigerator extends ElectricAppliance{  
    public void form() {  
        System.out.println("高高的长方体");  
    }  
    public void work() {  
        System.out.println("存放食物");  
    }  
}


public class Test {
    public static void main(String[] args) {
      show(new Refrigerator ());   // 以 Refrigerator 对象调用 show 方法
      show(new Television ());  // 以 Television 对象调用 show 方法
                
      Animal a = new Television ();  // 向上转型  
      a.form();                          // 调用的是 Television  的 form
      Television c = (Television )a;             // 向下转型  
      c.work();                      // 调用的是 Television 的 work
  }  
            
    public static void show(Animal a)  {
      a.form();  
        // 类型判断
        if (a instanceof Refrigerator )  {              // 冰箱做的事情 
            Refrigerator c = (Refrigerator )a;  
            c.work();  
        } else if (a instanceof Television ) {   // 电视做的事情 
            Television c = (Television )a;  
            c.work();  
        }  
    }  
}

        3.优点

  1.         多态可以消除耦合度
  2.         可替换性
  3.         可扩张性
  4.         接口性
  5.         灵活性
  6.         简化性

六、转型


1.向上转型(隐式/自动类型转型)
        是小类型到大类型的转换
        父类引用指向子类对象,自动进行类型补全
        父类型 引用变量名 = new 子类型();

/测试方法
    ElectricAppliance ea = new Television();
    ea.setLifetime(20);
    Master master = new Master();
    master.maintain(ea );


2.向下转型(强制类型转换)
        将一个指向子类对象的父类引用赋给一个子类的引用
        父类类型转换为子类类型,需要强制类型转换,是大类型到小类型的转换(存在风险、溢出)
        子类型 引用变量名 = ( 子类型 ) 父类型的引用变量

// 如果需要调用子类特有的方法 
// 将pet 转换为Dog类型
Television tv=(Television )ElectricAppliance;       
tv. selectTheChannel();// 执行tv特有的方法


3.instanceof → 用来对类型进行判断

public static void show(ElectricAppliance ea)  {
      ea.form();  
        // 类型判断
        if (ea instanceof Television )  {       // 电视做的事情 
            Television tv = (Television )ea;  
            tv.work();  
        } else if (ea instanceof Refrigerator ) {// 冰箱做的事情 
            Refrigerator rg = (Refrigerator )ea;  
            rg.work();  
        }  
    }  


七、异常(阻止当前方法或作用域继续执行的问题)


1.三大类异常
        用户操作失误、程序错误、物理错误

2.三种类型的异常
        检查性异常、运行时异常、错误

3.Exception → 异常类


        所有的异常类都是从java.lang.Exception类继承的子类

4.常见的异常
        ArraylndexOutOfBoundaException → 数组下标越界
        NullPointerException → 空指针异常
        ClassNotFoundException → 找不到要加载的类
        ClassCastException → 对象强制类型转换出错
5.捕获异常
        try{

                //程序代码(可能出现异常的代码)

        }catch (捕获异常类型声明){

                e.printStack Trace ( ) ;  →打印堆栈信息

        }finally{

                这里的代码永远都会执行

        }

 下边的例子中声明有两个元素的一个数组,当代码试图访问数组的第三个元素的时候就会抛出一个异常。

// 文件名 : ExcepTest.java
import java.io.*;
public class ExcepTest{
   public static void main(String args[]){
      try{
         int a[] = new int[2];
         System.out.println("数组中第3个元素为 :" + a[3]);
      }catch(ArrayIndexOutOfBoundsException e){
         System.out.println("Exception thrown  :" + e);
      }
      System.out.println("Out of the block");
   }
}


  以上代码编译运行输出结果如下: Exception thrown  :java.lang.ArrayIndexOutOfBoundsException: 3 Out of the block              

6.抛出异常
关键字throws/throw区别

throws    throw
生成并抛出异常    声明方法内抛出了异常
位移方法体内部,可作为单独语句使用    必须跟在方法参数列表后面,不能单独使用
抛出一个异常对象,且只能是一个    声明抛出异常类型,可以跟多个异常
异常的原则

异常处理与性能
异常只能用于非正常情况
不要将过于庞大的代码块放在try中
在catch中指定具体的异常类型
需要对捕获的异常做处理


八、总结


1.instanceof的作用是什么?
        判断一个引用类型变量所指向的对象是否是一个类(或接口、抽象类、父类)的实例,即它左边的对象是否是它右边的类的实例,该运算符返回boolean类型的数据

2.多态有何作用?
        将不同的子类对象统一看做父类,屏蔽了不同子类之间的差异,有子类到父类,有特殊到一般,是程序变得通用。

3.如何实现多态?
利用继承,让派生类来重写父类的方法
抽象类的抽象方法实现多态
接口实现多态
4.异常分为Checked异常和运行时异常
5.Checked异常必须捕获或者声明抛出
6.运行时异常不要求必须捕获或者声明抛出
7.try-catch-finally中存在return语句的执行顺序
        1.先执行try块中语句,出现异常,catch捕获到异常;

        2,执行catch块中语句(包括return语句中的表达式运算),但不返回

        3,再执行finally块,

        4,执行finally块,有return,从这里返回。

8.finally块中语句不执行的情况
        不进入try块、程序中止、线程中止

9.throw和throws关键字的区别
throws关键字在方法的声明上使用,表示此方法在调用的时候必须处理异常
throw关键字指的是在方法中,人为的抛出一个异常(这个异常对象可能是自己实例化,或者是抛出已经存在的)

  • 33
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值