------- android培训、java培训、期待与您交流! ----------
1. 内部类的概括。
把一个类中定义在另一个类,这个类就叫做:内部类,或者是嵌套类,内置类.
定义内部类的原则:描述事物的同时还有内部事物,此事物内部类,内部事物访问外部事物。
2. 内部类之间的调用关系
2-1.内部类和外部类之间的理论调用
1. 内部类访问外部类的成员,可以直接访问,包括私有成员----因为内部类中持有一个外部类的引用,格式:外部类名.this
2.外部类访问内部类必须通过内部类的对象进行访问内部类的成员。
3.要是在其他的类中调用内部类成员切内部类不是私有,先获得内部类对象,内部类对象获得的方式:外部类.内部类 名称=外部类对象.内部类对象,例如:(Outer.Innerin=new Outer().new Inner())
2-2.内部类与外部类之间公共变量,局部变量之间的调用
1.外部类和内部类调用的是名称不相同的变量
public class Outer {
private int x = 3;
class Inner {
private String name="zhangsan";
/**
* 内部类之间方法外部类的私有成员变量
*/
public void show() {
System.out.println("这是内部类中的方法");
System.out.println("直接方法外部类中的成员变量:"+x);
}
}
/**
* 在外部类访问内部类的成员
*/
public void function(){
Inner inter=new Inner();
System.out.println("在外部类调用内部类的私有属性:"+inter.name);
}
}
public class Text {
public static void main(String[] args) {
Outer.Inner in=new Outer().new Inner();//在其他类中实例化内部类对象
in.show();
new Outer().function();//调用外部类方法
}
}
结果:这是内部类中的方法
直接方法外部类中的成员变量:3
在外部类调用内部类的私有属性:zhangsan
2.内部类和外部类调用相同名称的变量。(内部类默认权限)
public class Outer {
private int x = 3;
class Inner {
private int x=10;
/**
* 内部类和外部类有相同名称的变量,和方法中的局部变量的名称相同
*/
public void show() {
int x=20;//局部变量
System.out.println("直接方法局部变量:"+x);
System.out.println("访问内部类的相同名称的成员:"+this.x);
System.out.println("访问外部类的相同名称的成员:"+Outer.this.x);
}
}
}
public class Text {
public static void main(String[] args) {
Outer.Inner in=new Outer().new Inner();//在其他类中实例化内部类对象
in.show();
}
}
结果: 直接方法局部变量:20 访问内部类的相同名称的成员:10 访问外部类的相同名称的成员:3 |
3.静态内部类(用static修饰内部类)。
3-1.静态内部类只能调用外部类的静态成员(static修饰的)。
3-2.外部其他类访问静态内部类的非静态成员,
New 外部类.内部类().非静态成员
外部类其他类访问静态内部类的静态成员
New 外部类.内部类.静态成员
public class Outer {
static class Inner {
public static String name = "张三";
public void show() {
System.out.println("静态内部类的非静态成员");
}
}
}
public class Text {
public static void main(String[] args) {
new Outer.Inner().show();// 外部类其他类访问静态内部类的非静态成员
System.out.println(Outer.Inner.name);// 外部类其他类访问静态内部类的静态成员
}
}
3-3.当内部类中定义了静态成员,该内部类必须是静态的。
当外部类中的静态方法调用内部类的时候,内部类必须是静态的。
public class Outer {
static class Inner {
public void show() {
System.out.println("show()");
}
}
public static void function(){
new Inner().show();//这里会编译出错,
//因为,此静态的方法只要是类一加载,那么此方法就会生成,
//但是内部类是默认权限,不是外部类的静态成员,此时外部类一加载,
//此内部类不会加载,但是外部类的静态方法却调用了此内部类,所以会出错,
//解决方法是:把内部类定义成静态的
}
}
3-4:内部类定义在局部时。
不能被成员修饰符修饰(static ),因为方法中不能定义成员,只能定义局部变量,同时此时的内部类就不能定义静态的变量。
不能访问他所在的局部中的的成员,但是此成员必须被final修饰。
public class Outer {
class Inner {
public void show() {
final int x=1;
class aa{
public void func(){
System.out.println(x);
}
}
new aa().func();
}
}
}
4.匿名内部类。
4-1.匿名内部类的概念
匿名内部类就是内部类的一种简化书写。
4-2.匿名内部类的书写和前提。
1.要向书写内部类,此类必须继承一个类或者是接口。
2.内部类的格式:new 父类或者是接口(){子类的内容}
3.其实匿名内部类其实就是一个子类的对象。
4.一个内部类中最多重写三个方法,多了最好定义一个类,然后继承父类。
4-3.匿名内部类的优点和缺点。
匿名内部类简化了代码,但是代码的阅读性比较差。
4-4.匿名内部类的结构图。
带名字的匿名内部类
abstract class ABC {
public abstract void show();
}
public class Outer {
public void method() {
ABC news=new ABC() {
public void show() {// 重新show()方法
System.out.println("show");
}
};
news.show();// 调用show()方法
}
}
4-5.匿名内部类小测试
interface Inter {
void method();
}
class Test {
static Inter function(){
return new Inter(){
public void method(){
System.out.println("method"); //这是补充的代码
}
};
}
}
public class InnterClassText {
public static void main(String[] args) {
Test.function().method();
}
}
4-6.匿名内部类的常见形式。
interface Inter {
void method();
}
public class InnterClassText {
public static void main(String[] args) {
show(new Inter(){
public void method(){
System.out.println("show run");
}
});//使用匿名内部类作为show方法的传入的参数
}
public static void show(Inter in){
in.method();
}
}
4-7.小转脑筋题。
假如一个类没有父类也没有实现接口,那么它可以定成内部类吗?请思考!
首先答案是肯定的,可以这样写。使用Object类。
public class InnterClassText {
public static void main(String[] args) {
new Object() {
public void function() {
System.out.println("helloworld");
}
}.function();
}
}
但是如果是这样的话,就不正确了!
public class InnterClassText {
public static void main(String[] args) {
Object oo=new Object() {
public void function() {
System.out.println("hello world");
}
};
oo..function();//在这里会出错,因为在java虚拟机中没有给Object类中没有funtion()方法
}
}
------- android培训、java培训、期待与您交流! ----------