欢迎来到类、内部类、匿名内部类的世界

一、什么是类:
类是一类相同事物的抽象描述,而相同的事物具有相同的特征和行为,将相同的特征和行为进行提取,定义成一个类。
类的具体实例化即是对象,对象在客观世界中即是每一个实体。
在java语言中,一类事物相同的特征和行为,我们称之为属性和方法,也有的称为属性和函数。
二、类的定义格式
<修饰符>class<类名>{
        <属性定义>
        <默认的构造方法>
        <方法定义>

}

三、类的理解
例如:
每个人是一个实例化的对象,而通过每个对象抽象出来的即是一类人,人都有一些共有的属性,比如姓名、年龄、性别等,人可以有相同的方法(行为),比如:人可以走路——walk.,人可以思考——think。
定义一个Person类:
publicclassPerson{
   //人都有的属性:姓名
private String name;
//人都有属性:年龄
privateint age;
//人都有的属性:性别
private String gender
//默认存在的构造方法
publicperson(){

}
//定义人都有的方法:走路
publicvoidwalk(){
system.out.println(“我可以走路,你也可以”)
}
//定义人都有的方法:思考
publicvoidthink(){
system.out.println(“我可以思考,你也可以思考”)
}
1、定义一个类要注意以下几点:
1)在同一个package里面,不允许出现两个类名相同的类
2)在同一个package里面,只能有一个和.class文件名相同的类用public修饰,其他类不能用
3)外部类的访问控制修饰符只能是public或者默认的(default)
4)一个类中的内部类是可以用public修饰的,也可以是default(默认的)、protected(受保护的)、private(私有的)等访问控制修饰符来修饰的。
5)可以用来修饰类的修饰词可以是final(最终的)、abstract(抽象的),不能用static(静态的)来修饰。
6)一般建议定义一个普通类的属性时使用private来修饰,符合面向对象封装的特点——“即属性私有化,行为公开化”
三、除了定义普通的类,还可以定义内部类
内部类指的是在一个类定义在另一个类里面,可以有四种表现形式:
1、成员内部类:在一个类中直接定义的类,与成员变量处在同一级。
例如:
package difficult;
//定义一个成员内部类
publicclassPerson{
 //生成的是Person.class文件
 privateint a=10;
 
 //在Person类中定义一个Student类,如:
 publicclassStudent{
   //生成的是Person$Student.class文件
   
 }

}

2、方法内部类:在一个类的方法中定义的类,也称为局部内部类。
在方法中定义内部类,只能使用abstract或者final或者默认的default来修饰
1)、方法内部类只能在定义该内部类的方法内实例化,不可以在此方法外对其实例化。

例如:
package difficult;

import org.omg.CORBA.PUBLIC_MEMBER;

//定义一个局部内部类(即定义在方法中)
publicclassPerson{
 //生成的是Person.class文件
 privateint a=10;
 
 publicvoidmethod(){
   
 //在方法中定义内部类,只能使用abstract或者final或者默认的default来修饰
 final  classTeacher{
     //生成Person$1Teacher.class文件
   }
 }
 
}

3、匿名内部类:
匿名内部类的使用:指在定义时没有名称的类,如果某个类只需要使用一次,可以采用匿名内部类的方法来定义。
1)、继承式的匿名内部类
例如:
package difficult;
//定义一个继承式的匿名内部类
publicclassExtendsClass {
 //这里的方法,匿名内部类中也要有
 publicvoidshow(){
   System.out.println(“继承式的匿名内部类,这里的方法也要被’继承'”);
 }
 publicstaticvoidmain(String[] args) {
   
   ExtendsClass eClass=new ExtendsClass(){
     
     publicvoidshow(){
       System.out.println(“这里是匿名内部类中的方法”);
     }
     
   };
   eClass.show();
   //输出的结果是:”这里是匿名内部类中的方法”
 }

}

2)、接口式的匿名内部类
例如:
package difficult;
//定义一个接口式的匿名内部类
publicclassInterfaceClass {
 publicstaticvoidmain(String[] args) {
   Out out=new Out(){
     @Override
     publicvoidshow() {
       System.out.println(“必须重写接口中的方法”);
       
     }
     
   };
   out.show();
     //输出的结果是:”必须重写接口中的方法”
 }
}
//接口
interfaceOut{
 publicvoidshow();
}
3)、参数式的匿名内部类
例如:
package difficult;
//定义一个参数式的匿名内部类
publicclassStaticInnerClass{
 publicstaticvoidmain(String[] args){
   //创建一个Boo的对象
   Boo boo=new Boo();
   //调用test方法
   boo.test(new Aoo(){
   //这里用接口的匿名内部类作为一个对象给到test方法中当参数使用
     @Override
     publicvoidshow(){
       System.out.println(“这里是接口中的show方法被重写”);
       
     }
   });
 }
}
//接口
interfaceAoo{
 publicvoidshow();
}
classBoo{
 //test方法中的参数是接口的一个实例对象
   publicvoidtest(Aoo aoo){
   
 }

}

4、静态嵌套类
例如:
package difficult;
//定义一个静态嵌套类
publicclassStaticClass {
 publicstaticvoidmain(String[] args) {
   //调用静态内部类中的show方法
   Father.Sun fs=new Father.Sun();
   fs.show();
   //输出的结果是:”静态内部类中的方法”

 }
}
classFather{
//static修饰的内部类
 staticclassSun{
   publicvoidshow(){
     System.out.println(“静态内部类中的方法”);
   }
 }
}
四、定义内部类的好处
1. 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类,如果一个类只对某个类提供使用权限,则可以优先定义为内部类。
2. 内部类的方法可以直接访问外部类的属性和方法,包括私有的属性。
3. 内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便。
五、Java内部类的定义原则
内部类的访问规则:
1、内部类可以直接访问外部类中的成员,包括私有的。
内部类之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用,格式:外部类名.this
2、外部类要访问内部类,必须建立内部类对象。
1)当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中。
可以直接建立内部类对象。
格式:
   外部类名.内部类名  变量名 = 外部类对象.内部类对象;
   Outer.Inner in = new Outer().new Inner();
      in.内部类的属性或者方法
3、当内部类被static修饰后,只能直接访问外部类中的static成员。
4、同时当内部类中定义了静态成员,该内部类必须是static的。
六、在内部类中调用外部类的成员变量和方法

例如:
package difficult;
/**
* 在内部类中调用外部类的方法和变量
* @author Administrator
*
*/
publicclassTheFirstClass {
 //外部类的变量
 int a=9;
 //外部类的方法
   publicvoidshow(){
         
    }
    //内部类
    classInnerClass{
      //内部类的变量和外部类的变量同名
    int a=10;
   public   voidok(){
     //内部类中第一种调用外部类的方法,直接调用
     show();
     //也可以通过隐式的外部类对象来调用外部类方法
     TheFirstClass.this.show();
     //当内部类的变量和外部类的变量同名的时候使用隐式的外部类对象来调用变量
         //否则这里的a指的是内部类中的变量a
     System.out.println(“内部类调用外部类的成员变量”+TheFirstClass.this.a);
   }
 }
}
七、类中的变量和方法
1、变量包括:成员变量和局部变量
成员变量,包括实例变量和静态变量(用static修饰的变量)
2、方法包括:实例方法和静态方法(static修饰的方法也称为类方法)
3、static修饰的成员变量和成员方法习惯上称为静态变量静态方法,可以直接通过类名来访问,访问语法为:
类名.静态方法名(参数列表…)
类名.静态变量名
4、实例方法和静态方法在调用变量和方法时的区别
1) 实例方法
当类的字节码文件加载到内存中时,类的实例方法并没有被分配入口地址,只有当该类的对象创建以后,实例方法才分配了入口地址。从而实例方法可以被类创建的所有对象调用,还有一点需要注意,当我们创建第一个类的对象时,实例方法的入口地址会完成分配,当后续在创建对象时,不会再分配新的入口地址,也可以说,该类的所有对象共享实例方法的入口地址,当该类的所有对象被销毁,入口地址才会消失。
2)类方法
当类的字节码文件加载到内存,类方法的入口地址就会分配完成,所以类方法不仅可以被该类的对象调用,也可以直接通过类名完成调用。类方法的入口地址只有程序退出时消失。
因为类方法的入口地址的分配要早于实例方法的入口地址分配时间,所有在定义类方法和实例方法是有以下规则需要遵循:
2.1 在类方法中不能引用实例变量
实例变量的定义类似实例方法,没有用static修饰的变量,实例变量的创建与实例方法的创建相同,也是在类的对象创建时完成,所以在类方法中是不能引用实例变量的,因为这个时候实例变量还没有分配内存地址。
2.2 在类方法中不能使用super和this关键字
这是因为super和this都指向的是父类和本类的对象,而在类方法中调用的时候,这些指代的对象有可能都还没有创建。
2.3 类方法中不能调用实例方法
原因同1。
与类方法相比,实例方法的定义就没有什么限制了:
a. 实例方法可以引用类变量和实例变量
b. 实例方法可以使用super和this关键字
c. 实例方法中可以调用类方法
八、static代码块
static代码块也叫静态代码块,用于类属性的初始化。Static代码块,可以有多个,它不在任何的方法体内,JVM加载类时会执 行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。

本站所有文章均来自互联网,如有侵权,请联系站长删除。极客文库 » 欢迎来到类、内部类、匿名内部类的世界
分享到:
赞(0)

评论抢沙发

评论前必须登录!