---------------------android培训、java培训、java学习型技术博客、期待与您交流! -------------------
今天是在传智学习的第十一天了,今天讲的内容主要的是内部类和包。
内部类是指定义在类内部类的类,按特性可以分为非静态成员内部类、局部内部类、静态内部类和匿名内部类。
非静态成员内部类和局部内部类昨天已讲过了,今天就不做总结了。
1、静态内部类
用static修饰的内部类叫做静态内部类,如果一个类用static修饰,这个类就相当于是一个外部定义的类,所以static的内部类中可声明satic成员或非静态成员,并且可以通过public、protected、private修饰。
例如下面这段代码,就是表示一个静态内部类。
class Outer {
private static int num = 10;
static class Inner {
public void print(){
int age = 24;
System.out.println(num);
System.out.println(age);
}
}
}
静态内部类只能访问外部类的静态成员,非静态成员无法访问,可以访问内部类的非静态方法。
注:生成一个静态内部类不需要外部类成员,这是静态内部类和成员内部类的区,静态内部类的对象可以直接生成:
Outer.Inner i = Outer.new Inner();
//与调用静态成员一样,可以直接用类名调用,但是一般不会这么写,会把new放在前在,一般的写法如下:
Outer.Inner i = new Outer.Inner();
2、匿名内部类
匿名内部类就是没有名字的内部类,是没有构造器的。
注意:如果匿名内部类继承了一个含有带参数构造器的父类,则创建它的时候,必须要带上参数,并且在实现的过程中用super关键字调用相应的内容。
匿名内部类可以做为实际参数进行传递,在多线程实现接口的时候,就要把类的匿名对象做为实际参数传给Thread的构造函数。
匿名内部类不能定义任何静态成员、方法和类,并且不能用public、protected、private、static修饰。
定义匿名内部类的前提:
内部类必须是继承一个类或者实现接口。
匿名内部类的格式:
new 父类或者接口{定义子类的内容}
3、包
在java中,可以用包来解决重名的问题
a、创建包
在java中用关键字package来创建包,必须放在源代码第一行
package com.itheima;
public class Demo{
public static void main(String[] args){
}
}
声明包名,须注意以下几点:
1、包名最好有意义,一般是组织名倒置
2、全部为小写
3、放在源码第一行
b、导入包
在源码中用import导入包,导入包的时候,最好是需要哪个类就导入哪个类,不要用*,用*通配的时候,如果当前包中有同名的类,会优先导入当前包中的类,而不是指定包中的类,可能会发生不可预料的异常。
c、编译并生成包
带有包的类的源代码,在编译成字节码时,不能直接用javac.exe编译,需要带上"-d"这个参数带编译。
在当前目录下生成包,如
javac -d . Demo.java
在指定目录下生成包,如
javac -d 指定目录 Demo.java
注:有包的类不能访问无包的类,无包的类可以访问有包的类。