安阳设计工厂,安徽网站排名优化公司,云建站微网站,湖南广源建设工程有限公司网站内部类#xff1a;定义在类结构中的另一个类#xff1a; 类中的定义的成员#xff1a;字段、方法、内部类 为什么使用内部类#xff1f;
增强封装#xff0c;把内部类隐藏在外部类之内#xff0c;不许其他类访问该类。内部类能提高代码的可读性和可维护性#xff0c;…内部类定义在类结构中的另一个类 类中的定义的成员字段、方法、内部类 为什么使用内部类
增强封装把内部类隐藏在外部类之内不许其他类访问该类。内部类能提高代码的可读性和可维护性把小型类嵌入到外部类中结构上代码更靠近。内部类可以直接访问外部类的成员。
package com.test;
//双向链表
public class LinkledList {//第一个节点private Node first;//最后一个节点private Node last;//火车的车厢是在火车的内部class Node{private Node prev;//上一个节点private Node next;//下一个节点private Object ele;//当前节点存储的数据}
}
外部类的访问修饰符要么public要么缺省。
内部类看做是外部类的一个成员那么内部类可以使用public/缺省\protected\private修饰还可以是static修饰。
内部类分为四种
实例内部类内部类没有使用static修饰静态内部类:内部类使用了static修饰局部内部类在方法中定义的内部类匿名内部类适合于使用一次使用的类属于局部内部类的特殊情况。 对于每个内部类来说java编译器会生成独立的.class文件。成员内部类外部类$内部类名称局部内部类外部类名$数字内部类名称匿名内部类外部类名数字
实例内部类没有static修饰内部类说明内部类属于外部类的对象 特点
创建实例内部类前必须存在外部类对象通过外部类对象创建内部类对象当存在内部类对象时一定存在外部类对象。
package com.test;class Outer{String nameok;class Inner{void print(){System.out.println(name);}}
}
public class test1{public static void main(String[] args){Outer outnew Outer();out.new Inner().print();;//通过外部类对uter.Inner inout.new Inner();}
}
实例内部类的实例自动持有外部类的实例的引用内部类可以直接访问外部类成员。 外部类中不能够直接访问内部类的成员必须通过内部类的实例去访问。 class Outer{ String name外部类; void OuterPrint(){ System.out.println(new Inner().str); } class Inner{ private String str内部类; void print(){ System.out.println(name); } } } “如果实例内部类和外部类存在同名的字段和方法abc在内部类中this.abc:表示 访问内部类成员反之亦然。
静态内部类 使用static修饰的内部类。 特点
静态内部类的实例不会自动持有外部类的特定实例的引用在创建内部类的实例时不必创建外部类的实例。
package com.test;class Outer{static String name外部类;static class Inner{private static final String str内部类;void print(){System.out.println(name);}}
}
public class test1{public static void main(String[] args){//不必new Outer().new Inner()因此不必创建外部类的实例new Outer.Inner().print();}
}
2.静态内部类中可以直接访问外部类的静态成员如果访问外部类的实例成员必须通过外部类的实例去访问。
class Outer{static String str外部类;String s非静态;static class Inner{static void print(){System.out.println(str);}}
}
3.在静态内部类中可以定义静态成员和实例成员。 4.测试类可以通过完整的类名直接访问静态内部类的静态方法。
package com.test;class Outer{static class Inner{static void print(){System.out.println(静态内部类);}}
}
public class test1{public static void main(String[] args){//不必new Outer().new Inner()因此不必创建外部类的实例Outer.Inner.print();}
}
局部内部类没啥用 在方法中的定义的内部类其可见范围是当前方法和局部变量是同一个级别。
public class test1{public static void main(String[] args){class Inner{void print(){System.out.println(内部类);}}}
}
1.不能使用public、private、protected和static修饰符。 2.局部内部类只能在当前方法中使用。 3.局部内部类和实力内部类一样不能包含静态成员。 4.局部内部类和实力内部类可以访问外部类的所有成员。 5. 局部内部类访问的局部变量必须使用final修饰在java中自动隐式加上final,但是依然是常量不能改变值。 上述代码报错 package com.test;public class test1{public static void main(String[] args){final int num17;class Inner{void print(){System.out.println(num);}}new Inner().print();}
}
java 中变量存储位置的区别 1.寄存器最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈存放基本类型的变量数据和对象的引用但对象本身不存放在栈中而是存放在堆new 出来的对象或者常量池中字符串常量对象存放在常量池中。 3. 堆存放所有new出来的对象。 4. 静态域存放静态成员static定义的 5. 常量池存放字符串常量和基本类型常量public static final。 6. 非RAM存储硬盘等永久存储空间
如果用final修饰变量就是常量存放在常量池中当方法被销毁后对象仍然可以调用。
匿名内部类是一个没有名称的局部内部类适合只使用依次的类是特殊的局部内部类满足局部内部类特征。