----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
内部类
可以将一个类的定义放在另一个类的内部,这就是内部类。
内部类是一个非常有用的特性,它允许把一些逻辑相关的类组织在一起,并控制位于内部的可性。
class Outer
{ private int x = 3;
class Inner//内部类
{
//int x = 4;
void function()
{
//int x = 6;
System.out.println("innner :"+Outer.this.x);
}
}
void method()
{
Inner in = new Inner();
in.function();
}
}
class InnerClassDemo
{
public static void main(String[] args)
{
Outer out = new Outer();
out.method();
//直接访问内部类中的成员。
// Outer.Inner in = new Outer().new Inner();
// in.function();
}
}
Inner就是一个内部类,Outer是一个外部类。
内部类产生的原因
package itcast.heima;
class D{}
abstract class E{}
class Z extends D{
E makeE(){
return new E(){};
}
}
public class TestDemo {
static void takesD(D d){}
static void takesE(E e){}
public static void main(String[] args) {
Z z = new Z();
takesD(z);
takesE(z.makeE());
}
}
此处类Z中的,new E(){}就是一个内部类。如果不这样定义,而是通过外部类Z来实现。类Z就得同时继承D和E,这在语法上就是错误的。所以说内部类解决了“多重继承” 的问题。
好处在于:每个内部类都能独立的继承一个接口或实现,而不用担心外部类是否已经继承了某个接口或实现。并且一个外部类中可以同时有多个内部类,这些内部类相互独立,各有各的属性和行为,同时它们都能调用外部类的信息。
内部类的访问规则
1,内部类可以直接访问外部类中的成员,包括私有。之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用,格式为外部类名.this。
2,外部类要访问内部类,必须建立内部类对象。
内部类的访问格式
1,当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中。可以直接建立内部类对象。
格式:外部类名.内部类名 变量名 = 外部类对象.内部类对象;
Outer.Inner in = new Outer().new Inner();
2,当内部类在成员位置上,就可以被成员修饰符所修饰。
private:将内部类在外部类中进行封装。
static:内部类就具备static的特性。当内部类被static修饰后,只能直接访问外部类中的static成员。出现了访问局限。
在外部其他类中,访问static内部类的非静态成员
new Outer.Inner().function();
在外部其他类中访问static内部类的静态成员
Outer.Inner.function();
注意:当内部类中定义了静态成员,该内部类必须是static的。
当外部类中的静态方法访问内部类时,内部类也必须是static的。
当描述事物时,事物的内部还有事物,该事物用内部类来描述。
因为内部事务在使用外部事物的内容。
3,内部类定义在局部时
(A) 不可以被成员修饰符修饰,因为成员修饰符只能修饰成员,而不能修饰局部。
(B) 可以直接访问外部类中的成员,因为还持有外部类中的引用。但是不可以访问它所在的
局部中的变量。只能访问被final修饰的局部变量。
class Outer
{
int x = 3;
void method(final int a)
{
final int y = 4;//y被final修饰。
class Inner
{
void function()
{
System.out.println(y);//y已被final修饰。可以被内部类调用。
}
}
new Inner().function();
}
}
匿名内部类
1,匿名内部类其实就是内部类的简写格式。
2,定义匿名内部类的前提:内部类必须是继承一个类或者实现接口。
3,匿名内部类的格式: new 父类或者接口(){定义子类的内容}
4,其实匿名内部类就是一个匿名子类对象。而且这个对象有点胖,可以理解为带内容的对象。
5,匿名内部类中定义的方法最好不要超过3个。
interface Inter
{
void method();
}
class Test
{
static Inter function()
{
//匿名内部类,new Inter(){}相当于一个实现了Inter接口的类的对象
return new Inter()
{
public void method()
{
System.out.println("method run");
}
};
}
}
一个特殊的匿名类,new Object(){},没有父类或已实现的接口,只是因为类 Object
是类层次结构的根类。
class InnerTest
{
public static void main(String[] args)
{
new Object()
{
public void function()
{
}
}.function();
}
}
Object
Object:是所有对象的直接后者间接父类,传说中的上帝。
该类中定义的肯定是所有对象都具备的功能。
Object类中已经提供了对对象是否相同的比较方法。
如果自定义类中也有比较相同的功能,没有必要重新定义。只要沿袭父类中的功能,建立自己特有比较内容
即可,这就是覆盖。
class Demo //extends Object
{
private int num;
Demo(int num)
{
this.num = num;
}
public boolean equals(Object obj)//Object obj = new Demo();
{
if(!(obj instanceof Demo))
return false;
Demo d = (Demo)obj;
return this.num == d.num;
}
public String toString()
{
return "demo:"+num;
}
}
Object类中已存在equals方法,通过比较两个对象的地址值 ,来判断这两个对象是否相等。
而Demo类中的equals方法是覆盖了Object中的equals,通过比较两个对象的num属性,来判断两个对象是否相等。
此外Object中还要toString方法,hashCode,wait等常用方法。无论新创建一个什么类型的类,都会自动的从Object中获取到这些方法,但我们需要使用这些方法是,直接拿来用即可,如果需要在这些自定义方法,覆盖即可。
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------