黑马程序员-- 五、内部类
2014-01-12 17:40
316 查看
----------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
java中根据位置的不同,内部类分为啦四种:
静态内部类:
1.使用static 修饰,声明在类体中。
2.静态内部类可以访问外部类的静态成员。
成员内部类:
1.声明在类体中,不使用static,具有类的成员特征,也就是,必须具有类的实例才能创建内部类的实例。
2.内部类实例可以访问共享外部类的成员变量(很常用)
特点:
当内部类定义在外部类的成员位置上时,可以用成员修饰符修饰,遵循修饰符的规则,即具备成员的特性,又具备类的特性,可以继承和被继承。
局部内部类
把类声明在方法中就是局部内部类,类似于局部变量。
特点:
定义在局部,不可以被成员修饰符修饰,遵循局部顺序调用规则,遵循局部生命周期,具备类的特性,可以继承和被继承。
访问规则:
访问规则:当访问局部的变量时,局变量必须被final修饰。因为局部内部类的成员比就不变量的生命周期长。
匿名内部类
1.匿名类,非常常见,可以写在任何地方,就像一般的语句。
2.语法更像是创建对象,Date d = new Date();
3.匿名类是对原类的一个继承,同时创建了实例,{}就是继承以后的类体,类体中可使用所有类的语法。
4.匿名类不能写构造器。
5.匿名类可以从抽象类或者接口继承,必须提供抽象方法的实现。
详解:
|---外部类访问规则:
1、 内部类可以直接访问外部类的成员,包括私有成员:(外部类.this.)成员,
|---内部类中有同名成员的情况:
|---调用内部类成员:this.成员。
|---调用外部同名成员:外部类.this.成员。
|---原理:内部类持有外部类的引用。
2、 外部类要访问内部类的非静态成员,必须建立内部类的对象才能访问。
|---原因:内部类成员被封装在类中,想要访问必须通过对象访问。
import org.junit.Test;
public class ClassDemo {
String s = "外部类成员";
class Inner{
String s = "内部类同名成员";
void show(){
<
4000
p>String s = "局部同名成员";
System.out.println(s);//此处调用的是局部的
System.out.println(this.s);//此处调用的是内部类的
System.out.println(ClassDemo.this.s);//访问外部类成员,省略ClassDemo.this
}
}
@Test
void test(){
new Inner().show();//访问内部类成员
}
}
|---外部其他类访问规则:
1、 当成员内部类非私有时,可以直接在外部其他类中直接建立对象使用。外部类.内部类 标识符 = new 外部类().new 内部类();
2、 当内部类访问外部其他类时,和普通一样需要建立外部其他类对象访问。
|---使用:当描述事物时,该事物的内部还有事物,内部的事物用内部类描述。
import org.junit.Test;
class Onter {
class Inner{
String s = "内部类成员";
void show(){
System.out.println(s);//此处调用的是局部的
}
}
}
public class ClassDemo{
@Test
public void test(){
System.out.println("外部其他类访问内部类成员");
new Onter().new Inner().show();//外部其他类访问内部类成员
}
}
注:内部类有静态成员,内部类也必须是静态的,遵循静态的规则,静态只能访问静态。局部内部类不具备成员特性,不能被成员修饰符修饰,所以局部内部类不能有静态成员。
|---匿名内部类:必须继承类或实现接口,匿名内部类实质是匿名子类的对象。
|---定义格式:new 父类(){定义子类内容}。
|--特点:同普通对象相同,可以赋值给父类引用,可以定义自己的方法并调用。
|---定义位置:常用于方法体中、方法实参处。
注:匿名内部类厂用于定义临时的功能,用过后销毁,所以通常不会给父类引用赋值,直接调用方法使用,所以定义的方法最好不超过三个。
|---源码示例:
import org.junit.Test;
public class ClassDemo{
@Test
public void test(){
new Inner(){//匿名内部类继承内部类Inner
void show(){
System.out.println("匿名内部类重写的方法");
}
}.show();
new Onter(){//匿名内部类继承外部其他类Onter
}.show();
new Inter(){//匿名内部类实现内部接口
@Override
public void show() {
// TODO Auto-generated method stub
System.out.println("实现内部接口中的方法");
}
}.show();
inter(new Inter() {//调用方法,参数为匿名内部类
@Override
public void show() {
// TODO Auto-generated method stub
System.out.println("参数位置匿名内部类实现内部接口中的方法");
}
});
}
void inter(Inter in){
in.show();
}
class Inner{//内部类
void show(){
System.out.println("内部类");
}
}
interface Inter{
void show();
}
}
class Onter{//外部其他类
void show(){
System.out.println("外部其他类");
}
}
----------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
内部类定义:
内部类是指在一个外部类的内部再定义一个类,内部类可作为外部类的一个成员,并且依附于外部类的一个成员。内部类可为静态,可用protected和private修饰,而外部类只能使用public 和缺省的的包默认访问权限。为什么需要内部类
典型的情况是,内部类继承自某个类或者实现某个接口,内部类的代码操作创建其的外围类的对象,所以你可以认为内部类提供啦某种进入其外围类的窗口,使用内部类最吸引人的原因是:每个内部类都能独立的继承自一个(接口的)实现,,所以无论外围是否已经继承了某个(接口的)实现,对于内部类都没有影响。如果没有内部类提供的可以继承多个具体的或抽象的能力,一些设计与编程问题就很难解决,所以,从这个角度看,内部类使得多重继承的解决方案变得完整,接口解决啦部分问题,而内部类有效的实现啦“多重继承”。java中根据位置的不同,内部类分为啦四种:
静态内部类:
1.使用static 修饰,声明在类体中。
2.静态内部类可以访问外部类的静态成员。
成员内部类:
1.声明在类体中,不使用static,具有类的成员特征,也就是,必须具有类的实例才能创建内部类的实例。
2.内部类实例可以访问共享外部类的成员变量(很常用)
特点:
当内部类定义在外部类的成员位置上时,可以用成员修饰符修饰,遵循修饰符的规则,即具备成员的特性,又具备类的特性,可以继承和被继承。
局部内部类
把类声明在方法中就是局部内部类,类似于局部变量。
特点:
定义在局部,不可以被成员修饰符修饰,遵循局部顺序调用规则,遵循局部生命周期,具备类的特性,可以继承和被继承。
访问规则:
访问规则:当访问局部的变量时,局变量必须被final修饰。因为局部内部类的成员比就不变量的生命周期长。
匿名内部类
1.匿名类,非常常见,可以写在任何地方,就像一般的语句。
2.语法更像是创建对象,Date d = new Date();
3.匿名类是对原类的一个继承,同时创建了实例,{}就是继承以后的类体,类体中可使用所有类的语法。
4.匿名类不能写构造器。
5.匿名类可以从抽象类或者接口继承,必须提供抽象方法的实现。
详解:
|---外部类访问规则:
1、 内部类可以直接访问外部类的成员,包括私有成员:(外部类.this.)成员,
|---内部类中有同名成员的情况:
|---调用内部类成员:this.成员。
|---调用外部同名成员:外部类.this.成员。
|---原理:内部类持有外部类的引用。
2、 外部类要访问内部类的非静态成员,必须建立内部类的对象才能访问。
|---原因:内部类成员被封装在类中,想要访问必须通过对象访问。
import org.junit.Test;
public class ClassDemo {
String s = "外部类成员";
class Inner{
String s = "内部类同名成员";
void show(){
<
4000
p>String s = "局部同名成员";
System.out.println(s);//此处调用的是局部的
System.out.println(this.s);//此处调用的是内部类的
System.out.println(ClassDemo.this.s);//访问外部类成员,省略ClassDemo.this
}
}
@Test
void test(){
new Inner().show();//访问内部类成员
}
}
|---外部其他类访问规则:
1、 当成员内部类非私有时,可以直接在外部其他类中直接建立对象使用。外部类.内部类 标识符 = new 外部类().new 内部类();
2、 当内部类访问外部其他类时,和普通一样需要建立外部其他类对象访问。
|---使用:当描述事物时,该事物的内部还有事物,内部的事物用内部类描述。
import org.junit.Test;
class Onter {
class Inner{
String s = "内部类成员";
void show(){
System.out.println(s);//此处调用的是局部的
}
}
}
public class ClassDemo{
@Test
public void test(){
System.out.println("外部其他类访问内部类成员");
new Onter().new Inner().show();//外部其他类访问内部类成员
}
}
注:内部类有静态成员,内部类也必须是静态的,遵循静态的规则,静态只能访问静态。局部内部类不具备成员特性,不能被成员修饰符修饰,所以局部内部类不能有静态成员。
|---匿名内部类:必须继承类或实现接口,匿名内部类实质是匿名子类的对象。
|---定义格式:new 父类(){定义子类内容}。
|--特点:同普通对象相同,可以赋值给父类引用,可以定义自己的方法并调用。
|---定义位置:常用于方法体中、方法实参处。
注:匿名内部类厂用于定义临时的功能,用过后销毁,所以通常不会给父类引用赋值,直接调用方法使用,所以定义的方法最好不超过三个。
|---源码示例:
import org.junit.Test;
public class ClassDemo{
@Test
public void test(){
new Inner(){//匿名内部类继承内部类Inner
void show(){
System.out.println("匿名内部类重写的方法");
}
}.show();
new Onter(){//匿名内部类继承外部其他类Onter
}.show();
new Inter(){//匿名内部类实现内部接口
@Override
public void show() {
// TODO Auto-generated method stub
System.out.println("实现内部接口中的方法");
}
}.show();
inter(new Inter() {//调用方法,参数为匿名内部类
@Override
public void show() {
// TODO Auto-generated method stub
System.out.println("参数位置匿名内部类实现内部接口中的方法");
}
});
}
void inter(Inter in){
in.show();
}
class Inner{//内部类
void show(){
System.out.println("内部类");
}
}
interface Inter{
void show();
}
}
class Onter{//外部其他类
void show(){
System.out.println("外部其他类");
}
}
----------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
相关文章推荐
- 黑马程序员_学习记录09:内部类
- 黑马程序员 第20天 内部类
- 黑马程序员_内部类小结
- 黑马程序员—内部类
- 黑马程序员--内部类
- 黑马程序员_内部类的总结
- 黑马程序员_内部类
- 黑马程序员--面向对象学习---接口、多态、内部类、异常
- 黑马程序员---Java匿名内部类使用
- 黑马程序员_内部类总结
- 黑马程序员_内部类和异常的练习
- 黑马程序员 匿名内部类 异常
- 黑马程序员--Java学习14--多态和内部类
- 黑马程序员_关于内部类和外部类的调用关系
- 黑马程序员—内部类、匿名内部类
- 黑马程序员 Java基础<二>---> 继承、内部类与多态,包
- 黑马程序员——面向对象18:内部类
- 黑马程序员——Java---匿名内部类
- 黑马程序员java基础匿名内部类
- 黑马程序员---关于Java中的内部类