定义 : 在Java中,允许在一个类的内部定义类,这样的类称作内部类也叫做嵌套类,这个内部类所在的类称作外部类。
内部类的创建 :
1 外部类名.内部类名 变量名=new外部类名().new 内部类名();
2 在外部类的内部可以直接使用inner s=new inner();(因为外部类知道inner(内部类名)是哪个类,所以可以生成对象。)
内部类的共性 :
1 内部类仍然是一个独立的类,在编译之后会内部类会被编译成独立的.class文件,但是前面冠以外部类的类命和$符号。(以$开头的标识符在Java中表示内部类名,是合法标识符)
2 内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,包括外部类private修饰的成员变量。
匿名内部类的优点 : 1 可以使命名变得简洁
2 使代码更加紧凑,简洁,封装性比内部类更优
3 一个类用于继承其他类或是实现接口,无需增加其他的方法,只是对继承方法实现覆盖
匿名内部类的缺点 : 可读性差
使用匿名内部类的前提: 必须继承父类或实现一个接口
匿名内部类特点 : 匿名内部类一定是跟在new的后面,用其隐含实现一个接口或一个类,没有类名,根据多态,我们使用其父类名。因为匿名内部类属于局部类,
所以局部类的所有限制对其生效。匿名内部类是唯一一种无构造方法的类。
匿名内部类注意点: 1 不能有构造方法
2 不能定义任何静态成员、方法或类
3 不能是public,protected,private,static
4 只能创建匿名内部类的一个实例。
下面我们来个实例
package com.yc.beab;
public interface Product {//定义产品接口 接口中有未实现的方法 getPrice(),getName()
public double getPrice();
public String getName();
}
package com.yc.beab;
public class TestAnonymous {
public void test(Product p){
System.out.println("购买了一个"+p.getName()+",花去"+p.getPrice());
}
public static void main(String[] args){
TestAnonymous ta=new TestAnonymous();
//调用test方法,需要传入一个Product参数,此处传入其匿名,实现类的实例
ta.test(new Product(){ //此处只例举了第二种 内部类的创建
public double getPrice(){
return 40;
}
public String getName(){
return "水晶球";
}
});//ta.test(注意接口方法的实现是写在括号内的); 最后的;也不能丢
}
}
//以上的匿名内部类相当于有以下代码
/*
class AnonymousProduct implements Product //implements是实现接口的关键字 此处AnonymousProduct类实现了接口
{
public double getPrice(){
return 40;
}
public String getName(){
return "水晶球";
}
}
ta.test(new AnonymousProduct());
*/
内部类的创建 :
1 外部类名.内部类名 变量名=new外部类名().new 内部类名();
2 在外部类的内部可以直接使用inner s=new inner();(因为外部类知道inner(内部类名)是哪个类,所以可以生成对象。)
内部类的共性 :
1 内部类仍然是一个独立的类,在编译之后会内部类会被编译成独立的.class文件,但是前面冠以外部类的类命和$符号。(以$开头的标识符在Java中表示内部类名,是合法标识符)
2 内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,包括外部类private修饰的成员变量。
匿名内部类的优点 : 1 可以使命名变得简洁
2 使代码更加紧凑,简洁,封装性比内部类更优
3 一个类用于继承其他类或是实现接口,无需增加其他的方法,只是对继承方法实现覆盖
匿名内部类的缺点 : 可读性差
使用匿名内部类的前提: 必须继承父类或实现一个接口
匿名内部类特点 : 匿名内部类一定是跟在new的后面,用其隐含实现一个接口或一个类,没有类名,根据多态,我们使用其父类名。因为匿名内部类属于局部类,
所以局部类的所有限制对其生效。匿名内部类是唯一一种无构造方法的类。
匿名内部类注意点: 1 不能有构造方法
2 不能定义任何静态成员、方法或类
3 不能是public,protected,private,static
4 只能创建匿名内部类的一个实例。
下面我们来个实例
package com.yc.beab;
public interface Product {//定义产品接口 接口中有未实现的方法 getPrice(),getName()
public double getPrice();
public String getName();
}
package com.yc.beab;
public class TestAnonymous {
public void test(Product p){
System.out.println("购买了一个"+p.getName()+",花去"+p.getPrice());
}
public static void main(String[] args){
TestAnonymous ta=new TestAnonymous();
//调用test方法,需要传入一个Product参数,此处传入其匿名,实现类的实例
ta.test(new Product(){ //此处只例举了第二种 内部类的创建
public double getPrice(){
return 40;
}
public String getName(){
return "水晶球";
}
});//ta.test(注意接口方法的实现是写在括号内的); 最后的;也不能丢
}
}
//以上的匿名内部类相当于有以下代码
/*
class AnonymousProduct implements Product //implements是实现接口的关键字 此处AnonymousProduct类实现了接口
{
public double getPrice(){
return 40;
}
public String getName(){
return "水晶球";
}
}
ta.test(new AnonymousProduct());
*/