黑马程序员技术交流社区
标题:
普通类,抽象类,接口,匿名内部类的比较与用法
[打印本页]
作者:
zhuhongbo
时间:
2016-6-21 22:26
标题:
普通类,抽象类,接口,匿名内部类的比较与用法
package com.chenyb;
public interface SuperIntefaceCls {
//接口中的成员变量:不论是final型,还是普通类型,都只有访问点权限,没有修改的权限
public final Integer finalIntType=10;
public Integer intType=11;
public void check();
public abstract void getSomeInfors();
}
public abstract class AbstrCls implements SuperIntefaceCls{
public ComCls cc;
public AbstrCls(ComCls cc){
this.cc = cc;
}
public static void main(String[] args) {
//new AbstrCls().check();错误的写法,抽象类不能实例化
new AbstrCls(null) {
@Override
public void getSomeInfors() {
System.out.println("######");
}
@Override
public void check() {
System.out.println("@@@@@");
}
}.check();
}
public ComCls getCc() {
return cc;
}
public void setCc(ComCls cc) {
this.cc = cc;
}
}
package com.chenyb;
public class ComCls implements SuperIntefaceCls{
private Integer num=0;
public void initParamters(){
// this.finalIntType = 9;//接口中的变量不能够再次赋值,只能直接使用
// this.intType = 10;
}
@Override
public void check() {//必须重写普通方法
System.out.println("check() executed in ComCls");
}
@Override
public void getSomeInfors() {//必须重写 抽象类方法
System.out.println("getSomeInfors() executed in ComCls");
}
public static void main(String[] args) {
System.out.println("访问接口类中定义的常量finalIntType:"+new ComCls().finalIntType);//引用父接口的成员变量
System.out.println("访问接口类中定义的常量IntType:"+new ComCls().intType);
ComCls cc= new ComCls();
new ComCls().check();
new ComCls().getSomeInfors();
//匿名内部类分为抽象类和普通的类两种
//-----------------------抽象类的使用------------------------
//抽象类在创建的时候就要进行重写里边的方法,重写完后,
//1 直接用new 抽象类名().方法名();2 将new xx{}赋给一个抽象类的对象,通过对象调用
AbstrCls absCls=new AbstrCls(cc) {//通过传到参数,来公用外边内参数
ComCls cs = cc;//修改cs的成员值,就是修改cc的成员变量值*
@Override
public void getSomeInfors() {
//cc.num=9;
cs.num=1;
System.out.println("Override method getSomeInfors() of absCls:"+cs.num);
}
@Override
public void check() {
//cc.num=10;
cs.num=20;
System.out.println("Override method check() of absCls:"+cs.num);
}
};//抽象方法和普通方法在这个地方的调用没有什么区别。
absCls.check();/
public class ChildCls extends ComCls {
public class InnerCls {
private int innerNum = 0;
public void setNum(int num) {
innerNum = num;
}
public int getNum() {
return innerNum;
}
}
public static void main(String[] args) {
final ChildCls cc = new ChildCls();
System.out.print("invoke super's abs method--->");
cc.getSomeInfors();
System.out.print("invoke super's com method--->");
cc.check();
InnerCls ic = null;
ic = new ChildCls().new InnerCls();//实例化内部类
System.out.println("##"+ic);
ic = cc.new InnerCls();//实例化内部类 com.chenyb.ChildCls$InnerCls@1bab50a
System.out.println("##"+ic);
ic.setNum(9);
System.out.println("invoke innercls method:"+ic.getNum());
ic.setNum(99);
System.out.println("invoke innercls method:"+ic.getNum());
//匿名内部类的使用 匿名内部类和它的外部类的成员变量和方法如何公用??
class Nming{
public void setNumValue(int x){
//不能调用当前类的属性,只能访问继承的方法和变量
// cc.intType = 89;//不可用
System.out.println("匿名内部类方法开始调用:");
cc.check();//父类重写的方法可以调用
cc.getSomeInfors();//父类重新的方法可以调用
}
}
new Nming().setNumValue(0);//调用匿名内部类
}
}
复制代码
相关内部类知识参考:
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2