oop面向对象第八九天:多态------向上造型/自动类型转换 | 内存管理(堆、栈、方法区)、三大特征(封装/多态/继承)

在这里插入图片描述

面向对象第八天:

回顾:

  1. 接口:

    ​ 引用数据类型,interface定义,只能包含常量和抽象方法

    ​ 不能被实例化,需要被实现,实现类:必须重写所有抽象方法

    ​ 一个类可以实现多个接口,用逗号分隔,若又继承又实现时应先继承后实现

    ​ 接口可以继承接口

    ​ 意义:封装部分派生类所共有的属性和行为----实现多继承

    ​ 是一个标准、是一种规范

笔记:

1、多态:

(1)多态的意义:

  • ①对象的多态:同一个对象被造型为不同的类型时,有不同的功能
    注:所有对象都是多态的
  • ②行为(方法)的多态:同一类型的引用指向不同对象时,有不同的实现
    注:所有的抽象方法都是多态的

例1:
①对象的多态:同一个对象被造型为不同的类型时,有不同的功能
例:我、你、水…————所有对象都是多态的(明天体会)

我 me = new();
讲师 o1 = me;
孩子他妈 o2 = me;
老公的老婆 o3 = me;
o1.授课;
o2.做饭;
o3.收工资;

例2:
②行为(方法)的多态:同一类型的引用指向不同对象时,有不同的实现
例:cut()、move()、getImage()、getScore()————所有的抽象方法都是多态的

人 p1 = new 理发师();
人 p2 = new 外科医生();

(2)向上造型(即自动类型转换):seaobject o = new Battleship();
超类型的引用指向派生类的对象
②能点出来什么,看引用的类型:p1.cut(); p2.cut();
能向上造型成为的数据类型只有2种:超类 和 所实现的接口

(3)向下造型(即强制类型转换)--------小到大:
引用类型转换成功的两个条件↓,不符合这俩条件否则发生ClassCastException类型转换异常
①引用所指向的对象,就是该类型
②引用所指向的对象,实现了该接口或继承了该类
③建议:在强转之前先通过instanceof来判断引用的对象是否是该类型

注1:基本类型强转不会报异常
注2:何时需要强转?
---- 想访问的属性/行为在超类中没有,必须强转,强转之前先instanceof判断

package oopday9.day09;
/**
 * 引用类型《强制类型转换》成功的两个条件↓,不符合这俩条件否则发生ClassCastException类型转换异常
 * ①引用所指向的对象,就是该类型
 * ②引用所指向的对象,实现了该接口或继承了该类
 * ③建议:在强转之前先通过instanceof来:判断引用的对象是否是该类型
 *
 * 注1:基本类型强转不会报异常
 */
public class MuItiTypeDemo {
    public static void main(String[] args) {
        Aoo o = new Boo();//向上造型 自动类型转换

//        Boo o1 = o;//编译错误(只检查语法),o是超类,o1是派生类,大转小---所以为强转(前边必须加小括号并且符合强转的两种条件)
        Boo o1 = (Boo) o;//正确。因为符合条件①:---------①引用(o1)所指向的对象(new Boo),就是该类型(Boo).

        Inter o2 = (Inter) o;//正确。因为符合条件②:-----②引用(o2)所指向的对象(new Boo),实现了该接口(Inter).

//        Coo o3 = (Coo) o;//不会编译错误,但是运行时发生:ClassCastException

        /** ③建议:在强转之前先通过instanceof来:判断引用的对象是否是该类型 */
        if(o instanceof Boo){ //先判断:为true,
            Boo o4 = (Boo) o;
            System.out.println("o是Boo类型");//输出
        }else{
            System.out.println("o不是Boo类型");
        }

        if(o instanceof Inter){ //先判断,为true
            Inter o5 = (Inter) o;
            System.out.println("o是Inter接口");//输出
        }else{
            System.out.println("o不是Inter接口");
        }

        if(o instanceof Coo){	//false,先判断
            Coo o6 = (Coo)o;    //再强转
            System.out.println("o是Coo类型");
        }else{
            System.out.println("o不是Coo类型");
        }

    }
}

interface Inter{ //接口权限是默认public的,但是java规定:在一个.java文件中,只能有一个类写public
}

class Aoo{
}

class Boo extends Aoo implements Inter{
}

class Coo extends Aoo{
}

补充:

  1. 何时需要强转?

    ---- 想访问的属性/行为在超类中没有,必须强转,强转之前先instanceof判断

  2. ArrayIndexOutOfBoundsException:数组下标越界异常

    NullPointerException:空指针异常

    ClassCastException:类型转换异常

  3. 此图片在作业2、深水炸弹与潜艇的碰撞中会用的到:在这里插入图片描述

—————————————————

面向对象第九天:

在这里插入图片描述

回顾:

  1. 多态:

    • 表现:

      • 同一个对象被造型为不同类型时,有不同的功能

        —对象多态:我、你、水…-----------------所有对象都是多态的

      • 同一类型的引用在指向不同的对象时,有不同的实现

        —行为多态:cut()、move、getImage()–所有抽象方法都是多态的

    • 向上造型:

      • 超类型的引用指向派生类的对象
      • 能点出来什么,看引用的类型
      • 能造型成为的数据类型有:超类+所实现的接口
    • 强制类型转换,成功的条件只有如下两种:

      • 引用所指向的对象,就是该类型
      • 引用所指向的对象,实现了该接口或继承了该类
    • 强转若不符合如上条件,则发生ClassCastException类型转换异常

      建议:在强转之前先通过instanceof判断引用的对象是否是该类型

笔记:

一、 内存管理:由JVM管理的

(1) 堆:

①存储new出来的对象(包括实例变量)
②垃圾:没有任何引用所指向的对象
[垃圾回收器(GC)不定时到内存堆中清扫垃圾,回收的过程中透明的(看不到的),不一定一发现垃圾就立刻回收,通过调用System.gc()建议虚拟机尽快调度GC来回收]
③实例变量的生命周期:创建对象时存储在堆中,对象被回收时一并被回收
④内存泄漏:不再使用的对象没有被及时的回收,严重的泄漏会导致系统的崩溃,建议:不再使用的对象应及时将引用设置为null
在这里插入图片描述

(2)栈:
①存储正在调用的方法中的局部变量(包括方法的参数)
②调用方法时,会为该方法在栈中分配一块对应的栈帧,栈帧中存储局部变量(包括方法的参数),方法调用结束时,栈帧被自动清除,局部变量一并被清除。
③局部变量的生命周期:调用方法时存储在栈中,方法调用结束时与栈帧一并被清除
在这里插入图片描述

(3)方法区:

①存储.class字节码文件(包括静态变量、所有方法)
②方法只有一份,通过this来区分具体的访问对象
在这里插入图片描述

二、面向对象三大特征总结: 封装、继承、多态

1.封装:

  - 类:封装对象的属性和行为
  - 方法:封装的是具体的业务逻辑实现
  - 访问控制修饰符:封装的是具体的访问权限

2.继承:

  - 作用:代码复用

  - 超类:所有派生类所共有的属性和行为

    接口:部分派生类所共有的属性和行为

    派生/实现类:派生类所特有的属性和行为

  - 单一继承、多接口实现,具有传递性

3.多态:

  - 行为多态:所有抽象方法都是多态的(通过方法的重写来表现)

    对象多态:`所有对象都是多态的(通过向上造型为表现)`

  - 重写、向上造型、强制类型转换、强转需要先用instanceof判断

精华笔记:

  1. 内存管理:由JVM管理的

    • 堆:

      • 存储new出来的对象(包括实例变量)

      • 垃圾:没有任何引用所指向的对象

        垃圾回收器(GC)不定时到内存堆中清扫垃圾,回收的过程中透明的(看不到的),不一定一发现垃圾就立刻回收,通过调用System.gc()建议虚拟机尽快调度GC来回收

      • 实例变量的生命周期:

        ​ 创建对象时存储在堆中,对象被回收时一并被回收

      • 内存泄漏:不再使用的对象没有被及时的回收,严重的泄漏会导致系统的崩溃,建议:不再使用的对象应及时将引用设置为null

    • 栈:

      • 存储正在调用的方法中的局部变量(包括方法的参数)

      • 调用方法时,会为该方法在栈中分配一块对应的栈帧,栈帧中存储局部变量(包括方法的参数),方法调用结束时,栈帧被自动清除,局部变量一并被清除。

      • 局部变量的生命周期:

        ​ 调用方法时存储在栈中,方法调用结束时与栈帧一并被清除

    • 方法区:

      • 存储.class字节码文件(包括静态变量、所有方法)
      • 方法只有一份,通过this来区分具体的调用对象

补充:

1.面试题:

  • 问:java是值传递还是引用传递?
  • 答:java只有值传递,基本类型传递的是具体的数,引用类型传递的是具体的地址

2.文档注释:

  • 为功能性注释,只在三个地方使用,分别是类上、方法上和常量上
//文档注释是功能性注释,只在三个地方使用,分别是类上、方法上和常量上
/**
 * 在类上使用时用于说明当前类的设计目的和整体功能介绍
 * 例如: 此类用于演示java文档注释
 *
 * @author 作者WKJ
 */
public class ApiDocDemo {
    /**
     * sayHi方法中使用的问候语
     */
    public static final String INFO = "你好!";

    /**
     * 为指定用户添加问候语
     * @param name 指定用户的名字
     * @return 含有问候语的字符串
     */
    public String sayHi(String name){
        return INFO+name;
    }
}

3:getter/setter:

class Student{
    private String name;
    private int age;

    public String getName(){ //getter获取
        return name;
    }
    public void setName(String name){ //setter设置
        this.name = name;
    }
    public int getAge(){ //getter获取
        return age;
    }
    public void setAge(int age){ //setter设置
        this.age = age;
    }
}

//getter和setter的演示
public class GetterSetterDemo {
    public static void main(String[] args) {
        Student zs = new Student();
        zs.setName("zhangsan");
        zs.setAge(25);
        System.out.println(zs.getName());
        System.out.println(zs.getAge());

        Student ls = new Student();
        ls.setName("lisi");
        ls.setAge(24);
        System.out.println(ls.getName());
        System.out.println(ls.getAge());
    }
}

getter和setter的作业:
1.创建Point类,包含私有x和y属性,设计对应的getter/setter。
2.创建Test类,在main中:创建两个Point对象,测试getter/setter。

package ooday09;
public class Point {
    private int x;
    private int y;

    public int getX(){
        return x;
    }
    public void  setX(int x){
        this.x = x;
    }

    public int getY(){
        return y;
    }
    public void setY(int y){
        this.y = y;
    }
}



package ooday09;
public class Test {
    public static void main(String[] args) {
        Point p1 = new Point();
        p1.setX(1);
        p1.setY(2);
        System.out.println(p1.getX()+","+p1.getY());

        Point p2 = new Point();
        p2.setX(3);
        p2.setY(4);
        System.out.println(p2.getX()+","+p2.getY());
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值