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

news2025/1/17 2:49:48

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();
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

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

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

element-ui el-select选择器组件下拉框增加自定义按钮

element-ui el-select选择器组件下拉框增加自定义按钮 先看效果 原理&#xff1a;在el-select下添加禁用的el-option&#xff0c;将其value绑定为undefined&#xff0c;然后覆盖el-option禁用状态下的默认样式即可 示例代码如下&#xff1a; <template><div class…

Maxwell 数据采集工具详解

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; 欢迎关注微信公众号&#xff1a;野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来&a…

修改头文件版本需要修改的文件

以修改ui的头文件版本为例&#xff0c;还需要同时更新 PJ10PC20240120041_c928\components\master-t5\hikauto\module\app\include PJ10PC20240120041_c928\components\master-t5\hikauto\module\app\include\dsp PJ10PC20240120041_c928\components\master-t5\hikauto\incl…

文华财经T8多空量化交易策略模型源码

//定义变量 N : 3; // 连续K线数量&#xff08;可根据需要调整&#xff09; Q : 0.05; // 止盈比例5%&#xff08;可根据需要调整&#xff09; HIGH_PRICE : REF(HIGH, 1); // 记录前根阳线的最高价 LOW_PRICE : REF(LOW, 1); // 记录前根阴线的最低价 //做多策略 REF(EV…

开发国际短剧系统的策略解析

一、明确项目目标和需求 1、功能需求&#xff1a;确定系统应具备的基本功能&#xff0c;如用户注册、登录、浏览短剧、评论、分享、个性化推荐等。 2、性能需求&#xff1a;确保系统能够承受高并发访问&#xff0c;保证视频流畅播放&#xff0c;减少卡顿和延迟。 3、跨文化传播…

Redis基础教程(四):redis键(key)

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

TCL中环可转债缩水近90亿:业绩持续承压,百亿自有资金购买理财

《港湾商业观察》廖紫雯 日前&#xff0c;TCL中环新能源科技股份有限公司&#xff08;以下简称&#xff1a;TCL中环&#xff0c;002129.SZ&#xff09;可转债总额缩水近90亿&#xff0c;引发市场关注。可转债大幅缩水的另一面&#xff0c;公司此前发布公告披露将使用百亿自有资…

内网渗透学习-杀入内网

1、靶机上线cs 我们已经拿到了win7的shell&#xff0c;执行whoami&#xff0c;发现win7是administrator权限&#xff0c;且在域中 执行ipconfig发现了win7存在内网网段192.168.52.0/24 kali开启cs服务端 客户端启动cs 先在cs中创建一个监听器 接着用cs生成后门&#xff0c;记…

3d打开模型的时候怎么没有灯光?---模大狮模型网

在3D建模与渲染过程中&#xff0c;灯光是至关重要的元素之一&#xff0c;直接影响到最终场景的视觉效果和真实感。然而&#xff0c;有时打开3D模型时可能会发现缺乏适当的灯光设置&#xff0c;这会导致场景显得暗淡或平淡无奇。本文将探讨为何在打开3D模型时可能没有灯光的原因…

【论文速读】|FuzzAug:探索模糊测试作为神经网络测试生成的数据增强

本次分享论文&#xff1a;FuzzAug: Exploring Fuzzing as Data Augmentation for Neural Test Generation 基本信息 原文作者&#xff1a;Yifeng He, Jicheng Wang, Yuyang Rong, Hao Chen 作者单位&#xff1a;University of California, Davis 关键词&#xff1a;软件测试…

springboot 篮球馆管理系统-计算机毕业设计源码21945

目 录 摘要 1 绪论 1.1选题背景 1.2研究意义 1.3论文结构与章节安排 2 篮球馆管理系统系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 2.4 …

分子AI预测赛笔记

#AI夏令营 #Datawhale #夏令营 Taks1 跑通baseline 根据task1跑通baseline 注册账号 直接注册或登录百度账号&#xff0c;etc fork 项目 零基础入门 Ai 数据挖掘竞赛-速通 Baseline - 飞桨AI Studio星河社区 启动项目 选择运行环境&#xff0c;并点击确定&#xff0c;没…

因果推断前沿研究方向都在这了!

【因果推断】是研究如何从观测数据中识别和估计变量之间因果关系的领域。它在医学、经济学、环境科学等多个领域有着广泛的应用&#xff0c;帮助科学家和决策者理解复杂现象背后的因果机制。通过使用统计方法、机器学习技术以及逻辑推理&#xff0c;因果推断能够揭示变量间的潜…

Frrouting快速入门——OSPF组网(一)

FRR简介 FRR是FRRouting的简称&#xff0c;是一个开源的路由交换软件套件。其作者源自老牌项目quaga的成员&#xff0c;也可以算是quaga的新版本。 使用时一般查看此文档&#xff1a;https://docs.frrouting.org/projects/dev-guide/en/latest/index.html FRR支持的协议众多…

Objection 对命令的批量操作

假定现在需要对好多不同的类进行批量hook&#xff0c;逐个hook非常繁琐&#xff0c;那么可以要将这些hook的类放到一个文件里&#xff0c;并且在这些类的前面加上hook命令&#xff0c;内容如下 使用如下命令执行该文件中的命令 objection -g 测试 explore -c d:/hookData/toHoo…

go sync包(五) WaitGroup

WaitGroup sync.WaitGroup 可以等待一组 Goroutine 的返回&#xff0c;一个比较常见的使用场景是批量发出 RPC 或者 HTTP 请求&#xff1a; requests : []*Request{...} wg : &sync.WaitGroup{} wg.Add(len(requests))for _, request : range requests {go func(r *Reque…

深入解读:如何解决微调扩散模型时微调数据集和训练数据集之间的差距过大问题?

Diffusion Models专栏文章汇总&#xff1a;入门与实战 前言&#xff1a;在微调扩散模型的时候经常会遇到微调数据集和训练数据集之间的差距过大&#xff0c;导致训练效果很差。在图像生成任务中并不明显&#xff0c;但是在视频生成任务中这个问题非常突出。这篇博客深入解读如何…

采用B/S模式 可跨平台使用的数据采集监控平台!

数据采集监控平台是一款专注于工业企业生产设备管理、数据采集、数据分析、数据管理、数据存储、数据传输等的软件系统。系统具备丰富的接口&#xff0c;配置灵活&#xff0c;方便部署&#xff0c;通过采集企业生产设备的数据集中处理&#xff0c;将各个信息孤岛有机连接&#…

2024年上半年数据泄露风险态势报告-百度网盘下载

在快速崛起的数字经济时代&#xff0c;数据作为企业的核心资产及重要战略资源&#xff0c;在高速增长的同时&#xff0c;其背后的数据风险也在不断攀升&#xff0c;日渐复杂的数据泄露形势&#xff0c;已成为企业数字化发展赛道的严重阻碍。 《2024年上半年数据泄露风险态势报…