Java学习笔记——内部类(成员类,局部类,匿名类)

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

private 为了保证数据的安全性

package review.InnerDemo;

class Computer{

private class Chip{

public void function(){

System.out.println(“芯片工作”);

}

}

public void show(){

Chip c = new Chip();

c.function();

}

}

public class demo3 {

public static void main(String[] args) {

Computer o = new Computer();

o.show();

//内部类加入了private权限修饰符之后,就不能被访问了

//Computer.Chip c = new Computer().new Chip();是错误的

}

}

芯片在电脑的里面,我们不希望芯片这个内部类被外界访问,所以用private修饰

这时我们只能在Computer类里面创建Chip类的对象,再由这个对象来调用成员变量或者成员方法。再像之前那样用外部类名.内部类名 对象名 = 外部类对象.内部类对象;的方法来创建内部类对象就不行了

那么有private修饰符,也有static修饰符

成员内部类加上一个static修饰符后变成静态内部类

格式为

class Outer{

static class Inner{

//静态内部类

}

}

static 为了让数据访问更方便

  1. 被静态修饰的成员内部类只能访问外部类的静态成员

  2. 静态内部类可以有静态成员,而非静态内部类则不能有静态成员(成员包括变量和方法)

  3. 非静态的成员内部类,成员只能是非静态的。

  4. 内部类被静态修饰后的方法有静态和非静态之分。他们的访问和不用静态是不一样的。

访问非静态方法:外部类名.内部类名 对象名 = new 外部类名.内部类名();

访问静态方法:上面创建的对象访问,或者外部类名.内部类名.方法名();

package review.InnerDemo;

class Computer1{

int num1 = 10;

static int num2 = 20;

public static class Chip1{

public static void show1(){ //内部类的静态方法

System.out.println(num2); //只能访问外部类的静态成员变量num2

System.out.println(“静态方法”);

}

public void show2(){ //内部类的非静态方法

System.out.println(“非静态方法”);

}

}

}

public class demo4 {

public static void main(String[] args) {

//访问非静态方法

Computer1.Chip1 c = new Computer1.Chip1();

c.show2();

System.out.println(“==========”);

//访问静态方法

c.show1();

System.out.println(“==========”);

//访问静态方法

Computer1.Chip1.show1();

}

}

结果为

在这里插入图片描述

局部内部类

  1. 可以直接访问外部类的成员

  2. 可以创建内部类对象,通过对象调用内部类方法,来使用局部内部类功能

局部内部类存在于方法中。

package review.InnerDemo;

class Outer3{

int num1 = 10;

public void show(){

int num2 = 20;

class Inner3{

int num3 = 30;

public void show2(){

System.out.println(num3);

System.out.println(num2);

System.out.println(num1);

}

}

//num2 = 40; 这里无法修改num2的值

//jdk1.8之后会自动在局部方法上的局部变量添加final

//System.out.println(num2);在这里打印的结果是num2 = 20

//创建内部类对象,通过对象调用成员变量

Inner3 i = new Inner3();

i.show2();

}

}

public class demo5 {

public static void main(String[] args) {

Outer3 o = new Outer3();

o.show();

}

}

结果为

在这里插入图片描述

局部内部类和成员内部类的区别

  1. 局部内部类的作用范围在方法或者作用域之内

  2. 局部内部类不能用public或private访问说明符进行声明

package review.InnerDemo;

class Outer3{

public void show(){

class Inner3{

public void show2(){

//这两种方式调用外部类的方法,结果是一样的

Outer3.this.test();

test();

}

}

Inner3 i = new Inner3();

i.show2();

}

public void test(){

System.out.println(“外部类方法”);

//要注意,不能在这里创建内部类的对象,超出局部内部类的作用范围

//Inner3 i = new Inner3();

}

}

public class demo5 {

public static void main(String[] args) {

Outer3 o = new Outer3();

o.show();

}

}

结果为

在这里插入图片描述

匿名内部类

就是内部类的简化写法。

前提:存在一个类或者接口。这里的类可以是具体类也可以是抽象类。

格式:

new 抽象类名或者接口名() {

重写方法;

}

先来看看如果不适用匿名内部类,应该怎么写

在这里插入图片描述

public interface interDemo {

public abstract void show1();

public abstract void show2();

}

abstract class abstractDemo {

public abstract void test();

}

class Inter implements interDemo{

public void show1(){

System.out.println(“show1”);

}

public void show2(){

System.out.println(“show2”);

}

}

public class Ab extends abstractDemo{

public void test(){

System.out.println(“test”);

}

}

public class demo1 {

public void function(){

Inter i = new Inter();

i.show1();

i.show2();

Ab a = new Ab();

a.test();

}

public static void main(String[] args) {

demo1 d = new demo1();

d.function();

}

}

结果为

在这里插入图片描述

这样写无疑是比较麻烦的,现在再来看看,使用匿名内部类后怎么写

public interface interDemo {

public abstract void show1();

public abstract void show2();

}

abstract class abstractDemo {

public abstract void test();

}

package review.InnerDemo.anonymous;

public class demo1 {

public void function(){

interDemo i = new interDemo(){

public void show1(){

System.out.println(“show1”);

}

public void show2(){

System.out.println(“show2”);

}

};

i.show1();

i.show2();

abstractDemo a = new abstractDemo() {

@Override

public void test() {

System.out.println(“test”);

}

};

a.test();

}

public static void main(String[] args) {

demo1 d = new demo1();

d.function();

}

}

结果是

在这里插入图片描述

跟之前的结果一样,但代码简洁了许多

那么到具体的情景中,要怎么使用匿名内部类呢

首先定义一个接口,学生要学习,里面有两个抽象方法 读书read和背诵recite

public interface Study {

public abstract void read();

public abstract void recite();

}

package review.anonymous1;

感受:

其实我投简历的时候,都不太敢投递阿里。因为在阿里一面前已经过了字节的三次面试,投阿里的简历一直没被捞,所以以为简历就挂了。

特别感谢一面的面试官捞了我,给了我机会,同时也认可我的努力和态度。对比我的面经和其他大佬的面经,自己真的是运气好。别人8成实力,我可能8成运气。所以对我而言,我要继续加倍努力,弥补自己技术上的不足,以及与科班大佬们基础上的差距。希望自己能继续保持学习的热情,继续努力走下去。

也祝愿各位同学,都能找到自己心动的offer。

分享我在这次面试前所做的准备(刷题复习资料以及一些大佬们的学习笔记和学习路线),都已经整理成了电子文档

拿到字节跳动offer后,简历被阿里捞了起来,二面迎来了P9"盘问"

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!
义一个接口,学生要学习,里面有两个抽象方法 读书read和背诵recite

public interface Study {

public abstract void read();

public abstract void recite();

}

package review.anonymous1;

感受:

其实我投简历的时候,都不太敢投递阿里。因为在阿里一面前已经过了字节的三次面试,投阿里的简历一直没被捞,所以以为简历就挂了。

特别感谢一面的面试官捞了我,给了我机会,同时也认可我的努力和态度。对比我的面经和其他大佬的面经,自己真的是运气好。别人8成实力,我可能8成运气。所以对我而言,我要继续加倍努力,弥补自己技术上的不足,以及与科班大佬们基础上的差距。希望自己能继续保持学习的热情,继续努力走下去。

也祝愿各位同学,都能找到自己心动的offer。

分享我在这次面试前所做的准备(刷题复习资料以及一些大佬们的学习笔记和学习路线),都已经整理成了电子文档

[外链图片转存中…(img-4XhZF1fl-1714683494029)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

  • 27
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值