4 Day09--面向对象4

4.1  异常

4.1.1     概述

用来封装错误信息的对象。

组成结构:类型,提示,行号。

4.1.2     异常的继承结构

Throwable - 顶级父类

-- Error:系统错误,无法修复

-- Exception:可修复的错误

--RunTimeException

--ClassCastException

--ClassNotFoundException

4.1.3     异常处理

程序中遇到了异常,通常有两种处理方式:捕获或者向上抛出。

当调用了一个抛出异常的方法时,调用位置可以不做处理继续向上抛出也可以捕获异常。

1、捕获方式:

try{

    需要捕获的代码

}catch(异常类型  异常名){

    处理方案

}

2、抛出方式:

在会发生异常的方法上添加代码:throws 异常类型

例如:  public static void main(String[] args)  throws Exception{

4.1.4     测试

接收键盘输入的两个数字并做除法运算

package cn.tedu.exception;

 

import java.util.Scanner;

 

//测试异常的发生和解决

public class Test6_Exception {

   

//     接收键盘输入的两个整数并做除法运算

    public static void main(String[] args) {

      

//1,捕获异常:把可能发生异常的代码放在try里,

//当异常发生时会被catch住并执行catch中的代码执行异常处理的代码

       try {

           int a = new Scanner(System.in).nextInt();

           int b = new Scanner(System.in).nextInt();

          

           System.out.println(a/b);

       } catch (Exception e) {

           //提出解决方案

           System.out.println("您输入的两次整数有误!");

       }

      

    }

   

}

.2  访问控制符

用来控制一个类,或者类中的成员的访问范围。

 

子类

任意

public

protected

 

default

 

 

private

 

 

4.3  抽象类

4.3.1     概念

Java中可以定义没有方法体的方法,该方法由其子类来具体的实现。该没有方法体的方法我们称之为抽象方法,含有抽象方法的类我们称之为抽象类。

抽象类可以理解为是一个只有方法声明没有方法体的特殊类。

举例:水果,东西。。

修饰符 abstract 返回值 方法名(参数列表);

 

class A{

       public void eat(){//声明一样,可以提取

              syso("eat...B")    }

}

class B{

       public void eat(){//声明一样,可以提取

       syso("eat。。。A")   }

}            

abstract class C{

              public abstract void eat();

}

4.3.2     特点

1、  通过java关键字abstract实现

2、  可以修饰方法或者类

3、  抽象类中可以没有抽象方法(由子类去实现)

4、  如果类中有抽象方法,那该类必须定义为一个抽象类

5、  子类继承了抽象类以后,要么还是一个抽象类,要么就把所有抽象方法都重写

6、  多用于多态中

7、  抽象类不可以被实例化

 

4.3.3     入门案例

package day009;

 

public class Test1_Animal {

       public void eat(){

              System.out.println("吃饭饭");

       }

}

/*

 * 每种动物都需要吃,

 * 发现了,方法声明都一样,只是方法体不一样

 *

class Dog extends Test1_Animal{

       public void eat(){

              System.out.println("狗吃肉");

       }

}

 

class Cat extends Test1_Animal{

       public void eat(){

              System.out.println("猫吃鱼");

       }

}*/

 

//上面的eat()声明都一样,就是方法体不一样,那就只抽取方法声明部分。

//The type Animal must be an abstract class to define abstract methods

 abstract class Animal extends Object{

        //This method requires a body instead of a semicolon

       public abstract  void eat();

}

 

 //继承抽象类,并实现抽象方法

//The type Dog must implement the inherited abstract method Animal.eat()

abstract class Dog extends Animal{

     //可以实现抽象方法,也可以子类再变成一个抽象类

}

 

class Cat extends Animal{

       public void eat() {

              System.out.println("猫吃鱼");

       }

      

}

4.4  抽象类的用法

4.4.1     构造函数

抽象类也有构造方法,但是不能本身实例化。

那抽象类的构造函数有啥用?一般用于给子类实例化。

package day009;

 

//抽象类的构造方法

public class Test2_Animal2 {

 

}

abstract class Animal2{

       //抽象类可以有构造方法,但是无法实例化

       //用于子类实例化

       public Animal2(){

              System.out.println("fu..Animal2()");

       }

}

class Zi2 extends Animal2{

      

}

 

class TestAnimal2{

       public static void main(String[] args) {

//           Animal2 a2 = new Animal2();//抽象类无法实例化   

//           Zi2 z=new Zi2();//创建子类实例化对象

 

              Animal2 a2 = new Zi2();//抽象类多用于多态    

       }

}

4.4.2     抽象类的成员变量

既可以有变量,也可以有常量。

package day009;

//成员变量

public class Test3_Animal3 {

 

      

}

 

abstract class Animal3{

       //String name;  //1

       //String name="大黄";  //2

       private String name="大黄";  //3

       public final int age=10;

      

       //3.1如果是私有变量想要取值,就提供getXxx()

       public String getName(){

              return name;

       }

}

 

class Zi3 extends Animal3{

      

}

 

class Test3Demo{

       public static void main(String[] args) {

              Animal3 a = new Zi3();//抽象类多用于多态

              //System.out.println(a.name());  //1或者2

              System.out.println(a.getName());  //3

              System.out.println(a.age);

             

       }

}

4.4.3     抽象类的成员方法

抽象类里,既可以有普通方法,有可以有抽象方法。

package day009;

//成员方法

public class Test4_Animal4{

}

 

abstract class Animal4{

       //抽象类中的普通方法

       public void speek(){

              System.out.println("fu...speak()");

       }

       //抽象类里的抽象方法

       public abstract void study();

}

 

class Zi4 extends Animal4{

       //重写抽象方法

       public void study(){

              System.out.println("zi...study()");

       }

}

 

class Zi4Test{

       public static void main(String[] args) {

              Zi4 znew Zi4();

              z.speek();//fu...speak()

              z.study();//zi...study()

       }

}

4.5  分析老师示例

具体事物:培优班老师,   高手班老师

共性:备课,讲课

package day009;

 

public class Test5_Teacher {

 

}

 

abstract class Teacher{

       private String name;

       private int age;

       public void setName(String name){

              this.name=name;

       }

       public void setAge(int age){

              this.age=age;

       }

       public String getName(){

              return name;

       }

       public int getAge(){

              return age;

       }

       public abstract void teach();

      

       public void print(){

              System.out.println(name+"........"+age);

       }

      

      

}

class CgbTeacher extends Teacher{

       public void teach() {

              System.out.println("主打互联网架构的讲解");

       }

}

class ActTeacher extends Teacher{

       public void teach() {

              System.out.println("主打高薪冲刺");

       }

}

 

class Test5Demo{

       public static void main(String[] args) {

              CgbTeacher ct=new CgbTeacher();

              ct.teach();ct.setName("陈子枢");ct.setAge(20);

              ct.print();

             

             

              ActTeacher at=new ActTeacher();

              at.teach();

              at.setAge(30);

              at.setName("大佬");

              at.print();

             

              Teacher t = new CgbTeacher();

              t.teach();

              t.setName("jack");

              t.setAge(10);

              t.print();

       }

}

 

package cn.tedu.oop;
//描述高手班老师
public class ActTeacher extends Teacher{
    @Override
    public void ready() {
         System.out.println("高手班老师正在备课");
     };
     @Override
    public void teach() {
         System.out.println("高手班老师正在讲课");
    };
}

 

package cn.tedu.oop;
//描述培优班老师事物
public class CgbTeacher extends Teacher{
    @Override
     public void ready() {
         System.out.println("培优班老师正在备课");
     };
     @Override
    public void teach() {
         System.out.println("培优班老师正在讲课");
    };
}
 

package cn.tedu.oop;
//把子类的共性功能提取出来,形成父类
/*在父类中,可以不提供方法体,变成抽象方法,类里有抽象方法,这个类
 * 变成抽象类,少写了很多代码,提高开发效率
 * 抽象类的体现就是程序优化的结果
 * */
abstract public class Teacher {
    //备课/讲课

    //可以把父类的方法体给优化掉
    /*
     * 因为子类提供的方法体有点多余,
     * 子类继承后需要重写
     * */
        abstract public void ready();
        
        abstract public void teach();
}
 

package cn.tedu.oop;

import java.util.Scanner;

public class Test1_Exception {

    public static void main(String[] args){
        //method();//暴露异常
        try {
            method2();//异常抛出
        } catch (Exception e) {
            System.out.println("运算异常");
        }
        

    }
    //在方法声明上添加throws异常类型
    public static void method2() throws Exception{//多态
        //接收键盘输入的两个整数
        int a=new Scanner(System.in).nextInt();
        int b=new Scanner(System.in).nextInt();
        //做除法运算
        System.out.println(a/b);
        
    }

    //暴露异常
    public static void method() {
        //接收键盘输入的两个整数
        int a=new Scanner(System.in).nextInt();
        int b=new Scanner(System.in).nextInt();
        //做除法运算
        System.out.println(a/b);
        
    }
}
 

package cn.tedu.oop;
//测试抽象类
//抽象类不能被实例化(new )
//抽象类多用于多态中
public class Test2_Abstract {

    public static void main(String[] args) {
        //创建多态对象
        Animal a=new Cat();//父类引用指向子类对象
        //编译看左边--功能向父类看齐,父类就是标准
        //运行看右边--结果要看子类是怎么干的--针对方法重写提的
        a.eat();//猫吃鱼
        a.sleep();//呼呼大睡

    }

}

//普通类,普通方法
//如果类里包含抽象方法,这个类就是抽象类
abstract class Animal{
    //通过abstract关键字来描述抽象
    //抽象方法只有方法声明没有方法体
    abstract public void eat();
    public void sleep() {
        System.out.println("呼呼大睡");
    };
}

//子类继承抽象类以后,
//1.要么是一个抽象类
//2.要么把所有抽象方法都重写
abstract class Dog extends Animal{
    
}

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

 

package cn.tedu.oop;
//测试抽象类使用构造方法
public class Test3_Useabstract {

    public static void main(String[] args) {
        // 测试

        //触发子类的构造方法
        new Dog2();
        
    }

}
//抽象类
abstract class Animal2{
    //抽象类里可以有构造方法
    //不是为了让自己new 而是为了让子类new 
    //构造方法
    public Animal2() {
        System.out.println("父类的构造方法");
    }
}

class Dog2 extends Animal2{
    public Dog2() {
        //隐藏着super()--会去找父类的无参构造
        super();
        //有一个默认的无参构造
        System.out.println("子类的构造方法");
    }
    
}

 

package cn.tedu.oop;
//测试抽象类使用成员变量
//抽象类里可以有变量也可以有常量
public class Test4_UseAbstract2 {

    public static void main(String[] args) {
        //测试变量能否被继承

        Animal3 a=new Dog3();
        a.name="二哈";
        System.out.println(a.name);//二哈
        System.out.println(a.MAX_VALUE);//获取值127
    }

}
//抽象类 成员变量
abstract class Animal3{
    //抽象类中可以提供变量
    String name="大黄";
    //抽象类中可以提供常量吗?
    //常量是不可以修改的
    public static final byte MAX_VALUE =127;
}
class Dog3 extends Animal3{
    
}

 

package cn.tedu.oop;
//测试 抽象类使用成员方法
//抽象类是一个特殊的类
//非常灵活,特殊在类里 有抽象方法,也可以有普通方法
public class Test5_Useabstract3 {

    public static void main(String[] args) {
        Animal4 a=new Dog4();
        a.sleep();//普通方法--重写前用父类的,重写后用子类的
        a.eat();//抽象方法--用了父类的方法声明,子类的方法体
        a.game();//抽象方法--用了父类的方法声明,子类的方法体

    }

}
//如果类里都是普通方法,这个类仍然被修饰成了抽象类-抽象类不能实例化(new)
abstract class Animal4{
    //普通方法
    public void sleep() {
        System.out.println("sleep()....");
    }
    abstract public void eat();
    //抽象方法
    abstract public void  game();
}
//抽象类的子类,有两条路:
//1.要么是抽象类,要么把所有的抽象方法都重写
//2.继承过来的普通方法,需要 就重写,不需要就不重写
//abstract class Dog4 extends Animal4{
//    
//}

class Dog4 extends Animal4{
    @Override
    public void sleep() {
        System.out.println("sleep()1....");
    }
    @Override
    public void eat() {
        System.out.println("吃肉");
    };
    @Override
     public void  game() {
         System.out.println("玩球");
     };
}

//抽象类的子类,可以还是一个抽象类
abstract class Cat4 extends Animal4{
    //Animal4里面有两个抽象方法,你只重写一部分的话,就是说明还包含着没重写
    //的抽象方法,还是一个抽象类
}

 

package cn.tedu.oop;
//程序设计
/*
 * 具体事物:培优班老师,高手班老师
 * 共性:备课/讲课
 * 测试:创建多态对象测试
 * 
 * 设计思路:
 * 1.有两个事物需要描述,就应该对应程序中的两个类
 * 2.每各类都需要提供共性的功能:备课/讲课
 * 3.把共性的功能,提取出来,形成父类
 * 4.需要考虑,把父类进行设计优化,可以把父类修饰成抽象类
 * */
public class Test6_Design {

    public static void main(String[] args) {
        Teacher t=new CgbTeacher();
        t.ready();//培优班老师正在备课
        //使用了父类的方法声明 ,使用了子类的方法体
        t.teach();//培优班老师正在讲课
        
        Teacher t2=new ActTeacher();
        t2.ready();//高手班老师正在备课
        t2.teach();//高手班老师正在讲课
    }

}
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值