黑马程序员_内部类
2014-01-12 19:08
260 查看
------- android培训、java培训、期待与您交流!
----------
内部类(内置类、嵌套类)
1.内部类:如果A类需要直接访问B类中的成员,而B类又需要建立A类的对象。这时,为了方便设计和访问,直接将A类定义在B类中。就可以了。A类就称为内部类。内部类可以直接访问外部类中的成员。而外部类想要访问内部类,必须要建立内部类的对象。
2.内部类的访问规则:
1).内部类可以直接访问外部类中的成员,包括私有,是因为内部类中持有了一个外部类的引用,格式:外部类名.this。
2).外部类要访问内部类,必须建立内部类对象。
例子:
classOuter{
int num = 4;
class Inner {
void show(){
System.out.println("inner show run "+num);
}
}
public void method(){
Inner in = new Inner();//创建内部类的对象。
in.show();//调用内部类的方法。
}
}
3.访问格式:
1),默认修饰符:当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中。
可以直接建立内部类对象。
格式:外部类名.内部类名
变量名= 外部类对象.内部类对象;
Eg:Outer.Innerin = new Outer().new Inner();
2),当内部类在成员位置上,就可以被成员修饰符所修饰。
比如,private修饰符:将内部类在外部类中进行封装。
static修饰符:内部类就具备static的特性。
当内部类被static修饰后,只能直接访问外部类中的static成员。出现
了访问局限。
在外部其他类中,如何直接访问static内部类的非静态成员呢?
newOuter.Inner().function();
在外部其他类中,如何直接访问static内部类的静态成员呢?
uter.Inner.function();
注意:当内部类中定义了静态成员,该内部类必须是static的。
当外部类中的静态方法访问内部类时,内部类也必须是static的。
4.内部类定义的原则
当描述事物时,事物的内部还有事物,该事物用内部类来描述。
因为内部事务在使用外部事物的内容。
5.内部类编译后的文件名为:“外部类名$内部类名.java”;
6.内部类定义在局部时:
①不可以被成员修饰符所修饰。
②可以直接访问外部类中的成员,因为还持有外部类中的引用,但是不可以访问他所在的局部中的变量,只能访问被final修饰的局部变量。
例子:
class Outer
{
int x = 3;
void method(final int a)
{
final int y = 4;
class Inner
{
void function()
{
System.out.println(y);
}
}
new Inner().function();
}
}
class InnerClassDemo
{
public static void main(String[] args)
{
Outer out = new Outer();
out.method(7);//4
out.method(8);//4
}
}
7.匿名内部类:
1).匿名内部类其实就是内部类的简写形式。
2)定义匿名内部类的前提:内部类必须是继承一个类或者实现接口.
3).匿名内部类的格式:new
父类或者接口(){定义子类的内容}
定义格式:
接口名变量 = new
接口名(){
覆盖抽象方法
};
变量.方法名();
4).其实匿名内部类就是一个匿名子类对象,而且这个对象有点胖,可以理解为有内容的对象。
5).匿名内部类中定义的方法最好不要超过3个
例子:
abstract class AbsDemo
{
abstract void show();
}
class Outer
{
int x = 3;
public void function()
{
AbsDemo d = new AbsDemo()
{
int num = 9;
void show()
{
System.out.println("num==="+num);
}
void abc()
{
System.out.println("haha");
}
};
d.show();
}
}
class InnerClassDemo3
{
public static void main(String[] args)
{
new Outer().function();//9
}
}
6).匿名内部类的使用场景:
当函数的参数是接口类型引用时,如果接口中的方法不超过3个。可以通过匿名内部类来完成参数的传递。
其实就是在创建匿名内部类时,该类中的封装的方法不要过多,最好两个或者两个以内。
8.小练习
练习一:1和2的写法正确吗?有区别吗?说出原因。
//1
new Object(){
void show(){
System.out.println("showrun");
}}.show();
//2
Object obj = new Object(){
void show(){
System.out.println("showrun");
}};
obj.show();
1和2的写法是正确,1和2都是在通过匿名内部类建立一个Object类的子类对象。
两者之间的区别:
第一个可是编译通过,并运行。
第二个编译失败,因为匿名内部类是一个子类对象,当用Object的obj引用指向时,就被提升为了Object类型,而编译时检查Object类中是否有show方法,所以编译失败。
练习二:通过匿名内部类补足Outer类中的代码。
interface Inter{
void show();
}
class Outer{//通过匿名内部类补足Outer类中的代码。
public static Inter method(){
return new Inter(){
publicvoid show(){}
};
}
}
class InnerClassDemo7 {
public staticvoid main(String[] args) {
Outer.method().show();
}
}
Outer.method():意思是:Outer中有一个名称为method的方法,而且这个方法是静态的。
Outer.method().show():当Outer类调用静态的method方法运算结束后的结果又调用了show方法,意味着:method()方法运算完一个是对象,而且这个对象是Inter类型的。
------- android培训、java培训、期待与您交流!
----------
----------
内部类(内置类、嵌套类)
1.内部类:如果A类需要直接访问B类中的成员,而B类又需要建立A类的对象。这时,为了方便设计和访问,直接将A类定义在B类中。就可以了。A类就称为内部类。内部类可以直接访问外部类中的成员。而外部类想要访问内部类,必须要建立内部类的对象。
2.内部类的访问规则:
1).内部类可以直接访问外部类中的成员,包括私有,是因为内部类中持有了一个外部类的引用,格式:外部类名.this。
2).外部类要访问内部类,必须建立内部类对象。
例子:
classOuter{
int num = 4;
class Inner {
void show(){
System.out.println("inner show run "+num);
}
}
public void method(){
Inner in = new Inner();//创建内部类的对象。
in.show();//调用内部类的方法。
}
}
3.访问格式:
1),默认修饰符:当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中。
可以直接建立内部类对象。
格式:外部类名.内部类名
变量名= 外部类对象.内部类对象;
Eg:Outer.Innerin = new Outer().new Inner();
2),当内部类在成员位置上,就可以被成员修饰符所修饰。
比如,private修饰符:将内部类在外部类中进行封装。
static修饰符:内部类就具备static的特性。
当内部类被static修饰后,只能直接访问外部类中的static成员。出现
了访问局限。
在外部其他类中,如何直接访问static内部类的非静态成员呢?
newOuter.Inner().function();
在外部其他类中,如何直接访问static内部类的静态成员呢?
uter.Inner.function();
注意:当内部类中定义了静态成员,该内部类必须是static的。
当外部类中的静态方法访问内部类时,内部类也必须是static的。
4.内部类定义的原则
当描述事物时,事物的内部还有事物,该事物用内部类来描述。
因为内部事务在使用外部事物的内容。
5.内部类编译后的文件名为:“外部类名$内部类名.java”;
6.内部类定义在局部时:
①不可以被成员修饰符所修饰。
②可以直接访问外部类中的成员,因为还持有外部类中的引用,但是不可以访问他所在的局部中的变量,只能访问被final修饰的局部变量。
例子:
class Outer
{
int x = 3;
void method(final int a)
{
final int y = 4;
class Inner
{
void function()
{
System.out.println(y);
}
}
new Inner().function();
}
}
class InnerClassDemo
{
public static void main(String[] args)
{
Outer out = new Outer();
out.method(7);//4
out.method(8);//4
}
}
7.匿名内部类:
1).匿名内部类其实就是内部类的简写形式。
2)定义匿名内部类的前提:内部类必须是继承一个类或者实现接口.
3).匿名内部类的格式:new
父类或者接口(){定义子类的内容}
定义格式:
接口名变量 = new
接口名(){
覆盖抽象方法
};
变量.方法名();
4).其实匿名内部类就是一个匿名子类对象,而且这个对象有点胖,可以理解为有内容的对象。
5).匿名内部类中定义的方法最好不要超过3个
例子:
abstract class AbsDemo
{
abstract void show();
}
class Outer
{
int x = 3;
public void function()
{
AbsDemo d = new AbsDemo()
{
int num = 9;
void show()
{
System.out.println("num==="+num);
}
void abc()
{
System.out.println("haha");
}
};
d.show();
}
}
class InnerClassDemo3
{
public static void main(String[] args)
{
new Outer().function();//9
}
}
6).匿名内部类的使用场景:
当函数的参数是接口类型引用时,如果接口中的方法不超过3个。可以通过匿名内部类来完成参数的传递。
其实就是在创建匿名内部类时,该类中的封装的方法不要过多,最好两个或者两个以内。
8.小练习
练习一:1和2的写法正确吗?有区别吗?说出原因。
//1
new Object(){
void show(){
System.out.println("showrun");
}}.show();
//2
Object obj = new Object(){
void show(){
System.out.println("showrun");
}};
obj.show();
1和2的写法是正确,1和2都是在通过匿名内部类建立一个Object类的子类对象。
两者之间的区别:
第一个可是编译通过,并运行。
第二个编译失败,因为匿名内部类是一个子类对象,当用Object的obj引用指向时,就被提升为了Object类型,而编译时检查Object类中是否有show方法,所以编译失败。
练习二:通过匿名内部类补足Outer类中的代码。
interface Inter{
void show();
}
class Outer{//通过匿名内部类补足Outer类中的代码。
public static Inter method(){
return new Inter(){
publicvoid show(){}
};
}
}
class InnerClassDemo7 {
public staticvoid main(String[] args) {
Outer.method().show();
}
}
Outer.method():意思是:Outer中有一个名称为method的方法,而且这个方法是静态的。
Outer.method().show():当Outer类调用静态的method方法运算结束后的结果又调用了show方法,意味着:method()方法运算完一个是对象,而且这个对象是Inter类型的。
------- android培训、java培训、期待与您交流!
----------
相关文章推荐
- 黑马程序员——学习日志6面向对象(多态,内部类,异常,访问权限)
- 黑马程序员——JAVA基础---匿名内部类
- 黑马程序员_内部类
- 黑马程序员------面向对象(No.7)(内部类、异常概述、异常try-catch、异常声明throws、多异常处理)
- 黑马程序员——(五)内部类
- 黑马程序员—面向对象(static,封装,继承,多态,内部类,抽象类,接口)总结
- 黑马程序员-内部类
- 黑马程序员--内部类
- 黑马程序员_Java基础Day09(上)_内部类(Done)
- 黑马程序员-面向对象 多态,内部类
- 黑马程序员——内部类的理清
- 黑马程序员 非静态情况下内部类调用规则
- 黑马程序员--内部类
- 黑马程序员_基础复习07_内部类
- 黑马程序员——【Java基础】——面向对象(一)概述、类与对象、继承、抽象类、接口、多态、内部类
- 黑马程序员--内部类
- 黑马程序员——基础学习(六)内部类与包
- 黑马程序员一内部类的改进思路
- 黑马程序员_Object和内部类
- 黑马程序员_构造内部类对象