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";}
         }
);
}
}

 


综上:内部类最大的优势在于可以訪问外部类的资源,当然仅限于非静态内部类。而后面当接口只须要实现一次时,也可以使用这个匿名内部类。

这个相对还是比較有用的。

原文地址:https://www.cnblogs.com/yangykaifa/p/7235923.html