java面向对象编程高级

news2024/12/29 8:06:50

1、static修饰符

1.1static修饰成员变量

static叫静态,可以修饰成员变量、成员方法

成员变量按照有无static修饰,分为两种
类变量 : 有static修饰,属于类,在计算机里只有一份,会被类的全部对象共享

  • 在开发中,如果某个数据只需要一份,且希望能够被共享(访问、修改),则该数据可以定义成类变量来记住。
  • 在某个类中访问其他类里的类变量,必须带类名访问。不推荐使用对象名来访问

实例变量*(对象的变量): 无static修饰,属于每个对象的。

1.2static修饰成员方法

类方法 : 类方法最常见的应用场景是做工具类

  • 提高了代码复用;调用方便,提高了开发效率。如Math就是一个类方法,提供不少计算方法

1.3static的注意事项

  • 类方法中可以直接访问类的成员,不可以直接访问实例成员。
  • 实例方法中既可以直接访问类成员,也可以直接访问实例成员。
  • 实例方法中可以出现this关键字,类方法中不可以出现this关键字的(不一定有这个类的实例对象)

1.4代码块

代码块是类的5大成分之一(成员变量、构造器、方法、代码块、内部类)。

代码块分为两种:

1.4.1静态代码块:
  • 格式: static{}
  • 特点:类加载时自动执行,由于类只会加载一次,所以静态代码块也只会执行一次。
  • 作用:完成类的初始化,例如:对类变量的初始化赋值。

实例代码块:

  • 格式:{)
  • 特点: 每次创建对象时,执行实例代码块,并在构造器前执行。
  • 作用:和构造器一样,都是用来完成对象的初始化的,例如:对实例变量进行初始化赋值

2.继承

2.1使用继承好处

  • 减少了重复代码的编写,提高了代码的复用性。

2.2四种权限修饰符

  • public
  • private
  • protected
  • 缺省
    在这里插入图片描述
    private<缺省 < protected < public

2.3方法重写

2.3.1.方法重写是什么?

子类写了一个方法名称,形参列表与父类某个方法一样的方法去覆盖父类的该方法

2.3.2.重写方法有哪些注意事项?
  • 建议加上:@Override注解,可以校验重写是否正确,同时可读性好
  • 子类重写父类方法时,访问权限必须大于或者等于父类被重写的方法的权限。
  • 重写的方法返回值类型,必须与被重写方法的返回值类型一样,或者范围更小
  • 私有方法、静态方法不能被重写。
2.3.3.方法重写有啥应用场景?

当子类觉得父类的方法不好用,或者不满足自己的需求时,就可以用方法重写。

2.4子类访问成员的特点

2.4.1、在子类方法中访问其他成员(成员变量、成员方法),是依照就近原则的
  • 先子类局部范围找。
  • 然后子类成员范围找。
  • 然后父类成员范围找,如果父类范围还没有找到则报错
2.4.2、如果子父类中,出现了重名的成员,会优先使用子类的,如果此时一定要在子类中使用父类的怎么办?

可以通过super关键字,指定访问父类的成员: super.父类成员变量/父类成员方法

2.5 子类构造器

2.5.1.子类构造器有啥特点?
  • 子类中的全部构造器,都必须先调用父类的构造器,再执行自己。
2.5.2、super(…)调用父类有参数构造器的常见应用场景是什么?
  • 为对象中包含父类这部分的成员变量进行赋值。
2.5.3、this(…)的作用是什么?
  • 在构造器中调用本类的其他构造器
2.5.3、this(…)和super(…)的使用需要注意什么?
  • 都必须放在构造器的第一行(也就是不能先使用了super()然后使用this,因为父类的构造方法实现了两次)

2.6 面向对象的三大特征之三:多态

多态:多态是在继承/实现情况下的一种现象,表现为:对象多态、行为多态

2.6.1使用多态有什么好处?存在什么问题?
  • 可以解耦合,扩展性更强;
  • 使用父类类型的变量作为方法的形参时可以接收一切子类对象
定义方法时,使用父类类型作为形参,可以接收一切子类对象,扩展行更强,更便利。
public class Test2 {
    public static void main(String[] args) {
        // 目标:掌握使用多态的好处
		Teacher t = new Teacher();
		go(t);

        Student s = new Student();
        go(s);
    }

    //参数People p既可以接收Student对象,也能接收Teacher对象。
    public static void go(People p){
        System.out.println("开始------------------------");
        p.run();
        System.out.println("结束------------------------");
    }
}
2.6.2类型转换有几种形式?能解决什么问题?
  • 自动类型转换(子类转为父类)
  • 强制类型转换。(父类转子类)
    目的:可以把对象转换成其真正的类型,从而解决了多态下不能调用子类独有方法的问题
2.6.3强制类型转换需要注意什么?
  • 存在继承/实现时,就可以进行强制类型转换,编译阶段不会报错
  • 但是,运行时,如果发现对象的真实类型与强转后的类型不同会报错 (ClassCastException)

解决办法:使用instanceof判断当前对象的真实类型:然后在进行转换

//如果p接收的是子类对象
if(父类变量 instance 子类){
    //则可以将p转换为子类类型
    子类 变量名 = (子类)父类变量;
    就可以调用子类的独有方法

2.7 final

final关键字是最终的意思,可以修饰类、修饰方法、修饰变量。

  • final修饰类:该类称为最终类,特点是不能被继承
  • final修饰方法:该方法称之为最终方法,特点是不能被重写。
  • final修饰变量:该变量只能被赋值一次。
2.7.1常量
  • 被 static final 修饰的成员变量,称之为常量。
  • 通常用于记录系统的配置信息
  • 程序编译后,常量会被“宏替换”:出现常量的地方全部会被替换成其记住的字面量这样可以保证使用常量和直接用字面量的性能是一样的。

2.8抽象类和抽象方法

2.8.1 抽象类、抽象方法是什么样的?

都是用abstract修饰的;抽象方法只有方法签名,不能写方法体

2.8.2 抽象类有哪些注意事项和特点?

抽象类中可以不写抽象方法,但有抽象方法的类一定是抽象类

功能其实是更好地支持多态,把功能抽象出来,其实也和多态继承重写一个意思,不过这样的化更加专业,最佳实践。

2.8.3 抽象类的应用场景好处是什么?

父类知道每个子类都要做某个行为但每个子类要做的情况不是父类定,交给子类去重写实现,我们抽出这样的抽象类,就是为了更好的支持多态

2.8.4 抽象类的常见应用场景:模板方法设计模式

模板方法模式解决了多个子类中有相同代码的问题。具体实现步骤如下:

模板方法设计模式的写法
1、定义一个抽象类
2、在定2个方法

  • 一个是模板方法: 把相同代码放里面去
  • 一个是抽象方法:具体实现交给子类完成。
    在这里插入图片描述
    3、模板方法建议使用什么关键字修饰?为什么
  • 建议使用final关键字修饰模板方法。也就是公共代码尽量不要让子类去修改
2.9接口:(俗称干爹)

接口中只有抽象方法和常量

public interface 接口名{
    //成员变量(常量)
    //成员方法(抽象方法)
}

一个类可以实现多个接口(接口可以理解成干爹),实现类实现多个接口,必须重写完全部接口的全部抽象方法,否则实现类需要定义成抽象类。

2.9.1接口的好处 (重点)
  • 弥补了类单继承的不足,一个类同时可以实现多个接口。(代表类中包含多个功能)
  • 让程序可以面向接口编程,这样程序员就可以灵活方便的切换各种业务实现
class Student{

}

interface Driver{
    void drive();
}

interface Singer{
    void sing();
}

//A类是Student的子类,同时也实现了Dirver接口和Singer接口
class A extends Student implements Driver, Singer{
    @Override
    public void drive() {

    }

    @Override
    public void sing() {

    }
}

public class Test {
    public static void main(String[] args) {
        //想唱歌的时候,A类对象就表现为Singer类型
        Singer s = new A();
        s.sing();
		
        //想开车的时候,A类对象就表现为Driver类型
        Driver d = new A();
        d.drive();
    }
}

解释:

  • 这里使用接口Driver指向实现类对象,后期可以随时修改实现类,达到接口的一个多态形式
2.9.2总结

1、使用接口有啥好处,第一个好处是什么?

  • 可以解决类单继承的问题,通过接口,我们可以让一个类有一个亲爹的同时,还可以找多个干爹去扩展自己的功能。

2、为什么我们要通过接口,也就是去找干爹,来扩展自己的功能呢?

  • 因为通过接口去找干警,别人通过你implements的接口,就可以显性的知道你是谁,从而也就可以放心的把你当作谁来用了(这样就可以通过implement中的接口方法,知道这个类的一些应该有的功能,必须存在这个功能)

3、使用接口的第二个好处是什么?

  • 一个类我们说可以实现多个接口,同样,一个接口也可以被多个类实现的。这样做的好处是我们的程序就可以面向接口编程了,这样我们程序员就可以很方便的灵活切换各种业务实现了
 Driver d = new A();
        d.drive();
这里使用接口Driver指向实现类对象,后期可以随时修改实现类,达到接口的一个多态形式

2.10 内部类

  • 是类中的五大成分之一(成员变量、方法、构造器、内部类、代码块),如果一个类定义在另一个类的内部,这个类就是内部类。
2.10.1.成员内部类是什么? 如何创建其对象?
  • 就是类中的一个普通成员,类似前面我们学过的普通成员变量、成员方法
  • 创建办法:外部类名.内部类名 对象名 =new 外部类(…).new 内部类(…);(根据外部类的实例对象创建)
2.10.2.成员内部类的实例方法中,访问其他成员有啥特点?
  • 可以直接访问外部类的实例成员、静态成员(相当于类的一个方法,能直接调用类中的实例变量和静态变量)
  • 可以拿到当前外部类对象,格式是: 外部类名.this.

2.12匿名内部类

功能: 实际开发中用得最多的一种内部类

  • 就是一种特殊的局部内部类;所谓匿名:指的是程序员不需要为这个类声明名字
  • 特点: 匿名内部类本质就是一个子类,并会立即创建出一个子类对象
  • 作用:用于更方便的创建一个子类对象
    下面就是匿名内部类的格式:
new 父类/接口(参数值){
    @Override
    重写父类/接口的方法;
}

下面是具体实现代码:

public interface Swimming{
    public void swim();
}
public class Test{
    public static void main(String[] args){
        Swimming s1 = new Swimming(){
            public void swim(){
                System.out.println("狗刨飞快");
            }
        };
        go(s1);
        
        Swimming s1 = new Swimming(){
            public void swim(){
                System.out.println("猴子游泳也还行");
            }
        };
        go(s1);
    }
    //形参是Swimming接口,实参可以接收任意Swimming接口的实现类对象
    public static void go(Swimming s){
        System.out.println("开始~~~~~~~~");
        s.swim();
        System.out.println("结束~~~~~~~~");
    }
}

可以发现我们把匿名内部类创建的类对象作为方法传入到方法中,减少了一个类的创建,简化开发人员的工作。

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

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

相关文章

处理固定资产折旧报错 AFAB “根据记帐循环, 您必须接下来对期间 001记帐”

会计在运用进行固定资产折旧时&#xff0c;发现有个报错“根据记帐循环, 您必须接下来对期间 001记帐”&#xff0c; 根据记帐循环, 您必须接下来对期间 001记帐 消息编号 AA683 诊断 不可以在指定的期间过帐折旧&#xff0c;因为此操作会遗漏过帐期间。 系统响应 该期间不能进…

Nginx域名重定向(如何访问的域名和实际的数据请求路径不同,可解决前端跨域)

感情需要被抑制&#xff0c;不能泛滥… 当需要将一个域名重定向到另一个域名并且用户仍然看到原始域名时&#xff0c;Nginx是一个强大的工具。这种场景通常涉及到反向代理或重写URL的技巧。在本篇博客中&#xff0c;我们将详细介绍如何使用Nginx来实现这个目标&#xff0c;以及…

SPSS两独立样本t检验

前言&#xff1a; 本专栏参考教材为《SPSS22.0从入门到精通》&#xff0c;由于软件版本原因&#xff0c;部分内容有所改变&#xff0c;为适应软件版本的变化&#xff0c;特此创作此专栏便于大家学习。本专栏使用软件为&#xff1a;SPSS25.0 本专栏所有的数据文件请点击此链接下…

VOD: 视频共享点播服务实现

目录 一.项目背景及原理 1.背景 2.原理 二.技术栈及项目环境 1.技术栈 2.项目环境 三. 模块划分 四.遇到的问题及其解决方法 1.查询视频模糊匹配问题 2.前端界面的修改 五.项目预览 六. 最终版代码 前言: 这里实现一个视频点播服务, 可以用来上传视频, 下载视频, 删…

springboot读取application.properties中文乱码问题

目录 1 前言&#xff1a; 2 本地环境中的解决方案&#xff08;以idea为例&#xff09; 3 全部解决方案 1 前言&#xff1a; 初用properties,读取java properties文件的时候如果value是中文&#xff0c;会出现乱码的问题。我们首先需要明了乱码问题的根源。在 Java 中&#x…

基于jsp,ssm物流快递管理系统

开发工具&#xff1a;eclipse&#xff0c;jdk1.8 服务器&#xff1a;tomcat7.0 数据库&#xff1a;mysql5.7 技术&#xff1a; springspringMVCmybaitsEasyUI 项目包括用户前台和管理后台两部分&#xff0c;功能介绍如下&#xff1a; 一、用户(前台)功能&#xff1a; 用…

Servlet 上下文参数

7)Servlet上下文对象&#xff1a;ServletContext生活中的例子&#xff1a;张三和李四在不远处窃窃私语&#xff0c;并且频繁的对着你坏笑。你肯定会跑过去问&#xff1a;你们俩在聊什么&#xff1f;注意&#xff1a;此处的聊什么&#xff0c;其实就是你在咨询他们聊天的上下文&…

九河云多云管理平台优劣势分析,使用评测!

多数情况下&#xff0c;仅依靠公有云不足以支撑企业发展。企业的某些特定需求还需要继续依赖私有云和传统IT服务。混合、多云架构往往是企业的唯一选择&#xff0c;但其设置和运行却非常复杂&#xff0c;为了管理混合架构&#xff0c;大多数企业已逐步转向多云模式&#xff0c;…

Spring Task(定时任务)框架

文章目录 一、Spring Task介绍二、cron表达式1.cron表达式介绍2.cron表达式在线生成器 三、fixedDelay四、fixedRate五、initialDelay六、Spring Task的使用1.导入maven坐标spring-context2.启动类添加注解EnableScheduling开启任务调度3.自定义定时任务类 一、Spring Task介绍…

Realtek 5G pcie网卡 RTL8126-CG简介

总shu&#xff1a;PCIE 5G网卡方案“RTL8126-CG”采用QFN56封装&#xff0c;面积8 x 8毫米&#xff0c;非常小巧&#xff0c;提供一个RJ-45网口、两个USB 3.x接口。它走的是PCIe 3.0 x1系统通道&#xff0c;搭配超五类网线&#xff0c;可以在长达100米的距离上提供满血的5Gbps网…

Jmeter性能测试入门之常用组件

一个jmeter的脚本通常包含线程组取样器断言定时器逻辑控制器配置元件监听器 线程组部分用法介绍&#xff1a; 【普通线程组】&#xff1a; **线程数&#xff1a;**可以理解为虚拟用户数 **Ramp-Up时间(秒)&#xff1a;**运行指定线程数需要的时间 **循环次数&#xff1a;**勾…

java基础+数据库基础+系统+JVM问题

的哎的哎 1、基础部分 java线程池 队列的选择 答&#xff1a; SingleThreadPool:适用于多个任务顺序执行的场景。 它使用的是LinkedBlockingQueue<>()&#xff0c;无界的阻塞队列&#xff0c;就意味着会有内存溢出的风险。 FixedThreadPool: 适用于任务量固定耗时长的…

QDDR究竟是什么?

QDDR究竟是什么? 在当今的高科技时代&#xff0c;我们经常遇到各种各样的缩写和术语&#xff0c;其中QDDR就是其中一个。那么&#xff0c;究竟什么是QDDR呢&#xff1f; QDDR&#xff0c;全称Quad Data Rate&#xff0c;是一种同步动态随机存储器&#xff08;SDRAM&#xff09…

验证链(CoVe)降低LLM中的幻觉10.31

验证链&#xff08;CoVE&#xff09;降低LLM中的幻觉 摘要1 引言2 相关工作3 验证链&#xff08;Chain-of-Verification&#xff09;3.1 生成基准回答3.2 计划验证3.3 执行验证3.4 最终验证的回答 4 实验&#xff08;直译&#xff09;4.1 任务4.1.1 WIKIDATA4.1.2 WIKI-CATEGOR…

应用于智慧矿山的皮带跑偏视频分析AI算法

一、引言 随着科技的发展&#xff0c;人工智能技术已经在各个领域得到广泛应用。而在智慧矿山领域&#xff0c;皮带跑偏视频分析是其中一个重要的应用方向。本文将详细介绍皮带跑偏视频分析AI算法的原理&#xff0c;以期为智慧矿山的发展提供有益的参考。 二、算法原理 1. 视…

【3妹教我学历史-秦朝史】2 秦穆公-韩原之战

插&#xff1a; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家一起学习鸭~~~ 3妹&#xff1a;2哥&#xff0c;今天下班这么早&#…

CT MR 三维重建可视化系统

前言 本文通过研究医学可视化的不同算法&#xff0c;在 vc环境下&#xff0c;以可视化软件包VTK 为平台&#xff0c;编程设计实现了三维建模系统&#xff0c;实现了 DICOM图像的三维重建。 材料与方法 使用符合 DICOM 标准的临床 CT、MRI图像数据&#xff0c;在 vc环境下&…

高等数学公式

目录 一.高中二.高数基础三.高数第一章 空间解析几何与向量代数2.向量代数6.二次曲面 第二章 多元函数的微分学第三章 重积分一、二重积分二、 三重积分直角坐标下三重积分的计算柱面坐标下三重积分的计算球面坐标下三重积分的计算曲面面积 第四章 曲线积分与曲面积分1、对弧长…

Qt常见类名关系整理

1、QAbstractItemModel与QAbstractItemView 模型的基类: The QAbstractItemModel class provides the abstract interface for item model classes. Inherited By: QAbstractListModel&#xff0c;QAbstractProxyModel,and QAbstractTableModel 视图的基类: The QAbstractIte…

代购商城源码是否可以定制开发?

定制开发&#xff0c;符合个性需求 代购商城源码是现代电子商务中的重要工具&#xff0c;它为代购商提供了建立在线店铺、管理产品和订单、处理支付和物流等功能。然而&#xff0c;对于不同的代购商而言&#xff0c;在源码的基础上进行个性化定制开发无疑是提升竞争力和用户体验…