news 2026/7/18 4:12:51

Java学习笔记--面向对象高级(内部类)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java学习笔记--面向对象高级(内部类)

1 内部类

1.1 内部类使用环境

1.2 练习

a01innerclassdemo1.Car

package com.itstudy.a01innerclassdemo1; public class Car { String brand; int carAge; String color; Engine engine; //内部类 class Engine { private String brand; private int engineAge; } }

a01innerclassdemo1.Test

package com.itstudy.a01innerclassdemo1; public class Test { public static void main(String[] args) { /* 需求:写一个Javabean类描述汽车 属性:汽车的品牌,车龄,颜色,发动机的品牌,使用年限 内部类的意义: 内部类表示的事物是外部类的一部分 内部类单独存在没有任何意义 */ } }

1.3 小结

2 内部类的分类

2.1 分类

2.2 成员内部类

2.2.1 成员内部类内容

2.2.2 练习

a01innerclassdemo2.Outer
package com.itstudy.a01innerclassdemo2; public class Outer { private class Inner { static int a = 10; } //对外提供内部类对象 public Inner getInstance() { return new Inner(); } }
a01innerclassdemo2.Test
package com.itstudy.a01innerclassdemo2; public class Test { public static void main(String[] args) { /* 编写成员内部类的注意点: 1.成员内部类可以被一些修饰符所修饰,比如: private,默认,protected,public,static等 2.在成员内部类里面,JDK16之前不能定义静态变量,JDK 16开始才可以定义静态变量。 获取成员内部类对象的两种方式: 方式一:外部类编写方法,对外提供内部类对象(使用private修饰内部类时使用) 方式二:直接创建 格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象; 范例:Outer.Inner oi = new Outer().new Inner(); */ //创建对象的方式: //类名 对象名 = new 类名(); //Student s = new Student; //我要创建的是谁的对象? //内部类的对象 //获取成员内部类对象的两种方式 //方式一:直接创建 // Outer.Inner oi =new Outer().new Inner(); //因为name是一个成员变量,想要调用只能通过对象去调用 // System.out.println(new Outer().name); //当成员内部类被private修饰时,外部类无法直接创建成员内部类对象 //方式二:外部类编写方法,对外提供内部类对象 //写法一: Outer o = new Outer(); Object inner= o.getInstance(); System.out.println(inner); //写法二: System.out.println(o.getInstance()); } }

2.2.3 练习--调用

a01innerclassdemo3.Outer
package com.itstudy.a01innerclassdemo3; public class Outer{ private int a = 10; class Inner{ private int a = 20; public void show(){ int a = 30; //Outer.this 获取了外部类对象的地址值 System.out.println(Outer.this.a); System.out.println(this.a);//20 System.out.println(a);//30 } } }
a01innerclassdemo3.Test
package com.itstudy.a01innerclassdemo3; import java.util.Scanner; public class Test { public static void main(String[] args) { //创建内部类的对象,并调用show方法 Outer.Inner oi = new Outer().new Inner(); oi.show(); Scanner sc = new Scanner(System.in); sc.next(); //jps 11084 Test } }
内部类的内存图

2.2.4 小结

2.3 静态内部类

2.3.1 静态内部类内容

a01innerclassdemo4.Outer
package com.itstudy.a01innerclassdemo4; public class Outer { int a = 10; static int b = 20; //静态内部类 static class Inner { public void show1(){ //静态方法调用非静态变量,需要创建对象,进行调用 /* Outer o = new Outer(); System.out.println(o.a); System.out.println(b);*/ System.out.println("非静态的方法被调用了"); } public static void show2(){ /* Outer o = new Outer(); System.out.println(o.a); System.out.println(b);*/ System.out.println("静态的方法被调用了"); } } }
a01innerclassdemo4.Test
package com.itstudy.a01innerclassdemo4; public class Test { public static void main(String[] args) { //静态内部类 // 注意事项: //1.静态内部类也是成员内部类中的一种 //2.静态内部类只能访问外部类中的静态变量和静态方法, // 如果想要访问非静态的需要创建对象。 //创建静态内部类对象的格式: // 外部类名.内部类名 对象名 = new 外部类名.内部类名(); //调用静态方法的格式: // 外部类名.内部类名.方法名(); //创建静态内部类的对象 //只要是静态的东西,都可以用类名.直接调用 Outer.Inner oi = new Outer.Inner(); oi.show1(); //非静态方法调用 Outer.Inner.show2(); //静态方法调用 } }

2.3.2 小结

2.4 局部内部类

2.4.1 局部内部类内容

a01innerclassdemo5.Outer
package com.itstudy.a01innerclassdemo5; public class Outer { int b=20; public void show() { int a = 10; //局部内部类 class Inner { String name; int age; public void method1() { System.out.println(a); System.out.println(b); System.out.println("局部内部类中的method1方法"); } public static void method2() { System.out.println("局部内部类中的method2静态方法"); } } //创建局部内部类的对象 Inner i = new Inner(); System.out.println(i.name + " " + i.age); i.method1(); Inner.method2(); } }
a01innerclassdemo5.Test
package com.itstudy.a01innerclassdemo5; public class Test { public static void main(String[] args) { /* 局部内部类 1.将内部类定义在方法里面就叫做局部内部类,类似于方法里面的局部变量。 2.外界是无法直接使用局部内部类,需要在方法内部创建对象并使用。 3.该类可以直接访问外部类的成员,也可以访问方法内的局部变量。 */ //调用show方法,让代码执行 Outer o = new Outer(); o.show(); } }

2.4.2 小结

2.5 匿名内部类(重点)

2.5.1 匿名内部类内容

a01innerclassdemo6.Swim(interface)
package com.itstudy.a01innerclassdemo6; public interface Swim { public abstract void swim(); }
a01innerclassdemo6.Student
//利用匿名内部类这个java文件可以没有(已经在内部定义) package com.itstudy.a01innerclassdemo6; public class Student implements Swim{ @Override public void swim() { System.out.println("学生正在游泳"); } }
a01innerclassdemo6.Test
package com.itstudy.a01innerclassdemo6; public class Test { public static void main(String[] args) { /* 要求:在测试类中调用下面的goSwimming方法 传统方式调用goSwimming方法: 1. 新建java文件,在文件当中新建Student类(实现,重写方法) 2. 创建学生的对象 Student s = new Student(); 3. 调用方法 goSwimming(s); 问题: 如果Student类我只用到一次,那么这个java文件单独新建有点浪费 我是否可以不新建这个Java文件,只要里面的代码呢? 匿名内部类的作用:少定义一个Java文件 匿名内部类的定义格式: new 类名/接口名(){ 重写类/接口里面的方法; } 匿名内部类的定义格式 = 没有名字的Java类 + 继承/实现 + 重写方法 + 创建对象 最终格式可以理解为:是一个没有名字的Java类的对象 没有名字的Java类:大括号 Swim:就是这个没有名字的Java类实现了swim接口 重写方法:我们要在大括号当中重写Swim所有的抽象方法 创建对象:new关键字作用的是后面这个合格没有名字的Java类,创建了他的对象 整体:创建了一个Swim实现类的对象,只不过这个类没有名字而已 */ // 写法一: goSwimming(new Swim() { @Override public void swim() { System.out.println("学生正在游泳"); } }); //写法二: //多态 Swim ss = new Student(); //多态 Swim s = new Swim() { @Override public void swim() { System.out.println("学生正在游泳"); } }; goSwimming(s); } // 调用这个方法的时候,需要传递Swim这个接口的实现类对象 public static void goSwimming (Swim s){ s.swim(); } }

2.5.2 小结

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/18 4:10:04

C++温度转换:从基础实现到工程化设计的完整指南

1. 项目概述:一个看似简单却暗藏玄机的起点“C实现华氏温度转摄氏温度”,这可能是很多C初学者遇到的第一个或前几个编程练习。乍一看,它简单得有些“无聊”——不就是套用一个公式吗?摄氏温度 (华氏温度 - 32) * 5 / 9。但恰恰是…

作者头像 李华
网站建设 2026/7/18 4:09:39

Google TPU v7x深度优化Qwen 3.5-397B MoE模型,推理性能提升3-4倍

这次我们来看一个重量级的技术突破:Google 工程师团队在最新的 Ironwood(TPU v7x)平台上对 Qwen 3.5-397B MoE 模型进行了深度优化。这个项目不是简单的模型微调,而是从系统工程的底层出发,通过一系列创新的并行策略和…

作者头像 李华
网站建设 2026/7/18 4:09:36

Shopify 店铺全球可达性:主题、支付与应用域分层测速

Shopify 店铺全球可达性:主题、支付与应用域分层测速 工具地址:https://www.speedce.com 中文界面:https://speedce.com/?langzh-CN 联系:speedceadsgmail.com 写在前面 Shopify 主域由平台管,但自定义域和 App 域要…

作者头像 李华
网站建设 2026/7/18 4:09:29

Mac mini M4开发环境搭建与AI编程实战指南

1. Mac mini M4开箱体验:苹果小主机的技术实力解析最近入手了全新的Mac mini M4,这款苹果小主机确实让人眼前一亮。作为开发者,我对这种紧凑型主机的性能表现特别关注,尤其是它在编程、AI模型搭建等场景下的实际表现。本文将全面分…

作者头像 李华
网站建设 2026/7/18 4:08:54

JavaScript函数组合:compose与pipe实战指南

1. 函数组合:从嵌套地狱到优雅流水线第一次看到层层嵌套的函数调用时,我的太阳穴突突直跳。那是一个处理用户订单的系统,代码长这样:calculateTotal(applyDiscount(validateOrder(formatUserInput(getUserData()))) )这种"回…

作者头像 李华