内部类:
在一个类中定义另一个类的类结构,内部类是属于聚合管理(包含关系),内部类的存在必须依赖外部类的对象或类名.
作用:
主要是因为不希望该类作为大家共同使用访问的类;只供本类使用,从而达到外部类更好的管理内部类.
分为:
成员内部类?普通内部类)在一个类中定义另外一个类,
- 从而就像作为外部类的一个成员,可以使用外部类的所有的成员和方法;即使private的;
- 有一点要注意的是.外部类要访问内部类的所有成员变量和方法,则需要通过内部类的对象来获取,
这一规定就告诉我们,内部类中就不能含有static的变量和方法,
因为static可以不用通过对象调用, - 这里说的是成员内部类不能含有static的变量和方法,必须现有外部类,才能创建自己的内部类.
/**
*
- @author dch
*/
public class Student {
private String name;
int age=18;
//外部方法
public void getStu(){
System.out.println("姓名:"+name+"年龄:"+age);
}
//外部的静态方法
public static void method1(){
System.out.println("这是外部的一个静态方法");
}
/**
*
* 内部类
* @author dch
*
*/
public class Subject{
//内部类的成员变量
private String subjectName;
int score;
int age;
//内部类的普通方法
public void showSubject(){
System.out.println("科目名称:"+subjectName+","+"分数"+score);
//内部类的方法调用外部的方法
getStu();
//内部类的方法调用外部静态的方法
method1();
}
//内部类的静态方法
/*由于内部类的方法,需要依赖外部类的对象,
* 所以当外部类对象还没有存在的时,内部的静态
* 也不能直接开辟静态内存块.
*
* Public static void method2(){
System.out.println("这是内部类的静态方法");
}*/
}
//外部的方法,调用内部类的方法
public void method3(){
//需要创建内部类的对象
Subject subject = new Subject();
subject.showSubject();
//调用内部类的私有属性
System.out.println(subject.subjectName);
}
}
局部内部类: (方法内部类)在一个方法中,定义一个类,那类只能被方法拥有,外部不能用,
- 就有点像是一个局部变量一样,同时需要注意的是,局部内部类不能有访问说明符,但它可以访问当前代码块内的常量和此外围类的所有成员,
- 其次它的作用域范围也是在此方法中,方法外执行到,则会被JVM回收,局部内部类的实例化也只能在方法中进行.
- 而且还有一点局部内部类要想使用局部变量,该变量必须声明为final类型.
/**
*
- @author dch
*/
public class Plople {
//定义一个私有属性
private String name;
int age=18;
public void showInfo(){
System.out.println("姓名:"+name+","+"年龄"+age);
}
public void method(){
int age=19;
//方法里面的内部类
class MyClass{
int age=20;
//内部类的普通方法
public void mothod2(){
Plople plople = new Plople();
//方法里面的内部类的普通方法
//调用外部方法,因为上面创建了对象.
plople.showInfo();
}
}
//普通方法里面调用内部类的普通方法
//同样的也需要创建一个对象
MyClass myClass = new MyClass();
myClass.mothod2();
}
public void method2(){
//方法中的类不能被外部调用
//MyClass my = new MyClass()
}
}
静态内部类: (嵌套内部类)在一个类中定义的类是静态的,也就是修饰为static的内部类
-
这样就不需要内部类对象和外部类对象之间的联系,这样说,用户就可以直接引用" 外部类.内部类 "
-
普通内部类不能使用static数据和属性,也不能包含嵌套类,但是嵌套类可以.
-
嵌套类不能声明为private,一般声明都为public,方便调用.
//静态内部类
public static class MyStaticClass{//非静态方法 public void method4(){ //调用外部静态方法 method1(); method5(); //method3();嵌套类内部类调用外部普通方法为啥不对 //一直要加强一个人认知点:调用普通方法必须要有对象(自己真是个傻子) //这里明显没有对象 //Student student1 = new Student(); //student1.method3(); System.out.println("静态内部类的普通方法"); } //静态方法 public static void method5(){ System.out.println("静态内部类的静态方法"); //调用外部的静态方法 method1(); } //外部的静态方法
public static void method1(){
System.out.println("这是外部的一个静态方法");
}
//外部的方法,调用内部类的方法
public void method3(){
//需要创建内部类的对象
Subject subject = new Subject();
subject.showSubject();
MyStaticClass.method5();
//调用内部类的私有属性
System.out.println(subject.subjectName);
}
}
匿名内部类: 没有类名,只要类的具体实现
-
匿名内部类(就是解决一些不知道名字但是知道他是属于哪一类或者具有某些功能的东西)
(1).基于接口的(某些功能)
(2)基于继承的匿名类(某些类) -
匿名类因为是不能有名称的类,是不可能像上面一样(访问符)Class + 类名这样写出来的,所以必须在创建时,作为new语句的一部分来声明它们
例如:(1).基于接口的(某些功能)
Fangdao fangdao = new Fangdao() {@Override public void enterPassword() { // TODO Auto-generated method stub System.out.println("可以输出密码进行防盗"); } }; fangdao.enterPassword();
//(2).基于继承的匿名类(某些类)
Animal dog = new Dog();
dog.eat();
Animal weizhi = new Animal(){
public void eat(){
System.out.println("不知道什么动物的吃的动作");
}
};
//子类调用父类的方法
weizhi.play();
//子类调用子类重写的方法
weizhi.eat();