一、Java的内部类

1.成员内部类

成员内部类是最普通的内部类,它的定义为位于另一个类的内部。
  1. class Circle {
  2. double radius = 0;
  3. public Circle(double radius) {
  4. this.radius = radius;
  5. }
  6. //内部类
  7. class Draw {
  8. public void drawSahpe() {
  9. System.out.println("drawshape");
  10. }
  11. }
  12. }

这样看起来,类Draw像是类Circle的一个成员,Circle称为外部类。成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)。
  1. class Circle {
  2. private double radius = 0;
  3. public static int count =1;
  4. public Circle(double radius) {
  5. this.radius = radius;
  6. }
  7. //内部类
  8. class Draw {
  9. public void drawSahpe() {
  10. System.out.println(radius); //外部类的private成员
  11. System.out.println(count); //外部类的静态成员
  12. }
  13. }
  14. }

2.局部内部类

  1. 局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。<br />** 注**: 局部内部类就像是方法里面的一个局部变量一样,不能有 publicprotectedprivate 以及 static 修饰符。
  1. class People{
  2. public People() {
  3. }
  4. }
  5. class Man{
  6. public Man(){
  7. }
  8. public People getWoman(){
  9. //局部内部类
  10. class Woman extends People{
  11. int age =0;
  12. }
  13. return new Woman();
  14. }
  15. }

3.匿名内部类

  1. 匿名内部类应该是平时我们编写代码时用得最多的,在编写事件监听的代码时使用匿名内部类不但方便,而且使代码更加容易维护。
  1. scan_bt.setOnClickListener(new OnClickListener() {
  2. @Override
  3. public void onClick(View v) {
  4. // TODO Auto-generated method stub
  5. }
  6. });
  7. history_bt.setOnClickListener(new OnClickListener() {
  8. @Override
  9. public void onClick(View v) {
  10. // TODO Auto-generated method stub
  11. }
  12. });

4.静态内部类

  1. 静态内部类也是定义在另一个类里面的类,只不过在类的前面多了一个关键字static。静态内部类不需要依赖于外部类,这点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法,这点很好理解,因为在没有外部类的对象的情况下,可以创建静态内部类的对象,如果允许访问外部类的非static成员就会产生矛盾,因为外部类的非static成员必须依附于具体的对象。
  1. public class Test {
  2. public static void main(String[] args) {
  3. Outter.Inner inner = new Outter.Inner();
  4. }
  5. }
  6. class Outter {
  7. public Outter() {
  8. }
  9. static class Inner {
  10. public Inner() {
  11. }
  12. }
  13. }

二、Java的实例化的实例方法(测试类)和类的构造函数(学生类)

1.实例化的概念:

  1. Java的实例化相当于定义一个对象的专属名称,通过实例化,我们可以将这个对象的属性和方法放进去(ps:就比如人分很多种,我们需要给这个人取一个名字,这样我们看到这个名字的时候就能想起这个人是谁,然后在往这个存放他的各种信息,比如身份证号,手机号住址信息等等)

2.实例化的测试类:

(1)Student st;表示在栈中声明了一个名为st的引用变量
(2)new Student();表示对学生类进行了实例化,即在堆中新建了一个对象,并调用构造方法进行初始化。
(3)括号中之所以有参数,是因为构造方法有参,写进的参数将传递给构造方法中的形参。
(4)如果想括号里无参,那么将无参构造也写上。因为如果没写构造器,那么编译器会默认创建一个无参。倘若写了有参,编译器就不再默认创建无参了,需手动添加。
(5)= 表示将堆中对象的地址值传递给栈中的变量st,此时st就可以调用学生类成员中的属性和方法,格式是st.xxx

代码如下:
  1. public class Test {
  2. public static void main(String[] args) {
  3. //这就是实例化过程
  4. Student st = new Student("Tom猫",5);
  5. System.out.println(st.name+st.age+"岁了");
  6. }
  7. }

3.类的构造方法:

  1. 类的构造方法就是定义一个类里面定义它的构造方法,它的构造方法名就是类名,然后在类定义的变量,需要在创建的构造函数内实例化。(ps:因为类里面有一个默认的构造函数,它默认定义的值为空。)

4.构造函数的学生类:

(1)以this.name=name;为例,this.name 表示调用成员变量name,后面的name表示形参的值,即我们在测试类中赋的值。
(2)倘若直接在构造方法内部给this.name赋值,如this.name="张三",则优先执行在构造器内部赋的值。此时结果就是张三,而不是汤姆猫了。
(3)成员变量有默认值,引用类型是null,值类型是0,布尔类型是false。

代码如下:
  1. public class Student {
  2. String name;
  3. int age;
  4. public Student(String name,int age){
  5. System.out.println("这是有参构造");
  6. this.name=name;
  7. this.age=age;
  8. }
  9. }