我是靠谱客的博主 灵巧太阳,最近开发中收集的这篇文章主要介绍Android自定义View(一)关于super、this和构造方法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

 

        其实我发现个问题,我写的博客都是我边学变写的,当回过头来再看之前的博客,感觉总是:这特么写的什么玩意了!所以,感谢你能看我的博客,虽然有点糟糕。


        进入主题,先说this关键字。

        这个关键字用的还是挺多的:Activity中的Context对象、实现的接口、冲突命名时指定成员变量;实体类中setter方法指定成员变量;指代不同参的构造方法;

public class ThisClass {
    private int number;
    public ThisClass() {
        this(1);//指向其他的不同参构造器
    }
    public ThisClass(int number) {
        this.number = number;//名字冲突后区分成员变量
    }
    public void setNumber(int number) {
        this.number = number;//名字冲突后区分成员变量
    }
}

        总的来说:this是指向对象本身的指针。有一点要注意:匿名内部类中的this指向的是匿名类。

 

        接下来是super:

        super存在于有继承关系的子类里;super相当于father.this;”super(xxx)”可以访问到父类中同参的father(xxx)构造方法;”super.xxx()”可以访问到父类中的xxx()方法;

 

public class SuperClass extends ThisClass {
    public SuperClass() {
        super();//指向父类的ThisClass()构造方法
    }
    public SuperClass(int a) {
        super(a);//指向父类的ThisClass(int number)构造方法
    }
    public int getInt(){
//        return super.getNumber();//调用父类ThisClass的getNumber()方法
        return this.getNumber();//调用自己的getNumber()方法;this.可以省略
    }
    public int getNumber(){
        return 1;
    }
}

 

        Super必须写在构造方法的第一行,这是龟腚,我也没有深究是为什么。

 

        说完了this和super,该说和View相关的了。

        自定义view,通常的顺序是先extendView,然后必须实现一个默认的构造方法,可选的有三个(API21以后是四个,通常建议都实现),实例如下:

public class MyView extends View {
    public MyView(Context context) {
        super(context);
    }
    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
}


        这里我们可以看到每个方法都有一个super,如果去掉这行代码,就会报错。要说清楚到底都是怎么个意思,是很困难的,我们不如去看一下View类中的这几个方法之间的关联,先说明一下View类有22K多行代码,这里只截取我们感兴趣的:

@UiThread
public class View implements Drawable.Callback, KeyEvent.Callback,
        AccessibilityEventSource {
    public View(Context context) {
        mContext = context;
        //省略了一堆代码
    }
    public View(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }
    public View(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        this(context, attrs, defStyleAttr, 0);
    }
    public View(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        this(context);
		//省略了近500行代码    
}



        我们可以看到:两个参数的添加参数后调用了三个参数的,三个参数的添加了默认值又调用了四个参数的(这个是API21+),而四个参数的第一行却是调用一个参数的。


         我们可以做一个大概的猜测:只提供一个Context参数的构造方法是核心方法,而其他的都是点缀的意义,最终的最终还是要执行这里。

         看到这里也不知道看官有没有明白我想说的意思,或者有没有什么想法?有疑问也是好的啊!

         起码应该有一个疑问,BB这么多,什么时候怎么用呢?

         1.在代码中直接new一个Custom View实例的时候,会调用第一个构造函数.这个没有任何争议.

         2.在xml布局文件中调用CustomView的时候,会调用第二个构造函数.这个也没有争议.

         3.在xml布局文件中调用CustomView,并且Custom View标签中还有自定义属性时,这里调用的还是第二个构造函数.

         4.其实我也不知道

         多参就是为了处理参数,然后才是正儿八经的实现控件。

        

        第一部分我想说得就到这了。


最后

以上就是灵巧太阳为你收集整理的Android自定义View(一)关于super、this和构造方法的全部内容,希望文章能够帮你解决Android自定义View(一)关于super、this和构造方法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部