JavaSE (Java基础):面向对象(下)

8.7 多态

        什么是多态? 即同一方法可以根据发送对象的不同而采用多种不同的方式。

        一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多。在句话我是这样理解的:

        在实例中使用方法都是根据他最开始将类实例化最左边的类型来定的,但是父类引用指向对象子类的话,如果子类有重写的方法(即方法名与父类相同的方法但是内容不一定相同),那么执行的子类所重写的方法,如果没有重写的方法,就执行父类的。在这句话中所说的“但可以指向对象的引用的类型有很多”,意思是一个父类可以有很多的子类,都可以使用他们的重写方法。

示例:

父类Person:

package com.oop.demo06;

public class Person {
    public void run(){
        System.out.println("run");
    }

}

子类Student:

package com.oop.demo06;

public class Student extends Person {
    @Override
    public void run() {
        System.out.println("son");
    }

    public void eat(){
        System.out.println("eat");
    }
}

 测试类:

import com.oop.demo06.Student;
import com.oop.demo06.Person;

public class AppLication{
    public static void main(String[] args) {


        // 一个对象的实际类型是确定的

        // 可以指向的引用类型就不确定了:父类的引用指向子类

        // Student 能调用的方法都是自己的或者继承父类的!
        Student S1 = new Student();
        // Person是父类型的类,可以指向子类,但是不能调用子类独有的方法
        Person S2 = new Student();
        Object S3 = new Student();

        S2.run(); // 子类重写了父类的方法,执行子类的方法
        S1.run();

        // 对象能执行能执行哪些方法,主要看对象的左边类型,和右边关系不大!
        ((Student) S2).eat(); //将S2的类型强制转换为Student,就可以调用方法了!
        S1.eat();
    }
}

/*
    多态注意事项:
    1. 多态是方法的多态,属性没有多态
    2. 父类和子类要有联系    类型转换异常!     ClassCastException!
    3. 存在条件:    继承关系,方法需要重写,父类引用指向子类对象!

        1. static 方法,属于类,它不属于实例
        2. final 常量;
        3. private 方法
 */


8.8 instanceof 和 类型转换

        instanceof 使用的方法格式:

        【实例的名称        instanceof        类的类型名称】,判断一个对象是什么类型,就是判读两个类型的对象是否有父子关系,有的话就返回Ture,没有就是返回False。

        使用 【实例的名称        instanceof        类的类型名称】时,能否编译看的是实例化对象的类型名,输出的结果看的是实例化对象时最右边的所实例的对象值。

首先父类是Person,其余的类:Student、Teacher是Person的子类。

import com.oop.demo06.Student;
import com.oop.demo06.Person;
import com.oop.demo06.Teacher;

public class AppLication{
    public static void main(String[] args) {


        // Object > Person > Student
        // Object > Person > Tercher
        // Object > String
        Object object = new Student();

        System.out.println(object instanceof Student);  // true
        System.out.println(object instanceof Person);   // true
        System.out.println(object instanceof Object);   // true
        System.out.println(object instanceof Teacher);  // false
        System.out.println(object instanceof String);   // false

        System.out.println("=====================================");

        Person person = new Student();
        System.out.println(person instanceof Student);  // true
        System.out.println(person instanceof Person);   // true
        System.out.println(person instanceof Object);   // true
        System.out.println(person instanceof Teacher);  // false
//        System.out.println(person instanceof String);   // 编译时就报错了

        System.out.println("=====================================");

        Student student = new Student();
        System.out.println(student instanceof Student);  // true
        System.out.println(student instanceof Person);   // true
        System.out.println(student instanceof Object);   // true
//        System.out.println(student instanceof Teacher);  // 编译时就报错
//        System.out.println(student instanceof String);   // 编译时就报错

    }
}

类型转换(关于对象的类型):

import com.oop.demo06.Student;
import com.oop.demo06.Person;
import com.oop.demo06.Teacher;

public class AppLication{
    public static void main(String[] args) {
        // 类型之间的转化: 父   子

        // 高              低
        Person student = new Student();

        // student 将这个对象转换为Student的对象类型
        // 我们就可以使用这个对象类型中的方法了
        ((Student) student).go(); // 这个是高转低需要强制转换
        
        // 如果是低转高,子类转换为父类不需要强制转换,可能会丢失一些方法!
        Student student1 = new Student();
        Person person = student1;
    }
}


 

8.9 static 关键字详解

        static修饰符有着静态的意思,使用他代表着这个方法或者元素在类中是与类一起加载的。

package com.oop.demo07;

// static
public class Student {
    private static int age; // 静态变量     多线程
    private double score; // 非静态变量


    public static void main(String[] args) {
        Student s1 = new Student();

        System.out.println(s1.score);
        System.out.println(age);
    }
}

        在类中,还有着代码块这种东西,他的优先级比这个构造器还高。

package com.oop.demo07;

public class Person {

//    {
//        // 代码块(匿名代码块)
//    }
//
//    static {
//        // 静态代码块
//    }

    
    // 第二个执行,可以用来赋初始值
    {
        System.out.println("匿名代码块");
    }

    // 第一个执行,与类一起加载,只执行一次,不管你实例化多少个对象
    static {
        System.out.println("静态代码块");
    }

    // 第三个执行,构造器
    public Person(){
        System.out.println("构造方法");
    }

    public static void main(String[] args) {
        Person person = new Person();
        System.out.println("==============");
        Person person1 = new Person();

    }
}

        在Java中有许许多多的有用又有趣的类,在这些类中有着许多有用的静态方法,可以使用下面这个方法直接调用,想查看类的调用位置直接ctrl+左键就行。 

package com.oop.demo07;

// 导入其他包中的类的静态方法
import static java.lang.Math.random; // 返回一个随机数(0,1)
import static java.lang.Math.PI;    // 圆周率
public class Test {
    public static void main(String[] args) {
        System.out.println(random());
        System.out.println(PI);
    }
}

需要注意的是:

        如果给这些东西使用了常量修饰符final,那么他将会是唯一的,无无法拥有子类。 

 


8.10 抽象类

        什么是抽象类?abstract 修饰符可以用来修饰方法也可以修饰类,如果修饰方法,那么该方法就是抽象方法;如果修饰类,那么就是抽象类。

        抽象类中可以没有抽象方法,但是有抽象方法的类一定要声明为抽象类。

        抽象类,不能用new关键字来创建对象,它是用来让子类继承的。

        抽象方法,只有方法的声明,没有方法的实现,它是用来让子类实现的。

        子类继承了抽象类,那么他就必须要实现抽象类没有实现的抽象方法,否则该子类也要声明为抽象类。

抽象父类:

package com.oop.demo08;

//abstract 抽象类:类
public abstract class Action {

    // 约束~有人帮我们实现~
    // 这个就是抽象的方法,我们只定义了方法名字,他的具体功能由别人实现
    public abstract void doSomething();

    // 1.   不能new这个抽象类,只能靠子类去实现它;约束!
    // 2.   抽象类中可以写普通的方法
    // 3.   抽象方法必须在抽象类中
    // 抽象的抽象:约束~
}

 抽象父类的子类,他里面有重写父类的方法:

package com.oop.demo08;

// 抽象类的所有方法,继承了他的子类,都必须要实现他的方法
public class A extends Action {
    @Override
    public void doSomething() {

    }
}

 

 


8.11 接口的定义与实现

 

接口的作用:
    1.  约束
    2.  定义一些方法,让不同的人实现
    3.  public abstract
    4. public static final
    5. 接口不能实例化,接口中没有构造方法
    6. implements可以实现多个接口
    7. 必须要重写接口中的方法

接口UserService:

package com.oop.demo09;

//interface 定义接口的修饰符(关键字),接口都需要有实现类
public interface UserService {
    // 接口中定义就是常量    public static final
    int AGE = 9999;


    // 接口中的所有定义的方法其实都是抽象的   public abstract
    void add(String name);
    void delete(String name);
    void update(String name);
    void query(String name);
}

 接口TimeService:

package com.oop.demo09;

public interface TimeService {
    void timer();
}

        每个接口都需要有实现类。我是这样理解的,每个接口就是定义一堆方法的名字与类型就是没有里面的内容,而他们需要有实现类来实现里面的内容,需要用到关键字implements:

package com.oop.demo09;

// 类 可以实现接口 implements 接口
// 实现了接口的类,就需要重新接口中的方法

// 利用接口实现多继承
public class UersServiceImpl implements UserService,TimeService{
    @Override
    public void add(String name) {

    }

    @Override
    public void delete(String name) {

    }

    @Override
    public void update(String name) {

    }

    @Override
    public void query(String name) {

    }

    @Override
    public void timer() {

    }
}

 

 


8.12 N种内部类

package com.oop.demo10;

public class Outer {

    private int id = 14203;
    public void out(){
        System.out.println("这是外部类的方法");
    }

    public class Inner{
        
        public void in(){
            System.out.println("这是内部类的方法");
            
        }

        // 内部类能够获得外部类的私有属性
        public void getID(){
            System.out.println(id);
        }
    }
}
import com.oop.demo10.Outer;

import java.util.Optional;

public class AppLication{
    public static void main(String[] args) {
        Outer outer = new Outer();

        // 通过这个外部类来实例化内部类
        Outer.Inner inner = outer.new Inner();
        inner.in();
        inner.getID();

    }
}

 局部内部类:

package com.oop.demo10;

public class Outer {

    // 局部内部类,在方法里的属性也叫做局部变量
    public void method(){
        class Inner{

        }
    }
}

匿名内部类:

package com.oop.demo10;

public class Test {
    public static void main(String[] args) {
        // 没有名字初始化类,匿名类
        // 不用将实例保存在对象中
        new Apple();
        new Apple().eat();

        // 甚至可以匿名一个接口
        new Userservice(){
            
            @Override
            public void happle() {

            }
        };

    }
}

class Apple{
    public void eat(){
        System.out.println("eat");
    }
}

interface Userservice{
    void happle();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/771518.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于docker环境及Harbor部署{很简短一点了,耐心看吧}

用到的环境: docker 、nacos、compose、harbor(自行安装 ,以下连接作为参考) nacos:史上最全整合nacos单机模式整合哈哈哈哈哈_nacos 源码启动 单机模式-CSDN博客 docker、compose、harbor:史上最全的整合Harbor安装教程&#…

Qt实现检测软件是否多开

Qt实现检测软件是否多开 在桌面软件开发中,软件通常要设置只允许存在一个进程,像一些熟知的音乐软件,QQ音乐这种。而这些软件在限制只有一个进程的同时,通常还会有双击桌面图标唤醒已运行的后台进程的功能。关于双击桌面唤醒已运…

斯坦福提出首个开源视觉语言动作大模型OpenVLA

OpenVLA:开源视觉语言动作大模型 摘要模型结构训练数据训练设施实验总结和局限性 项目主页 代码链接 论文链接 模型链接 摘要 现有的VLA(Vision-Language-Action )模型具有这些局限性: 1)大多封闭且开放; 2)未能探索高效地为新任务微调VLA的方…

vue3 【提效】使用 CSS 框架 UnoCSS 实用教程

该换种更高效的方式写 CSS 啦&#xff0c;举个例&#xff1a; <div class"flex"> </div>相当于 <div class"flex"> </div> <style> .flex {display: flex; } </style>当然&#xff0c;还有超多强大的功能帮我们提升…

【后端面试题】【中间件】【NoSQL】MongoDB查询过程、ESR规则、覆盖索引的优化

任何中间件的面试说到底都是以高可用、高性能和高并发为主&#xff0c;而高性能和高并发基本是同时存在的。 性能优化一直被看作一个高级面试点&#xff0c;因为只有对原理了解得很透彻的人&#xff0c;在实践中才能找准性能优化的关键点&#xff0c;从而通过各种优化手段解决性…

为什么人员定位系统很有必要性?

人员定位系统在现代社会和企业环境中具有极高的必要性&#xff0c;这主要体现在以下几个方面&#xff1a; 一、安全保障 二、提升效率 三、管理优化 四、增强合规性 综上所述&#xff0c;人员定位系统通过提供实时、准确的位置信息&#xff0c;为企业带来了安全保障、效率提升…

香橙派AIpro实测:YOLOv8便捷检测,算法速度与运行速度结合

香橙派AIpro实测&#xff1a;YOLOv8便捷检测&#xff0c;算法速度与运行速度结合 文章目录 香橙派AIpro实测&#xff1a;YOLOv8便捷检测&#xff0c;算法速度与运行速度结合一、引言二、香橙派AIpro简介三、YOLOv8检测效果3.1 目标检测算法介绍3.1.1 YOLO家族3.1.2 YOLOv8算法理…

500mA、低压差、低噪声、超快、无需旁路电容的CMOS LDO稳压器RT9013

一般描述 RT9013 SOT23-5封装的外观和丝印 RT9013 是一款高性能的 500mA LDO 稳压器&#xff0c;具有极高的 PSRR 和超低压差。非常适合具有苛刻性能和空间要求的便携式射频和无线应用。 RT9013的静态电流低至25μA&#xff0c;进一步延长了电池的使用寿命。RT9013 也适用于低…

Element中的日期时间选择器DateTimePicker和级联选择器Cascader

简述&#xff1a;在Element UI框架中&#xff0c;Cascader&#xff08;级联选择器&#xff09;和DateTimePicker&#xff08;日期时间选择器&#xff09;是两个非常实用且常用的组件&#xff0c;它们分别用于日期选择和多层级选择&#xff0c;提供了丰富的交互体验和便捷的数据…

私域和社群的差别是什么?

社群就是拉很多人建群就可以了&#xff0c;但是私域不是&#xff0c;这里有三点不同 1、私域的用户来源&#xff0c;不仅仅是微信&#xff0c;而是基于一定的联系形成的链接&#xff0c;比如买了商家的货&#xff0c;反复购买觉得好&#xff0c;推荐给亲朋好友的二次开发用户&…

nanodiffusion代码逐行理解之Attention

目录 一、注意力中的QKV二、注意力中的位置嵌入三、注意力中的多头四、注意力和自注意力五、注意力中的encode和decoder 一、注意力中的QKV 简单来说&#xff1a; Q: 要查询的信息 K: 一个索引&#xff0c;要查询的向量 V: 我们查询得到的值 复杂一点的解释&#xff1a; Query…

如何快速选择短剧系统源码:高效构建您的在线短剧平台

在数字化时代&#xff0c;短剧作为一种新兴的娱乐形式&#xff0c;受到了广泛的欢迎。随着市场需求的增长&#xff0c;构建一个在线短剧平台成为了很多创业者和开发者的目标。而选择正确的短剧系统源码则是实现这一目标的关键步骤。本文将为您提供一些实用的指导&#xff0c;帮…

论文解析——Transformer 模型压缩算法研究及硬件加速器实现

作者及发刊详情 邓晗珂&#xff0c;华南理工大学 摘要 正文 实验平台 选取模型&#xff1a; T r a n s f o r m e r b a s e Transformer_{base} Transformerbase​ 训练数据集&#xff1a;WMT-2014 英语-德语翻译数据集、IWSLT-2014 英语-德语互译数据集 Transformer模…

策略模式入门:基本概念与应用

目录 策略模式策略模式结构策略模式应用场景策略模式优缺点练手题目题目描述输入描述输出描述题解 策略模式 策略模式&#xff0c;又称政策模式&#xff0c;是一种行为型设计模式&#xff0c;它能让你定义一系列算法&#xff0c;并将每种算法分别放入独立的类中&#xff0c;以…

基于Spring Boot的高校智慧采购系统

1 项目介绍 1.1 摘要 随着信息技术与网络技术的迅猛发展&#xff0c;人类社会已跨入全新信息化纪元。传统的管理手段因其内在局限&#xff0c;在处理海量信息资源时日渐捉襟见肘&#xff0c;难以匹配不断提升的信息管理效率和便捷化需求。顺应时代发展趋势&#xff0c;各类先…

http数据传输确保完整性和保密性整流程方案(含源码)

往期文章回顾 【深度学习】 【深度学习】物体检测/分割/追踪/姿态估计/图像分类检测演示系统【含源码】【深度学习】YOLOV8数据标注及模型训练方法整体流程介绍及演示【深度学习】行人跌倒行为检测软件系统【深度学习】火灾检测软件系统【深度学习】吸烟行为检测软件系统【深度…

rtpengine_mr12.0 基础建设容器运行

目录 Dockerfile rtpengine.conf 容器内编译安装 RTPEngine 正常提供功能 1. 启动RTPEngine服务 2. 删除 RTPEngine服务 3. 加载内核模块 检查所有进程是否正在运行 上传到仓库 博主wx&#xff1a;yuanlai45_csdn 博主qq&#xff1a;2777137742 后期会创建粉丝群&…

实验二 图像的代数运算

一、实验目的&#xff1a; 1&#xff0e;了解图像的算术运算在数字图像处理中的初步应用。 2&#xff0e;体会图像算术运算处理的过程和处理前后图像的变化。 二、实验内容&#xff1a; 1&#xff0e;图像的加法运算 图像相加一般用于对同一场景的多幅图像求平均效果&…

【QT】概述|对象树模型|两种控件模式|信号和槽|lambda

目录 什么是QT 特点 QT程序 main函数 QT按钮 纯代码模式 图形化模式 对象树模型 信号和槽 连接与断开 自动连接 断开连接 信号的发射 lambda表达式 基本语法 捕获列表 Lambda表达式用于信号与槽的连接 例如 什么是QT Qt是一个跨平台的C图形用户界面应用…

如何在TikTok上获得更多观看量:12个流量秘诀

TikTok作为热门海外社媒&#xff0c;在跨境出海行业中成为新兴的推广渠道&#xff0c;但你知道如何让你的TikTok赢得更多关注次数吗&#xff1f;如果您正在寻找增加 TikTok 观看次数的方法&#xff0c;接下来这12种策略&#xff0c;你需要一一做好&#xff01; 1. 在内容中添加…