Java内部类
继承
多继承:字面上了解,即子类可以继承多个父类;
继承分类:公有继承、保护继承、私有继承。
公有继承(public)
基类的公有成员和保护成员可以作为其派生类的公有成员和保护成员
派生类的成员函数可以访问基类中的公有成员和保护成员,无法访问基类中的私有成员
派生类的对象可以访问基类的公有成员
私有继承(private)
基类的公有成员和保护成员都作为其派生类的私有成员
在私有继承时,基类的成员只能由直接派生类访问,而无法再往下继承
保护C++类继承(protected)
基类的所有公有成员和保护成员都成为派生类的保护成员
基类的公有成员和保护成员只能被它的直接派生类成员函数或友元访问.
———————————————————————————————————————————————————————————————————————————来自百度百科
关于继承:继承是为了即是为了共享数据也是为了封装数据。共享即可复用,有了这些特性也策应了继承的意义。而多继承自然也是继承的一种,相对来说,共享多个对象的数据,意义也是一致的,而逻辑就会繁琐点。如:在多继承中不同基类在派生类中成员函数或者对象访问造成的二义性问题。
这也是为什么java摒弃了多继承,但内部类在某个程度上会解决这个问题。
内部类
一个生活中的例子---乌鸦喝水。当然这个是翻版的,假设乌鸦可以变成小鱼。这样就无需借助外界的石子,慢慢来喝到水,而是直接能喝到瓶子中的水。在这里:外部类-----瓶子;内部类-------小鱼。非静态内部类可以访问外部类的成员变量。
具体使用
一般使用
classOuter { privateString id="Outerid"; public Outer(){ Innerin=new Inner(); in.print(); } protectedclass Inner { publicvoid print() { System.out.println(id); } } } publicclass TestInnerClass{ publicstatic void main(String[] args) { Outer oi=newOuter(); } }
如果当外部类的访问限制符为private,内部类也能够访问到外部类的成员变量。而当内部类声明为static内部类时,是无法访问到外部类的成员变量和函数的。但一旦声明为静态的内部类,就可以直接将内部类看成外部类的一个静态成员变量。见下个demo
静态内部类
classOuter { privateString id="Outerid"; public Outer(){ Innerin=new Inner(); in.print(); } protectedstatic class Inner { publicvoid print() { System.out.println("Inner.id"); } } } publicclass TestStaticInnerClass{ publicstatic void main(String[] args) { Outer oi=newOuter(); //非静态类的访问直接作为成员变量,不同的是这里的成员变量是一个类 Outer.Inner in=new Outer.Inner(); } }
这里访问静态内部类的方式有点像命名空间来定义类名的方式。
匿名内部类的使用
interfacePerson { publicString getName(); publicString getAge(); publicString getHeight(); } classStudent{ publicvoid TestNoName(Person p){ System.out.print(p.getName()+p.getAge()+p.getHeight()); } } publicclass NoNameInnerClass { public static void main(String[] args) { Student s=new Student(); s.TestNoName ( //匿名内部类传入,解决无需实现这个接口即可调用相关的方法 new Person() { public StringgetName(){return "name:cfl ";} publicString getAge(){return"age:24";} publicString getHeight(){return " height:1.7";} } ); } }
综上:内部类最大的优势在于能够访问外部类的资源,当然仅限于非静态内部类。而后面当接口仅仅需要实现一次时,也能够使用这个匿名内部类。这个相对还是比较实用的。