首页 > 编程知识 正文

静态内部类可以定义非静态成员吗,静态内部类和内部类的区别

时间:2023-05-04 13:08:53 阅读:11464 作者:3228

内部类基本介绍

一个类的内部完全嵌套了另一个类结构。 嵌套类称为内部类inner class,嵌套的其他类称为外部类outer class。 作为我们类的第五个成员,内部类的最大特点是可以直接访问私有属性,表达类与类的包含关系

基本语法:

class outer { classinner } } http://www.Sina.com /

1 .定义外部类的局部位置(例如在方法中) :

1 )本地类(有类名) ) ) ) ) )。

2 )匿名内部类(无类名,重点);

在外部类成员的位置定义:

1 )成员内部类(未由静态限定) ) ) ) ) ) ) )。

2 )静态内部类(使用静态修饰) ) ) ) ) ) )。

内部类的分类:

内部班级记住三点会学到很多:

)1)本地内部类在方法内/代码块中定义

)2)作用域位于方法主体或代码块中

)3)本质仍然是一个类

说明:本地内部类在外部类(如方法)的本地位置定义,并有类名。

1 .可以直接访问外部类的所有成员,包括以下私有演示

class Outer{private int num=99; private void f1 () ({System.out.println ) )“真是太好了”); } { classinner { public void k (} { system.out.println ) num; Outer类的成员f1 (可以直接访问; Outer类的成员可以直接访问}}}} 2.不能添加访问修饰符。 由于他的地位是本地内部类,所以本地内部类不能使用修饰符,但可以使用final限定。 因为局部变量也可以使用final

class Outer{private int num=99; private void f1 () ({System.out.println ) )“真是太好了”); }{ class Inner{//正确的写法public void k (} { system.out.println ) ) num ); f1 (); }} final class Inner{}//正确的写法public class inner01{}//错误的写法如果将非final修饰符放在一起,就会变成错误的写法}} 3.作用域:他的方法或代码块

class Outer{private int num=99; private void f1 () ({System.out.println ) )“真是太好了”); } { classinner { public void k (} { system.out.println ) num; f1 (); }} Inner inner=new Inner (; //正确的写法} Inner inner=new Inner (; //错误写法//总结了方法或代码块的作用域,都是错误写法。 (4.本地内部类-访问-外部类成员[访问方式:直接访问]

class Outer{private int num=99; private void f1 () ({System.out.println ) )“真是太好了”); } { classinner { public void k (} { system.out.println ) num; //内部类可以直接访问外部类的成员f1 (; }}}} 5.外部类-访问-成员访问本地内部类的方式:正在创建和访问对象(注意:必须在范围内)

public class USB { publicstaticvoidmain (字符串[ ] args ) }}classouter ) privateintnum=99; private void f1 () ({System.out.println ) )“真是太好了”); } { classinner { public void k (} { system.out.println ) num; f1 (); }} Inner inner=new Inner (; //必须创建对象才能访问内部类的成员,如果需要,可以在范围中输入" inner.k "; }6.外部其他类(不可访问本地内部类(因为本地内部类的地位是本地变量) ) ) ) ) ) ) ) ) ) ) ) )。

public class USB { publicstaticvoidmain (字符串[ ] args ) { Inner inner=new Inner ); //错误的写法}}class Outer{private int num=99; private void f1 () ({System.out.println ) )“真是太好了”); } { classinner { public void k (} { system.out.println ) num; f1 (); }}7.如果外部类和本地内部类的成员重复,则默认情况下遵循最近的原则。 如果想访问外部类的成员,可以使用(外部类名. this .成员)进行访问

class Outer{private int num=

99;private void f1(){System.out.println("真好");}{class Inner{private int num=9;public void k() {System.out.println(Outer.this.num);//类名.this可以找到这个类中的成员 this.可以找到类中的成员f1();}}Inner inner=new Inner();inner.k();}}

匿名内部类:

匿名内部类的使用(重要)

(1)本质时类(2)内部类(3)该类没有名字(4)同时还时一个对象

说明:匿名内部类时定义在外部类的局部位置,比如方法中并且没有类名(表面没有名字,但是在底层系统还是给分配了名字的)

1.匿名内部类的基本语法

public class Test {public static void main(String[] args) {temp anonymous=new temp() {public void h1() {System.out.println("驱羊攻虎");}};anonymous.h1();System.out.println(anonymous.getClass());//输出匿名内部类的类名}}abstract class temp{public abstract void h1() ;}

2.匿名内部类的语法比较奇特,请大家注意,因为匿名内部类既是一个类的定义同时他本身也是一个对象,因此从语法上看,他既有定义类的特征,也有创建对象的特征对前面代码分析可以看出这个特点,因此可以调用匿名内部类方法。

3.可以直接访问外部类的所有成员,包括私有的

public class Test { private static String str="以卵击石";public static void main(String[] args) {temp anonymous=new temp() {public void h1() {System.out.println("驱羊攻虎r"+str);//可以直接访问外部类的所有成员,包括私有的}};anonymous.h1();System.out.println(anonymous.getClass());//输出匿名内部类的类名}}abstract class temp{public abstract void h1() ;}

4.不能添加访问修饰符。因为他的地位就是一个局部变量而已。

5.作用域:匿名内部类与局部内部类一样 仅仅在定义它的方法或代码块中

6.匿名内部类----访问---->外部类成员[访问方式:直接访问]

7.外部其他类—不能访问---->匿名内部类(因为 匿名内部类地位是一个局部变量)

8.如果外部类和匿名内部类的成员重名时,匿名内部类访问的化,默认遵循就近原则,如果想要访问外部类的成员,则可以使用(外部类名.this.成员)去访问 如Test.this.str

成员内部类:

说明:成员内部类是定义在外部类的成员位置,并且没有static修饰

基本用法:

public class InnerClassTest { public class InnerClassA { }}

1.可以直接访问外部类的所有成员,包含私有的

2.可以添加任意访问修饰符(public、protected、默认、private), 因为它的地位就事一个成员。

3.作用域:和外部类的其他成员一样,为整个类体,在外部类的成员方法中创建成员内部类对象,在调用方法。

4.成员内部类----访问---->外部类(比如:属性) [访问方式:直接访问](说明)

5.外部类—>访问---->内部类 (说明) 访问方式:创建对象,在访问

6.外部其他类----访问---->成员内部类

7.如果外部类和内部类的成员重名时,内部类访问的话,默认遵循就进原则,如果想访问外部类的成员,则可以使用(外部类名.this.成员)去访问

静态内部类的使用:

说明:静态内部类是定义在外部类的成员位置,并且有static修饰

public class InnerClassTest { static class InnerClassA { }}

1.可以直接访问外部类的所有静态成员,包含私有的,但不能直接访问非静态成员

2.可以添加任意访问修饰符(public、protected、默认、private),因为它的地位就是一个成员

3.作用域:同其他成员,为整个类体

4.静态内部类—访问—>外部类(比如:静态属性)[访问方式:直接访问所有静态成员]

5.外部类—访问—>静态内部类 访问方式:创建对象、在访问

6.外部其他类—访问—>静态内部类

7.如果外部类和静态内部类的成员重名时,静态内部类访问的时,默认遵循就近原则,如果想访问外部类的成员,则可以使用(外部类名.this.成员)去访问

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。