Java中的内部类你了解吗

网友投稿 263 2022-09-01


Java中的内部类你了解吗

目录成员内部类1.定义2.成员内部类的使用规则 3.成员内部类对象的创建:4.内部类与静态域静态内部类:1.定义:2.静态内部类的使用规则:3.静态内部类对象的创建 成员内部类 VS 静态内部类方法内部类:1.定义:2.方法内部类的使用规则:3.注意形参的使用匿名内部类(函数式编程)总结

成员内部类

1.定义

成员内部类是直接定义在类中,不加任何修饰符的(特指不加static修饰的)的内部类,可以类比着成员变量来理解,如下面这个代码段中的Inn类就是一个成员内部类

public class Inner1 {

private String o = "外部类属性";

public class Inn{

private String i = "成员内部类属性";

}

}

2.成员内部类的使用规则

内部类可以直接的访问外部类的成员变量,但是因为内部类也是一个类,所以外部类必须通过内部类的对象才能访问内部类的成员变量内部类就相当于外部类的成员变量,故而内部类与外部类之间可以方便的相互访问,包括privte权限修饰的属性和方法成员内部类可以实现“曲线救国”,通过多个内部类继承别的类,变相的实现多继承

//成员内部类

public class Inner1 {

// 外部类的私有属性o

private String o = "外部类属性";

public class Inn{

// 内部类的私有属性i

private String i = "成员内部类属性";

private void Itest(){

// 内部类直接访问外部类的属性,包括私有属性

System.out.println(o);

}

}

public void Otest(){

// 外部类则要先创建内部类的对象再访问其成员变量,这里注意,也可以访问其私有属性

Inn in = new Inn();

in.Itest();

System.out.println(in.i);

}

public static void main(String[] args) {

Inner1 i1 = newhttp:// Inner1();

i1.Otest();

}

}

3.成员内部类对象的创建:

外部类的内部创建:与正常类的对象创建方法一样,内部类名称 对象名 = new 类名()

public class Inner1 {

private String str1 = "外部类";

// 外部类内部创建内部类对象

Inn i1 = new Inn();

private class Inn{

private String str2 = "内部类";

}

}

外部类的外部创建:成员内部类就相当于是外部类的一个特殊的成员变量,故而,我们知道,成员内部类依赖于外部类的存在而存在,也就是说,必须先有外部类的对象才能创建成员内部类的对象 外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称()当前,在外部类的外部创建内部类对象时,前提也需得内部类对外部类的外部是可见的

如下图, 内部类为private,在外部类的外部无法创建该对象

修改内部类访问权限为public时正确创建 :

public class Inner1 {

private String str1 = "外部类";

// 外部类内部创建内部类对象

Inn i1 = new Inn();

public class Inn{

private String str2 = "内部类";

}

}

class Test{

// 外部类的外部创建外部类的内部类对象

Inner1.Inn i2 = new Inner1().new Inn();

}

4.内部类与静态域

成员内部类可以访问外部类的静态域,但是自己不能定义静态变量(成员内部类是依赖于外部类的,如果它自己能定义静态变量,没有外部对象也能访问了,失去其意义)外部类中的静态方法也不能使用成员内部类(相当于在静态变量中调用成员变量,是不可行的)。为此,特别注意,main方法就是static方法,故而不能直接在外部类的main方法中创建内部类对象,要借助外部类才能创建

public class Inner1 {

private String str1 = "外部类";

// 外部类内部创建内部类对象

Inn i1 = new Inn();

public class Inn{

private String str2 = "内部类";

}

public static void main(String[] args) {

// main中创建

Inner1.Inn inn = new Inner1().new Inn();

System.out.println(inn.str2);

}

}

静态内部类:

1.定义:

静态内部类也是定义在类中,但是与成员内部类不同的是,它用static修饰,是静态内部类,可类比静态变量进行理解static修饰,所以它无需依赖外部类对象,我们可以把它看作一个普通类

pubhttp://lic class Inner2 {

private String str1 = new String("外部");

// 静态内部类

public static class Inn{

private String str2 = new String("静态内部");

}

}

2.静态内部类的使用规则:

静态内部类不能直接访问外部类的普通成员变量 (普通成员变量有对象才能访问,所以static不能访问普通的成员变量),当然,可以通过new一个外部类的对象来达到访问外部类成员变量的目的

public class Inner2 {

private String str1 = new String("外部");

private static String str3 = new String("外部静态属性");

// 静态内部类

public static class Inn {

private String str2 = new String("静态内部");

public void fun(){

// 静态内部类不能直接访问外部类的普通成员变量

System.out.println(str1);

// 但可以通过new一个外部类对象访问

Inner2 i2 = new Inner2();

System.out.println(i2.str1);

// static家族互通

System.out.println(str3);

}

}

}

但是,静态内部类虽然不能直接访问外部类的成员变量,但是是可以拥有自己的普通成员变量 的

3.静态内部类对象的创建

外部类内部:和普通类的用法相同 ,且不同于成员内部类,在静态内部类这里,外部类的静态方法中是可以创建静态内部类的对象(static家族互访),当然,没有对象都可以,那么,外部类的成员方法中也是可以创建静态内部类对象的内部类名称 对象名 = new 类名()

public class Inner2 {

private String str1 = new String("外部");

// 静态内部类

public static class Inn{

private String str2 = new String("静态内部");

}

// 直接在类的内部创建静态内部类的对象

Inn i = new Inn();

public static void main(String[] args) {

// 外部类的静态方法中创建使用静态内部类的对象

Inn inn = new Inn();

}

}

外部类的外部:

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

public class Inner2 {

private String str1 = new String("外部");

// 静态内部类

public static class Inn {

private String str2 = new String("静态内部");

}

}

class Test{

// 外部类的外部创建静态内部类的对象

Inner2.Inn i = new Inner2.Inn();

}

成员内部类 VS 静态内部类

成员内部类可以访问外部类的成员域和静态域,但是不能拥有自己的静态域静态内部类不可以直接访问外部类的成员域,但可以拥有自己的成员域,另外,static家族互访,随意

方法内部类:

1.定义:

直接定义在方法内部,不允许使用任何修饰符修饰(包括访问权限修饰符,static等),对外部完全隐藏,出了这个方法,这个类就没有了,可以类比局部变量进行理解

2.方法内部类的使用规则:

除了无法定义static域外,和成员内部类基本一样,这里不再赘述

3.注意形参的使用

方法内部类中若使用了方法的形参, 该形参为隐式的final声明(JDK8之前,必须手动显式定义为final ,但JDK8以后,直接隐式一定为finalMbQxpGM)

如下面这个例子:

public class Inner3 {

public void fun(int num){

// 方法内部类

class Inn{

public void test(){

// 将下面这行代码注释掉,num正常可作运算

// System.out.println(num);

}

}

num ++;

System.out.println(num);

}

public static void main(String[] args) {

Inner3 i3 = new Inner3();

i3.fun(3);

}

}

但如果我们的方法内部类使用了方法的形参,编译报错

匿名内部类(函数式编程)

是方法内部类的特殊版本,直接不写类名称遵从方法内部类的所有要求默认会继承一个类或实现一个接口,继承类一般是继承抽象类通常是在MbQxpGM传参的过程中使用该类,可以简化写法

如之前我们写的接口传参:

public class Inner4 {

public static void fun(MessageImpl m) {

m.printMessage();

}

public static void main(String[] args) {

MessageImpl l = new MessageImpl();

fun(l);

}

}

interface IMessage {

void printMessage();

}

class MessageImpl implements IMessage {

public void printMessage() {

System.out.println("aaa");

}

}

使用匿名内部类可以这样写:

public class Inner4 {

public static void fun(IMessage m ){

m.printMessage();

}

public static void main(String[] args) {

// 匿名内部类

fun(new IMessage() {

@Override

public void printMessage() {

System.out.println("aaa");

}

});

}

}

interface IMessage {

void printMessage();

}

最后,重点掌握成员内部类与静态内部类,以及二者使用区别。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:基于Python与命令行人脸识别项目(系列二)(python实现人脸识别系统)
下一篇:基于Python和命令行人脸识别项目(系列三)(python如何实现人脸识别)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~