Java中内部类
内部类的规则:
1.内部类能够直接訪问外部类中的成员,包含私有。
之所以能够直接訪问外部类中的成员,是由于内部类中持有一个外部类的引用,格式:外部类名.this
2.外部类要訪问内部类。必须建立内部类对象
訪问格式:
1.当内部类定义在外部类的成员位置了,并且非私有,能够在外部其他类中。
能够直接建立内部类对象。
格式:
外部类类名.内部类名 变量名= new 外部类对象.new 内部类对象。
Outer.inner out = new Outer().new inner();
2.当内部类在成员位置上,就能够被成员修饰符所修饰。
比方private:将内部类在外部类中进行封装。
static:内部类就具备了static的特性。
当内部类被static 修饰后。仅仅能訪问外部类中的static成员。
出现了訪问局限。
在外部其他类中,怎样訪问static内部类的非静态成员:
new Outer2.inner().funciton();
在外部其他类中,怎样訪问static内部类的静态成员:
Outer2.inner.funciton();
注意:当内部类中的定义了static成员,该内部类必须是静态的。
当外部类中的静态方法訪问内部类时。内部类也必须是静态的。
当描写叙述事物时,事物的内部还有事物。该事物用内部类来描写叙述
由于内部事务在使用外部使用的内容。
class Body{
private class XinZang //心脏不正确外暴露
{
}
public void show()
{
new XinZang();
}
}
定义内部类主要为了訪问外部类的数据
成员内部类代码:
package com.heima.io;
class Outer {
private int i = 3;
class inner {
private int i = 4;
// 内部类能够定义为私有,由于他是外部类的成员
void funciton() {
System.out.println(Outer.this.i);
}
}
}
public class InnerClassDemo {
public static void main(String[] args) {
// 直接訪问内部类中的成员
Outer.inner out = new Outer().new inner();
out.funciton();
}
}
静态内部内代码:
package com.heima.inner;
import com.heima.inner.Outer.inner;
class Outer2 {
private static int i = 3;
static class inner {
// 在静态内部中,无法訪问外部类非static数据
static void funciton() {
System.out.println("inner:" + " " + i);
}
}
}
public class InnerClassDemo2 {
public static void main(String[] args) {
Outer2.inner.funciton();
}
}
局部内部类:
内部类定义在局部时。
1.不能够被成员修饰符修饰
2.能够直接訪问外部类中的成员,由于还持有外部类中的引用。
可是不能够訪问訪问它所在的局部中(方法中)的变量。仅仅能訪问被final修饰的局部变量。
package com.heima.inner;
/**
* 局部内部类
*
* @author zp
*
*/
class Outer3 {
int i = 5;
void method(final int a) {
//final int i=3;//局部内部类中訪问局部变量,须要被声明终于类型
class Inner {
int i=4;
void funtion() {
System.out.println(a);//4
}
}
new Inner().funtion();
}
}
public class InnerClassDemo3 {
public static void main(String[] args) {
Outer3 out = new Outer3();
out.method(7);
out.method(8);
}
}
匿名内部类:
1.匿名内部类事实上就是内部类简写格式。
2.定义匿名内部类的前提:
内部类必须继承一个类或者实现一个接口。
3.匿名内部类的格式: new 父类 或者 接口(){定义子类的内容}.
4.事实上匿名内部类就是一个匿名子类对象。
并且有点胖。能够理解为带内容的对象,匿名对象对方法仅仅能调用一次。
5.匿名内部类中定义的方法最好不要超过3个。
匿名内部类代码:
package com.heima.inner;
/**
* 匿名内部类
*
* @author
*
*/
abstract class AbsDemo {
abstract void show();
}
class Outer4 {
public void function() {
final int a = 3;//匿名内部类中訪问局部变量须要加入修饰符final
new AbsDemo() {// 匿名实现类,AbsDemo的子类对象
@Override
void show() {
System.out.println("show()" + a);
}
void abc() {
System.out.println("abc()");
}
}.show();
}
}
public class InnerClassDemo4 {
public static void main(String[] args) {
new Outer4().function();
}
}
package com.heima.inner;
interface Inter {
public void method();
}
class Test {
public static Inter function() {
return new Inter() {
@Override
public void method() {
System.out.println("avcs");
}
};
}
}
public class InnerClassDemo5 {
public static void main(String[] args) {
// Test.function():Test类中有一个静态的方法叫做function(),
// function这种方法运算结果后返回的是一个对象
Test.function().method();
new Object() {//创建一个Object子类 假设Object obj =new Object(){};这样写是错的。由于Object没有show();
public void show() {
System.out.println("abc");
}
}.show();
}
}
posted on 2019-05-11 08:05 xfgnongmin 阅读(111) 评论(0) 编辑 收藏 举报