抽象内部类

1.抽象类

Java abstract类在《Java核心技术》中的描述是:

1、Abstract methods act as placeholders for methods that are implemented in the subclasses.

2、Abstract class cannot be instantiated.

第一点解释,好比 人和职员,职员是人的子类,每个职员都有其姓名、性别等人的基本属性,所以可以将人定义为abstract类。

人本身可以给属性设置默认值也可以不设置,这个取决于类的方法是否也是abstract,    如:

public String getName(){ 
return this.name;
}

public abstract void setName(String name); 

getName()这个方法可以在子类中重写,也可以不重写,重写需要添加@Override;

setName(String name)这个方法就必须要在子类中实现了。

上述的性质想必就是,abstract 与interface的区别了;


第二点解释,抽象类是不能实例化的,也就是我们不能通过类似 Object o = new Object() 的方式却实例化一个对象。

以上内容转自阿里云


抽象类的特点:
1,抽象方法一定在抽象类中。
2,抽象方法和抽象类都必须被abstract关键字修饰。
3,抽象类不可以用new创建对象。因为调用抽象方法没意义。
4,抽象类中的抽象方法要被使用,必须由子类复写起所有的抽象方法后,建立子类对象调用。

    如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类。

那它有什么作用?

抽象类将事物的共性的东西提取出来,抽象成一个高层的类。子类由其继承时,也拥有了这个超类的属性和方法。---也就实现了代码的复用了。
子类中也可加上自己所特有的属性和方法。----也就实现了多态
假如有两个程序员,两个在两个程序里都要用到一种功能,比如要取一个对象名。
甲自己做了一个方法叫getname,乙也作了一个方法叫qumingzi。如果两个人要去看对方的程序,那么这个方法要读懂是不是要有一个过程?
如果在公司里,有个抽象类,离面有个抽象方法较getName,公司规定,凡遇到这样的问题就实现这个方法。那么这两个人要读对方的代码是不是就容易了??
假如很多人要买水果吃,吃的动作只有一个,但是有的人要用现金买,有的人用信用卡,有的人赊帐。要为每个人定义一个类,就要定义多个相同的吃的方法。如果定义一个抽象类,在里面实现吃的方法,再做一个买的抽象方法。那每个人的类都从这个抽象类派生下来,只要实现买的方法即可,吃的方法就可以直接用父类的方法了。如果要改吃的方法就不用改多个,只要改这个抽象类里的就行了。

2.内部类


内部类的好处

1.内部类可以很好的实现隐藏,也就是封装性。一般的非内部类,是不允许有 private 与protected权限的,但内部类可以

2.内部类拥有外围类的所有元素的访问权限
3.可是实现多重继承
4.可以避免修改接口而实现同一个类中两种同名方法的调用

我们有时候会用到内部类,内部类可以用abtract修饰,也就是抽象内部类。比如:

public class MyClass{
   abstract class MyAbstractClass{
       abstract void method();
   }
}

那么如果我们需要再另一个类里用到它,可以这么做:

public class Test{
    public static void main(String[] args){
        Object o = getInstance();
        o.toString();
    }
 
    public static Object getInstance(){
        MyClass mc = new MyClass();
        Object mac = mc.new MyAbstractClass(){
            void method(){
                System.out.println("This is MyClass.MyAbstractClass.method()");
            }
 
            public String toString(){
                method();
                return null;
            }
        };
        return mac;
    }
 
}

如果你将内部的类定义为静态的会相对比较容易处理些,那么你需要这么处理:

public class Test{
    public static void main(String[] args){
        MyClass.MyAbstractClass o = getInstance();
        o.method();
        //o.toString();
    }
 
    public static MyClass.MyAbstractClass getInstance(){
        MyClass mc = new MyClass();
        MyClass.MyAbstractClass mac = new MyClass.MyAbstractClass(){
            void method(){
                System.out.println("This is MyClass.MyAbstractClass.method()");
            }
        };
        return mac;
    }
 
}




  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值