面向对象进阶(下)(JAVA笔记第二十五期)

p.s.这是萌新自己自学总结的笔记,如果想学习得更透彻的话还是请去看大佬的讲解

目录

  • 抽象方法和抽象类
    • 抽象方法定义格式
    • 抽象类定义格式
    • 抽象方法和抽象类注意事项
  • 接口
    • 接口的定义
    • 接口中成员变量的特点
    • 接口中没有构造方法
    • 接口中成员方法的特点
    • 在接口中定义具有方法体的方法
      • 在接口中新增默认方法(解决接口升级的问题)
      • 在接口中新增静态方法(不能被重写)
      • 在接口中新增私有方法
    • 接口与类之间的关系
      • 类与类之间的关系
      • 类与接口之间的关系
      • 接口与接口之间的关系
    • 接口的多态
  • 设计模式
    • 适配器设计模式
  • 内部类
    • 成员内部类
      • 获取成员内部类的对象
      • 成员内部类如何获取外部类的成员变量
      • 特殊的成员内部类:静态内部类
        • 创建静态内部类的对象
        • 调用非静态方法的格式:先创建对象,用对象调用
        • 调用静态方法的格式:外部类名.内部类名.方法名();
    • 局部内部类
    • 匿名内部类
      • 使用场景
  • 重写toString()方法

抽象方法和抽象类

抽象方法:如果一个方法抽取到父类中,不确定方法体,那就不要写方法体,再用abstract关键字修饰,那么这个方法就叫做抽象方法。
作用:父类有抽象方法,子类必须强制重写抽象方法,否则子类代码直接报错
而抽象方法所在的类就叫抽象类

抽象方法:将共性(同名)的行为(方法)抽取到父类之后,由于每一个子类执行的内容不一样,所以在父类当中无法确定具体的方法体,该方法即可定义为抽象方法
抽象类:如果一个类里面存在抽象方法,,那么该类则必须声明为抽象类

抽象方法定义格式

public abstract 返回值类型 方法名(参数列表);

抽象类定义格式

public abstract class 类名{}

抽象方法和抽象类注意事项

抽象类不能实例化(即不能创建对象)
抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
抽象类可以有构造方法
抽象类的子类要么重写抽象类中的所有抽象方法,要么是抽象类
举例

public abstract class Person {private String name;private int age;public abstract void work();public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}//构造方法的作用:当创建子类对象时,给属性进行赋值public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}
//=============================================
class  Student extends Person{@Overridepublic void work() {System.out.println("学生的工作就是学习");}//重写抽象类的所有抽象方法public Student() {}public Student(String name, int age) {super(name, age);}}
//=============================================
class Test{public static void main(String[] args) {Student student = new Student("张三",18);System.out.println(student.getName()+", "+student.getAge());}
}

接口

接口是一个抽象类型,是抽象方法的集合,一个类通过继承接口的方式,从而来继承接口的抽象方法。(可以看作是一种规则)
.
接口的子类也叫实现类,其要么实现重写接口当中所有的抽象方法,要么其为一个抽象类
.
接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。
.
除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。(具体原因参考抽象方法与抽象类)
.
接口无法被实例化,即不能创建接口的对象,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。
.

接口的定义

接口用interface来定义
格式

public interface 接口名{}

接口与类之间是实现关系,通过implements关键字表示
格式

public class 类名  implements 接口名{}

注意:一个类可以实现单个接口(单实现),也可以实现多个接口(多实现)
举例

public class 类名  implements 接口名1,接口名2{}

注意:实现类可以在继承一个类的同时实现多个接口
举例

public class 类名 extends 父类 implements 接口名1,接口名2{}

接口中成员变量的特点

只能是常量
默认修饰符:public static final (即就算你不加,系统也会自动给你加上)
调用方式:接口名.常量名

接口中没有构造方法

接口中成员方法的特点

JDK8以后接口中可以定义抽象方法、有方法体的方法(默认方法、静态方法)、私有方法。
其中抽象方法也有默认修饰符:pubilc abstract



在接口中定义具有方法体的方法

在接口中新增默认方法(解决接口升级的问题)

由于只要添加接口中的抽象方法时,其对应的实现类也要添加对应的抽象方法,否则实现类就会报错

所以JDK8以后允许在接口中定义默认方法,需要用关键字default修饰
定义格式为

public default 返回值类型 方法名(参数列表){   }

注意:默认方法不是抽象方法,所以不强制重写。但是如果被重写,重写的时候要去掉default关键字
public可省略,但default关键字不可以省略
如果实现了多个接口,多个接口中存在同名的默认方法,则子类就必须对该方法进行重写(因为系统不知道你以后调用的是哪个接口中的默认方法,干脆让你重写得了)

在接口中新增静态方法(不能被重写)

JDK8以后允许在接口中定义静态方法,需要用关键字static修饰
定义格式为

public static 返回值类型 方法名(参数列表){   }

注意:静态方法只能通过接口名调用,不能通过实现类名或对象名调用
public可省略,但static关键字不可以省略
接口和实现类中有两个重名的静态方法,这不叫重写,只是恰好同名而已

在接口中新增私有方法

由于在接口中有一些方法的代码重复了,但我又不想让这些代码被别的接口、类使用,于是我们便可以将这些代码写在一个方法里并将其私有化,使其只能在本接口中使用。
JDK9以后允许在接口中定义私有方法,需要用关键字private修饰,且不能加用default修饰
.
给默认方法调用的叫普通私有方法

private 返回值类型 方法名(参数列表){   }

给静态方法调用的叫静态私有方法

private static 返回值类型 方法名(参数列表){   }

.

接口与类之间的关系

类与类之间的关系

继承关系。只能单继承,不能多继承,但是可以多层继承

类与接口之间的关系

实现关系。可以单实现,也能多实现,还可以再继承一个类的时候同时实现多个接口
如果实现类实现了多个接口。那么就要把所有接口的所有抽象方法进行重写
如果有多个重名的抽象方法,这个抽象方法只需要重写一次就可以了

接口与接口之间的关系

继承关系。能单继承,也能多继承
如果实现类实现的是底层的子接口,那么实现类要把该接口以及其所有父类接口里面的抽象方法重写

接口的多态

当一个方法的参数是接口时,可以传递接口所有实现类的对象,这种方式称为接口多态
定义格式:接口类型 变量 = new 实现类对象();
其遵守编译看左边、运行看右边的原则

设计模式

设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结(说白了就是一套公式)
使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码的可用性、程序的重用性

适配器设计模式

解决接口和实现类之间的矛盾问题:接口中有n个抽象方法,但实现类只想使用其中一个。如果重写所有抽象方法会提高后期代码的维护难度
适配器设计模式解决方案:定义一个中间类(即适配器)(xxxAdapter)(一般是抽象类,目的是为了让外界无法创建它的对象)实现接口并且对接口中的抽象方法进行空实现(即重写接口中的抽象方法但不写方法体)
这时再让原本的实现类不再实现接口,而是继承中间类。这样需要使用哪个方法,就重写那个方法就行了

内部类

内部类就是在一个类里面再定义一个类
我们可以在外部其他类中创建内部类的对象并调用内部类的方法

意义:假如创建一个汽车的JavaBean类型,属性有发动机的年龄、最大功率、汽车颜色、汽车品牌。
这时我们便可以将发动机的属性定义在一个内部类里面,从而提高了代码的可读性

内部类一般来说遵循以下规则:
内部类中的事物是外部类中的一部分;内部类单独出现没有任何意义(比如汽车的发动机、人的大脑)

内部类的访问特点:
内部类可以直接访问外部类的成员,包括私有;外部类要访问内部类的成员,必须创建对象

内部类分为四种:成员内部类、静态内部类、局部内部类、匿名内部类

成员内部类

写在成员位置(类中方法外)的,属于外部类的成员之一(比如汽车的发动机)

成员内部类可以被一些修饰符所修饰,比如private、默认、protected、public等
用private修饰则外部其他类不能直接创建内部类的对象,只能在外部类里面创建内部类的对象
默认的话则内部类只能在本包当中使用,在其他包里面不起作用
用protected修饰则在其他包的子类中也可以使用
用public修饰则所有的地方都可以创建成员内部类的对象
.
JDK16以后,在成员内部类里面可以定义静态变量

获取成员内部类的对象

方法一:在外部类中编写方法,对外提供内部类的对象(成员内部类被private修饰的时候)
举例:

   public Inner getInstance(){return new Inner();} 

方法二:直接创建格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象
举例:Outer.Inner inner = new Outer().new Inner();

成员内部类如何获取外部类的成员变量

若没有重名,就直接调用
若重名,则外部类名.this.变量名

举例

public class Outer {private int a = 10;class Inner{private int a = 20;public void show(){int a = 30;System.out.println(Outer.this.a);//a==10System.out.println(this.a);//a==20System.out.println(a);//a==30}}
}

内存原理分析

特殊的成员内部类:静态内部类

如果成员内部类前面用static修饰,则这个成员内部类就叫做静态内部类

静态内部类只能访问外部类中的静态变量和静态方法,如果想要访问非静态的需要创建对象,再用外部类的对象进行调用
静态内部类的实例不依赖于外部类的实例。

创建静态内部类的对象

创建格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象
举例:Outer.Inner inner = new Outer.Inner();
只要是静态的东西,都可以用类名.来获取

调用非静态方法的格式:先创建对象,用对象调用
调用静态方法的格式:外部类名.内部类名.方法名();

局部内部类

将内部类定义在方法里面就叫做局部内部类,类似于方法里面的局部变量

外界无法直接使用,需要在方法内创建对象并使用
该类可以直接访问外部类的成员,也可以访问方法内的局部变量

举例

public class Outer1 {int a = 10;public void show(){int b = 20;class Inner{//局部内部类String name;int age;public void method(){System.out.println("访问外部类的成员"+a);System.out.println("访问局部变量"+b);System.out.println("局部内部类的方法");}public static void method1(){System.out.println("局部内部类的静态方法");}}//在局部方法中创建内部类的对象Inner inner = new Inner();System.out.println(inner.age);System.out.println(inner.name);inner.method();Inner.method1();}
}
//=========================================================
class Test1{public static void main(String[] args) {Outer1 outer1 = new Outer1();outer1.show();}
}

匿名内部类

匿名内部类,即隐藏了名字的内部类。可以写在成员位置,也可以写在局部位置


格式

new 类名或接口名(){重写方法;
};

上面的整体格式为创建一个匿名内部类对象的格式
其中包含了三部分:继承/实现、方法重写、创建对象
理解匿名内部类的定义格式

使用场景

当方法的参数是接或者类的时候
以接口为例,可以传递这个接口的实现类对象
如果实现类中使用一次的话,就可以使用匿名内部类简化代码

举例

public class Test2 {public static void main(String[] args) {method( new Animal(){@Overridepublic void eat() {System.out.println("狗吃骨头");}});//创建一个匿名内部类对象并作为参数}public static void method(Animal animal){animal.eat();}}abstract class Animal{public abstract void eat();
}

重写toString()方法

当我们想要直接打印一个对象来获取它的信息(即地址值)时,其实是把对象调用toString()方法的返回值给打印出来,由于String自己本身重写了toSting()方法,所以打印对象的时候就不需要重写toString()方法。
比如输出MyClass@15db9742
但是这种地址值可读性不强,并且我们也不清楚该对象的某些信息(如id等)
由于打印对象的时候其实是把对象调用toString()方法的返回值给打印出来,因此我们便可以重写oString()方法来达到我们想要的效果(即不用通过调用get()方法来一 一获得该对象的属性并且自定义打印的格式)

比如

public class Test {private int id;private String name;public Test(int id, String name) {this.id = id;this.name = name;}@Overridepublic String toString() {return "Test{id=" + id + ", name='" + name + "'}";}public static void main(String[] args) {Test obj = new MyClass(1, "Example");System.out.println(obj);}
}

输出将是:
Test{id=1, name='Example'}
因此在直接打印对象时,我们可以通过重写toString()方法来获取对象的某些信息而不用通过调用get()方法来一 一获得该对象的属性

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

好用的idea插件之自动sql生成

功能 自动化代码生成: 通过解析数据库表结构和实体类定义,自动生成对应的Mapper接口、XML映射文件、Service、DAO和实体类等代码。支持快速生成增删查改(CRUD)代码,以及在表结构变化后重新生成代码而不覆盖自定义方法。…

#【2024年10月26日更新】植物大战僵尸杂交本V2.6更新内容与下载

更新内容 新增植物: 英雄植物:终极射手、向日葵公主、汉堡王(仅限英雄模式使用)。星卡植物:星星盒子、猫窝、迷幻投手、玉米旋转机(需要一定数量的星星解锁)。挑战植物:金卡黄金锤子…

什么是 VolTE 中的 Slient Redial?它和 CSFB 什么关系?

目录 1. 什么是 Silent Redial(安静的重拨号)? 2. Silent Redial 信令流程概述 3. 总结 Silent Redial 和 CSFB 啥关系? 博主wx:yuanlai45_csdn 博主qq:2777137742 想要 深入学习 5GC IMS 等通信知识(加入 51学通信),或者想要 cpp 方向修改简历,模拟面试,学习指导都…

FreeSWITCH 简单图形化界面30 - 使用MYODBC时可能遇到的错误

FreeSWITCH 简单图形化界面30 - 使用MYODBC时可能遇到的错误 测试环境1、 MYODBC 3.51.18 or higher2、分析和解决2.1 解决1,降级MySQL ODBC2.2 解决2,修改FreeSWITCH代码 测试环境 http://myfs.f3322.net:8020/ 用户名:admin,密…

【学术论文投稿】Windows11开发指南:打造卓越应用的必备攻略

【IEEE出版南方科技大学】第十一届电气工程与自动化国际会议(IFEEA 2024)_艾思科蓝_学术一站式服务平台 更多学术会议论文投稿请看:https://ais.cn/u/nuyAF3 目录 引言 一、Windows11开发环境搭建 二、Windows11关键新特性 三、Windows11设计指南 …

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-21

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-21 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-21目录1. The Fair Language Model Paradox摘要研究背景问题与挑战如何解决创新点算法模型实验效果重要数据与结论推荐阅读指数&…

Spring Boot:植物健康监测的智能先锋

摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了植物健康系统的开发全过程。通过分析植物健康系统管理的不足,创建了一个计算机管理植物健康系统的方案。文章介绍了植物健康系统的系统分析部分&…

基于Python的B站视频数据分析与可视化

基于Python的B站视频数据分析与可视化 爬取视频、UP主信息、视频评论 功能列表 关键词搜索指定帖子ID爬取指定UP主的主页爬取支持评论爬取生成评论词云图支持数据存在数据库支持可视化 部分效果演示 爬取的UP主信息 关键词搜索爬取 指定UP主的主页爬取 指定为黑马的了 爬取视…

嵌入式C语言字符串具体实现

大家好,今天主要给大家分享一下,如何使用C语言进行字符串操作与实现。 第一:字符串相关操作实现 复制函数五个基本要素: 头文件:#include <string.h> 函数原型:strcpy(char dest[],char src[]) -----string copy 功能:把src数组中\0之前的所有字符,连同‘\…

Http 状态码 301 Permanent Rediret 302 Temporary Redirect

HTTP状态码301和302是什么&#xff1f; 1、HTTP状态码301 HTTP状态码301表示永久性转移&#xff08;Permanent Redirect&#xff09;&#xff0c;这意味着请求的资源已经被分配了一个新的URI&#xff0c;以后的引用应该使用资源现在所指的URI。 HTTP 301状态码表示请求的资源…

工具方法 - Omnifocus: 网页版基本操作

1&#xff0c;第一个左上角点开&#xff0c;显示如下的视角&#xff1a; 从这个工具来说&#xff0c;优先的第一事项&#xff0c;是用户从哪个视角来切入&#xff0c;不同的视角展现不同的逻辑&#xff0c;对应不同的操作。 通过视角一级的菜单&#xff0c;来方便用户的操作。 …

2024.10.9华为留学生笔试题解

第一题无线基站名字相似度 动态规划 考虑用动态规划解决 char1=input().strip() char2=input().strip() n,m=len(char1),len(char2) dp=[[0]*(m+1) for _ in range(n+1)] #dp[i][j]定义为以i-1为结尾的char1 和以 j-1为结尾的char2 的最短编辑距离 setA = set(wirel@com) set…

解决pycharm无法添加conda环境的问题【Conda Environment下没有Existing environment】

解决pycharm无法添加conda environment 问题【Conda Environment下不显示Existing environment】 问题&#xff1a; 第一次下载好pycharm准备编写代码&#xff0c;在Anoconda Prompt建立好环境后&#xff0c;打开pycharm导入环境&#xff0c;却发现在【Conda Environment】处…

C++STL之stack

1.stack的使用 函数说明 接口说明 stack() 构造空的栈 empty() 检测 stack 是否为空 size() 返回 stack 中元素的个数 top() 返回栈顶元素的引用 push() 将元素 val 压入 stack 中 pop() 将 stack 中尾部的元素弹出 2.stack的模拟实现 #include<vector> namespace abc { …

hcia复习篇

计算机网络&#xff1a; 云技术&#xff1a; 云储存---将数据通过计算机网络传输并储存在第三方服务器。&#xff08;百度网盘&#xff09; 云计算---分布式计算。&#xff08;即共享硬件资源&#xff09; 计算机技术&#xff1a; 文字、图片、视频等---抽象文字。 抽象语言…

django游戏门户系统

想做毕业设计但还没有头绪&#xff1f;&#x1f64b;‍♂️django游戏门户系统了解一下&#xff01;这个系统不仅功能全面&#xff0c;还能轻松解决你的项目选题难题&#xff01; 我们这个基于Django开发的游戏门户系统提供了用户注册、登录、内容发布以及管理功能&#xff0c…

软件测试学习总结

一.软件测试概念和目的 软件测试的概念: 测试模型(V模型) 软件测试就是在软件投入运行前,对软件需求分析、设计规格说明和编码实现的最终审查,它是软件质量保证的关键步骤。 通常对软件测试的定义有两种描述: 定义1:软件测试是为了发现错误而执行程序的过程 定义2:…

前端同步异步-setTimeout-Promise-async-await

总结下前端的同步异步、事件循环问题&#xff0c;如有错误欢迎指正。 目录 一、setTimeout定时器函数 1.定义 2.基本语法 3.返回值 4.使用 1&#xff09;异步执行 2&#xff09;嵌套使用 3&#xff09;事件循环 二、Promise 1.定义 2.状态 3.基本语法 1&#xff0…

矩阵概念 和 性质

目录 一、矩阵因式分解 二、矩阵在图形学的运用 一、矩阵因式分解 1、先将矩阵化为上三角阵&#xff0c;得到U 2、每个主元列以下元素 主元 得到下三角阵 二、矩阵在图形学的运用 二维移动&#xff1a; 子空间H&#xff1a; 零向量属于H 对H中任意向量u、v&#xff0c;uv…

js构造函数和原型对象,ES6中的class,四种继承方式

一、构造函数 1.构造函数是一种特殊的函数&#xff0c;主要用来初始化对象 2.使用场景 常见的{...}语法允许创建一个对象。可以通过构造函数来快速创建多个类似的对象。 const Peppa {name: 佩奇,age: 6,sex: 女}const George {name: 乔治,age: 3,sex: 男}const Mum {nam…