概念
内部类就是在一个类中继续定义一个类,内部类的好处就是方便内部类访问外币类的私有属性, 但是内部类在安卓开发中使用比较多。
定义内部类
package com.CoderLB;
public class Outer {
private String name="张三";
//定义一个内部类
public class Inner{
public void say(){
//在内部类中访问外部类(Outer)的私有属性
System.out.println("名字是:"+name);
}
}
public void print(){
//外部类的方法实例化内部对象
new Inner().say();
}
}
public class Test {
public static void main(String[] args) {
Outer outer = new Outer();
outer.print();
}
}
//输出 名字是:张三
上述在内部类中直接访问了外部类的私有属性,但是内部类对象是在外部类中创建的,如果在外部类之外创建呢?在主方法内?
不能在外部类之外直接创建内部类对象。因为内部类对象依赖于外部类对象存在。如果实例化内部类对象需要先实例化外部类对象。
实例化内部类对象
package com.CoderLB;
import com.baidu.vo.Dept;
public class Test {
public static void main(String[] args) {
new Outer().new Inner().say();
}
}
//输出:名字是:张三
小结1
- 内部类能直接访问外部类的私有属性
- 内部类对象是依赖于外部类对象存在的,如果要取得内部类对象则需要先实现外部类对象。
静态内部类
使用static修饰的变量是静态变量,使用static修饰的方法是静态方法,静态变量和静态方法都不依赖对象存在(直接属于类),同理使用修饰的内部类就是静态内部类,又同理,静态内部类依赖于外部类的存在,可以直接在外部类之外实例化静态内部类对象。
定义静态内部类
问题:
无法从静态上下文中引用非静态 变量 name
(静态内部类中不能访问外部类的费静态属性(name))
package com.CoderLB;
public class Outer {
private static String name="张三";
//定义一个内部类
public static class Inner{
public void say(){
//在内部类中访问外部类(Outer)的私有属性
System.out.println("名字是:"+name);
}
}
public void print(){
//外部类的方法实例化内部对象
new Inner().say();
}
}
public class Test {
public static void main(String[] args) {
Outer.Inner inner = new Outer.Inner();
inner.say();
}
}
//输出:名字是:张三
静态内部类实例化的时候是直接创建的,没有先创建外部类对象。所以静态内部类对象是不依赖外部类对象存在的。
小结2
1. 静态内部类不能访问外部类的非静态属性
2. 静态内部类对象不依赖于外部类对象
方法内部类
就是在方法中直接定义一个内部类,之后直接使用这个内部类对象的方法。
方法中定义内部类
package com.CoderLB;
import com.baidu.vo.Dept;
public class Test {
public static void main(String[] args) {
//调用fun方法
fun();
}
public static void fun(){
class Inner{
public void say(){
System.out.println("我是方法中的内部类");
}
}
//就在该方法中实例化内部类对象
new Inner().say();
}
}
//输出:我是方法中的内部类
访问方法的参数和局部变量
package com.CoderLB;
import com.baidu.vo.Dept;
public class Test {
public static void main(String[] args) {
//调用fun方法
fun("李四");
}
public static void fun( final String name){
final int age=10;
class Inner{
public void say(){
System.out.println("我是方法中的内部类");
System.out.println("名字是"+name);
System.out.println("年龄是"+age);
}
}
//就在该方法中实例化内部类对象
new Inner().say();
}
}
//输出:
我是方法中的内部类
名字是李四
年龄是10
方法中的内部类在jdk1.8版本之前如果访问方法的参数和局部变量需要使用final修饰变量和参数