内部类分为:
局部内部类:
局部内部类就是在类的方法中定义的类。
注意:因为局部内部类的只能在其所在的方法中访问,所以局部内部类不能使用访问控制权限和static修饰符。
例:
public class LocalInnerClass{
public static void main(String[] args){
class test{
void print(){
System.out.println("你好局部内部类") ;
}
}
new test().print() ;//创建局部内部类的对象,并且调用实例方法print。
}
}
成员内部类——非静态内部类:
注:
1. 非静态内部类可以当做外部类的实例成员,所以它可以使用任意的访问控制符如:private、protected、public等修饰。
2.非静态内部类的方法访问某个变量时,系统优先在该方法内查找是否存在该名字的局部变量,如果存在就使用该变量;如果不存在,则到该方法所在的内部类中 查找是否存在该名字的成员变量。
3.非静态内部类不能拥有静态成员。
例:
public class Cow{
private double weight ;
public Cow(){
}
public Cow(double weight){
this.weight = weight ;
}
//创建非静态内部类
private class CowLeg{
private double length ; //裤子的长度
private String color ; //裤子的颜色
public CowLeg(){ //无参构造
}
public CowLeg(double length, String color){ //有参构造
this.length = length ;
this.color = color ;
}
public void info(){ //用来显示
System.out.print("当前牛仔裤颜色是:"+color+" 长:"+length) ;
}
}
public void test(){
CowLeg cl = new CowLeg(15,"blue") ; //创建内部类的实例
cl.info() ; //调用成员方法
System.out.println(" 宽:"+weight) ;
}
public static void main(String[] args){
new Cow(10).test() ; //创建Cow实例调用成员方法
}
}
成员内部类——静态内部类:
注:
1.静态内部类可以当做外部类的类成员。
2.静态内部类不能访问外部类的实例成员,只能访问外部类的类成员。
3.静态内部类可以拥有类成员或实例成员。
例:
public class StaticInnerClassTest{
//创建静态内部类
static class StaticInnerClass{
private static int age ; //定义年龄
public StaticInnerClass(){ //无参构造
}
public StaticInnerClass(int age){
this.age = age ;
}
public void accessOuterProp(){ //用来显示成员变量
System.out.println(age) ;
}
}
public static void main(String[] args){
new StaticInnerClassTest.StaticInnerClass(15).accessOuterProp() ;//创建静态内部类的实例并且调用其成员方法accessOuterProp。
}
}
匿名内部类:
匿名内部类主要是用于需要只创建一次使用的类。
注:
在Java8之前,Java要求被局部内部类、匿名内部类访问的局部变量必须使用final修饰,从Java8开始这个限制被取消了,Java8更加智能:如果局部变量被匿名内部类访问,那么该局部变量相当于自动使用final修饰。
例:
interface Product{
public void getPrice() ;
}
public class AnonymousTest{
public static void main(String[] args){
Product pd = new Product(){
public void getPrice(){
System.out.println("100元") ;
}
} ;
pd.getPrice() ;
}
}