java基础语法(11)| 内部类

1. 内部类

1.1 什么是内部类

将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,B则称为外部类

1.2 内部类的分类

  • 成员内部类

  • 局部内部类

  • 匿名内部类

1.3 成员内部类

在描述事物时,若一个事物内部还包含其他事物,就可以使用内部类这种结构。比如,汽车类 Car 中包含发动机类 Engine ,这时 Engine 就可以使用内部类来描述,定义在成员位置。

  • 成员内部类格式

 class 外部类 {
    class 内部类{ 
    }
}

  •  成员内部类访问特点

内部类可以直接访问外部类的成员,包括私有成员。

外部类要访问内部类的成员,必须要建立内部类的对象。

  • 创建内部类对象格式

 外部类名.内部类名 对象名 = new 外部类型().new 内部类型();

  • 代码示例:

定义类:


public class Person {private boolean live;public void setLive(boolean live) {this.live = live;}//内部类class Heart{public void jump(){//内部类可以直接访问外部类的成员,包括私有if (live){System.out.println("在跳");}else{System.out.println("不在跳");}}}}
  • 测试类:
public class InnerDemo {public static void main(String[] args) {       //创建外部类对象Person p = new Person();p.setLive(true);//创建内部类对象Person.Heart heart = p.new Heart();//调用内部类方法heart.jump();}
}

【注】内部类仍然是一个独立的类,在编译之后会内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和符号。比如,Heart.class

2. 局部内部类

2.1 什么是局部内部类

 将一个类定义在一个方法中,该类就称之为是局部内部类。

2.2 如何使用局部内部类

只能在该方法内部使用局部内部类 。 

  • 代码示例:
public class Test {public static void main(String[] args) {Outer outer = new Outer();outer.show();}
}public class Outer {public void show(){// 局部内部类class Inner{public void method(){System.out.println("Inner 局部内部类的method方法执行了....");}}// 在外部类的方法内使用局部内部类Inner inner = new Inner();inner.method();}
}

3. 匿名内部类

是内部类的简化写法。它的本质是一个 带具体实现的 父类或者父接口的 匿名的 子类对象

开发中,最常用到的内部类就是匿名内部类了。以接口举例,当你使用一个接口时,似乎得做如下几步操作。

1. 定义子类 实现接口
2. 重写接口中的方法 
3. 创建子类对象 
4. 调用重写后的方法

  • 使用匿名内部类的前提

 匿名内部类必须==继承一个父类==或者==实现一个父接口==

  • 匿名内部类的格式
 new 父类名或者接口名(){// 方法重写@Override public void method() {        // 执行语句}
};
  • 匿名内部类的使用

定义接口:

public interface FlyAble{public abstract void fly();
}
  • 方式一:创建匿名内部类,并调用
public class InnerDemo {public static void main(String[] args) {//直接new接口,无需写实现类来实现接口new FlyAble(){//直接实现方法public void fly() {System.out.println("我飞了~~~");}}.fly();}
}
  • 方式二 :常在方法的形式参数是接口或者抽象类时,也可以将匿名内部类作为参数传递
 public class InnerDemo2 {public static void main(String[] args) {FlyAble f = new FlyAble(){//直接重写抽象方法public void fly(){System.out.println("我要飞,飞啊,飞,,");}@Overridepublic void fly2() {System.out.println("我要飞,飞啊,飞,,2222");}};f.fly();f.fly2();}
}
  • 方式三: 匿名内部类调用
public class InnerDemo3 {public static void main(String[] args) {showFly(new FlyAble() {@Overridepublic void fly() {System.out.println("9999999");}@Overridepublic void fly2() {System.out.println("888888888");}});}public static void showFly(FlyAble f){f.fly();f.fly2();}
}

4. 引用类型方法的参数和返回值

实际的开发中,引用类型的使用非常重要,也是非常普遍的。我们可以在理解基本类型的使用方式基础上,进一步去掌握引用类型的使用方式。基本类型可以作为成员变量、作为方法的参数、作为方法的返回值,那么当然引用类型也是可以的。

 4.1 普通类-作为方法的参数及返回值

普通类-作为方法的形参

方法的形参是类名,其实需要的是该类的对象
实际传递的是该对象的【地址值】

  •  代码示例:
public class Student {public void study(){System.out.println("好好学习,天天向上");}
}
public class StudentDemo {//把普通类当作一个参数public void method(Student student){student.study();}
}
public class StudentTest {public static void main(String[] args) {StudentDemo st = new StudentDemo();Student s = new Student();st.method(s);}
}

普通类-作为方法的返回值

方法的返回值是类名,其实返回的是该类的对象
实际传递的,也是该对象的【地址值】

  • 代码示例:
public class Student {public void study(){System.out.println("好好学习,天天向上");}
}public class StudentDemo {//返回值类型为一个类public Student getStudent(){return  new Student();}
}public class StudentTest {public static void main(String[] args) {StudentDemo st = new StudentDemo();//返回也是一个对象Student student = st.getStudent();student.study();}
}

4.2 抽象类-作为方法的参数及返回值

  • 方法的形参是抽象类名,其实需要的是该抽象类的子类对象

  • 方法的返回值是抽象类名,其实返回的是该抽象类的子类对象

  • 代码演示---抽象类作为形参
public abstract class Person {public abstract void study();
}
public class PersonDemo {public void method(Person p){p.study();}
}
//抽象类作为参数,必须实例化
public class Student extends Person {@Overridepublic void study() {System.out.println("好好学习,天天向上!!");}
}
//测试
public class PersonTest {public static void main(String[] args) {PersonDemo pd = new PersonDemo();//抽象类需要一个具体类来实现Person p = new Student();//method的参数是一个抽象类,那抽象类如何实例化呢? 多态的方式pd.method(p);}
}
  • 代码示例--抽象类作为返回类型
public abstract class Person {public abstract void study();
}public class PersonDemo {//返回对象是一个抽象类public Person getPerson(){//person是一个抽象类,只能通过多态的方法实例化// Person p = new Student();// return p;return new Student();}
}//具体子类实现抽象类Person
public class Student extends Person {@Overridepublic void study() {System.out.println("好好学习,天天向上!!");}
}//测试
public class PersonTest {public static void main(String[] args) {PersonDemo pd = new PersonDemo();Person person = pd.getPerson();person.study();}
}

4.3 接口类-作为方法的参数及返回值

  • 方法的形参是接口名,其实需要的是该接口的实现类对象

  • 方法的返回值是接口名,其实返回的是该接口的实现类对象

  • 代码示例--接口作为形参
public interface Love {public abstract void show();
}
public class LoveDemo {//接口作为参数public void method(Love love){love.show();}
}//子类实现接口
public class LoveImpl implements Love {@Overridepublic void show() {System.out.println("爱一燕");}
}//测试
public class LoveTest {public static void main(String[] args) {LoveDemo ld = new LoveDemo();//需要对接口的参数进行实现化,多态的方法Love love = new LoveImpl();//参数需要的是一个接口ld.method(love);}
}
  •  代码示例--接口作为返回值
public interface Love {public abstract void show();
}
public class LoveDemo {//接口作为返回值public Love getLove(){// 接口不能直接返回,需要实例化,多态的方式// Love love = new LoveImpl();// return love;return new LoveImpl();}
}//子类实现接口
public class LoveImpl implements Love {@Overridepublic void show() {System.out.println("爱一燕");}
}//测试
public class LoveTest {public static void main(String[] args) {LoveDemo ld = new LoveDemo();Love love = ld.getLove();love.show();}
}

忙碌的生活,也需要偶尔停下脚步~   希望今天的你开开心心~

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

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

相关文章

基于starganvc2的变声器论文原理解读

数据与代码见文末 论文地址:https://arxiv.org/pdf/1907.12279.pdf 1.概述 什么是变声器,变声器就是将语音特征进行转换,而语音内容不改变 那么我们如何构建一个变声器呢? 首先,我们肯定不能为转换的每一种风格的声…

JavaEE初阶——多线程(一)

T04BF 👋专栏: 算法|JAVA|MySQL|C语言 🫵 小比特 大梦想 此篇文章与大家分享多线程的第一部分:引入线程以及创建多线程的几种方式 此文章是建立在前一篇文章进程的基础上的 如果有不足的或者错误的请您指出! 1.认识线程 我们知道现代的cpu大多都是多核心…

【Figma】安装指南及基础操作

先前做UI设计一直都是用PS等绘图软件设计,但发现在纠结像素和排版问题上会花很多时间,再加上AI没来得及上手,就需要迅速出成图,此时通过论坛发现了figma,基本上可以满足足够的需求,并且可以在windows系统上…

【云开发笔记NO.27】分布式数据库

在云原生开发中,分布式数据库是一种特殊类型的数据库管理系统,其数据不是存储在单个集中的服务器上,而是分散在网络中的多个节点或服务器上。这种分散存储的方式使得分布式数据库具有很高的可扩展性、容错性和性能优势。云原生环境下的分布式…

SVG图标显示

SVG图标显示 1.安装SharpVectors.Wpf包 2.添加引用 xmlns:svgc"http://sharpvectors.codeplex.com/svgc/"3.加载svg文件&#xff0c;生成操作选择资源(Resource) 4.UI界面显示SVG图像 <Button Click"OnSaveFileClick" ToolTip"Save Svg File…

武汉星起航:跨境电商领域崭露头角,以实战经验引领行业新潮流

随着全球经济的演进&#xff0c;跨境电商正成为国际贸易的引擎&#xff0c;而武汉星起航电子商务有限公司凭借其丰富实战经验和专业团队&#xff0c;在这一领域取得了引人瞩目的成绩。公司成立于2020年&#xff0c;自2017年起紧紧围绕亚马逊自营店铺&#xff0c;致力于为合作伙…

基于Spring Boot+Vue的在线拍卖系统

随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单管理、…

初学python记录:力扣1600. 王位继承顺序

题目&#xff1a; 一个王国里住着国王、他的孩子们、他的孙子们等等。每一个时间点&#xff0c;这个家庭里有人出生也有人死亡。 这个王国有一个明确规定的王位继承顺序&#xff0c;第一继承人总是国王自己。我们定义递归函数 Successor(x, curOrder) &#xff0c;给定一个人…

通用接口开放平台设计与实现——(30)消息服务端之消息重发优化

背景 消息服务通信机制为异步&#xff0c;且网络连接不是100%可靠&#xff0c;会因为网络闪断问题丢失消息&#xff0c;作为企业应用&#xff0c;需要保证业务消息传输的可靠性&#xff0c;需实现以下机制&#xff1a; a)发送方重发机制&#xff1a;消息发送方对未收到响应的消…

谷歌(Google)技术面试——全部面试流程

简介 本篇介绍一下谷歌的全部面试流程,包括两次电话面试和五次现场面试。之后便是招聘委员会评定和录用审核。 Google 电话面试 电话面试通常会持续 30 至 60 分钟。 电话面试的内容涵盖数据结构与算法。准备好用你最擅长的编程语言编写 20 至 30 行代码。代码应该保持整洁…

酱油行业市场需求及广阔前景分析

随着居民消费升级&#xff0c;对高品质生活的向往使得酱油市场需求持续增长。消费者对酱油的功能性需求日益细分&#xff0c;追求健康、天然与个性化的产品特性&#xff0c;从而推动了市场的多元化进步。 同时&#xff0c;餐饮业的蓬勃发展以及外卖市场的扩大&#xff0c;均为酱…

【Django开发】前后端分离美多商城项目第6篇:用户部分,1. 业务说明【附代码文档】

美多商城项目4.0文档完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;美多商城&#xff0c;项目准备1.B2B--企业对企业,2.C2C--个人对个人,3.B2C--企业对个人,4.C2B--个人对企业,5.O2O--线上到线下,6.F2C--工厂到个人。项目准备&#xff0c;配置1. 修改set…

通用分布式锁组件

通用分布式锁组件 1 Redisson1.1介绍1.2 为什么要使用Redisson实现分布式锁1.2.1 锁续期的问题1.2.2 获取锁尝试的问题1.2.3 可重入问题 1.3 Wath Dog的自动延期机制1.4 快速了解1.5 项目集成 2 定义通用分布式锁组件2.1 实现思路分析2.2 定义注解2.3 定义切面2.4 使用锁2.5.工…

STL之string模拟实现

面试题&#xff1a;简易版string(深拷贝与浅拷贝的问题) 如果要实现简易版的string 无需涉及增容问题&#xff0c;成员变量可以不用存储容量和元素个数 构造函数 错误示范 class string {string(): _str(nullptr){}string(const char* str): _str(str){}char& operator[](s…

函数/类模板详解

目录 概述 函数模板 1.函数模板的定义 2.函数模板的使用 3.非类型的模板参数 类模板 1.函数模板的定义 2.类模板的成员函数 3.模板类名字的使用 4.非类型的模板参数 概述 泛型编程是一种编程思想&#xff0c;其追求摆脱数据类型的束缚&#xff0c;通过将数据类型作为…

Redis数据库:高可用(主从复制、哨兵模式、cluster集群)

目录 前言 一、Redis数据库高可用 二、Redis 主从复制 1、Redis主从复制概述 1.1 Redis主从复制概念 1.2 Redis主从复制的作用 1.3 Redis主从复制的流程 2、搭建Redis主从复制 2.1 环境部署 2.2 主服务器修改配置文件 2.3 从服务器修改配置文件 2.4 测试主从复制效…

负氧离子监测站解析

TH-FZ4防腐木负氧离子监测站&#xff0c;作为一种独特的空气质量监测设备&#xff0c;以其独特的优势在生态环保领域发挥着日益重要的作用。这种监测站不仅具备防腐木材质带来的天然美感与耐久性&#xff0c;更结合了先进的负氧离子监测技术&#xff0c;为环境保护和生态旅游等…

[开源]基于SVM的时间序列预测python代码

整理了SVM的时间序列预测python代码分享给大家。记得点赞哦 #!/usr/bin/env python # coding: utf-8import numpy as np import matplotlib.pyplot as plt import pandas as pd from sklearn import preprocessing from sklearn.metrics import mean_squared_error from math i…

短剧小程序系统开发,让短剧观看与创作更加便捷。短剧系统源码搭建

一、目前短剧发展趋势 1. 市场规模&#xff1a;根据数据来看&#xff0c;2023年中国微短剧市场规模达到了373.9亿元&#xff0c;同比上升了267.65%。预计2024年市场规模将超过500亿元。这一市场规模的增长速度非常显著&#xff0c;显示出短剧行业的巨大潜力和发展前景。 2. 投…

蓝桥杯考前复习三

1.约数个数 由乘法原理可以得出&#xff1a; import java.util.*; public class Main{static int mod (int)1e9 7;public static void main(String[] args){Map<Integer,Integer> map new HashMap<>(); //创建一个哈希表Scanner scan new Scanner(System.in);i…