Android开发Day12(2019-8-12)

目的

理解掌握抽象类和接口。

技术与对应的使用方法

1.抽象类的定义和使用


  抽象类  abstract
  模板的作用  模具 ->  玩具(颜色不一样  材质不一样)
             学习路线 -> C语言 -> Java -> 界面  网络  多线程  数据库
  架构师 展示层 逻辑层 数据层
             模块化{
             输出  Utils.showText
                GameCenter:start
                PokerManager deal dealCards  poker
                PlayerManager player
            }
           A -> 输出
           B -> GameCenter

public class MyClass {
    public static void main(String[] args){
        //BaseAndroidStudy study = new BaseAndroidStudy("java编程思想","来鹅厂培训拿鹅厂offer");
        //1.显示地创建一个类继承于抽象类  创建这个类的对象
        Student xw = new Student("小王","Java编程思想","来鹅厂培训拿鹅厂offer");

        //2.使用匿名类  只使用一次
        BaseAndroidStudy zs = new BaseAndroidStudy("java书","高薪") {
            @Override
            public void studyC() {
                System.out.println("培训");
            }
        };
    }
}
定义一个抽象类  管理学习安卓开发的路线
抽象类里面定义使用这个功能就可以选择实现的方法或者属性
抽象类不能实例化 不能创建抽象类的对象
abstract class BaseAndroidStudy{
    //定义一个代码块
    {
        System.out.println("锻炼身体");
    }

    //定义一个属性  用于保存数据
    public String javaBook;
    public Dream dream;

    public BaseAndroidStudy(String javaBook,String dream){
        this.javaBook = javaBook;

        this.dream = new Dream();
        this.dream.name = dream;
    }

    //定义一个静态的常量
    public final String CBOOK = "C premier";

    //定义一个抽象方法  不需要实现  子类来实现
    public abstract void studyC();

    //定义一个普通方法  已经确定了这个方法的具体实现
    public void studyJava(){
        System.out.println("参加东哥的Java培训班");
    }

    //定义一个内部类用于管理每个人的梦想
    class Dream{
        public String name;

        public void show(){
            System.out.println("我的梦想是:"+name);
        }
    }
}
使用extends来继承一个抽象类
如果继承一个抽象类 就必须实现抽象类里面的抽象方法
如果不实现抽象方法,也可以把这个类定义为抽象类
class Student extends BaseAndroidStudy{
    String name;

    @Override
    public void studyC() {
        System.out.println("看书 看视频");
    }

    public Student(String name,String bookName,String dream){
        super(bookName,dream);
        this.name = name;
    }
}

2.接口的定义和使用

接口 interface  定义一套方法  用于对象之间的通信
 
 不要把接口理解成某一个物理存在的东西 VGA TypeC
 接口就是定义一套规则/规范
                  5G 国外 华为
 一流的企业做定规范/标准  二流的企业做产品
 
 接口里面默认变量都是static  final  常量
 默认情况下不需要自己写public static final
 不能定义变量
 
 接口里面不能定义代码块
 
 接口里面不能定义构造方法

 接口里面不能添加普通方法/对象方法/实例方法
 只有抽象方法
 默认就是public abstract
 
 如果需要定义已经有实现的方法
 使用default

接口里面可以定义内部类
 
使用implements实现一个接口
  class TClass implements testInterface,testInterface1
 
  一个类可以实现多个接口
  一个接口可以继承多个接口
  interface testInterface extends test1, interface testInterface extends test
interface testInterface{
    int I = 100;
    int COUNT = 20;

    void test();

    class inner{
        int name;
        public void show(){
            System.out.println("内部类");
        }
    }
}

interface testInterface1{
    int I = 100;
    int COUNT = 20;

    void test1();

    class inner{
        int name;
        public void show(){
            System.out.println("内部类");
        }
    }
}

class TClass implements testInterface,testInterface1{

    @Override
    public void test() {

    }@Override
    public void test1() {

    }
}

class Te{
    public static void main(String[] args){
        TClass twj = new TClass();
        testInterface t = new TClass();
    }
}

实际使用

1.模拟图片(按钮)展示界面Demo

大体构造
运行MyClass
public class MyClass {
    public static void main(String[] args){
        //启动程序 创建界面
        MainActivity main = new MainActivity();

        //模拟触摸
        main.touch();
    }
}
管理界面的抽象类 定义了一个界面创建到结束的模板
public abstract class Activity {
    //保存这个界面的所有子视图
    public ArrayList<View> childs = new ArrayList<>();

    //界面创建
    public abstract void onCreate();

    //界面销毁
    public abstract void onDestory();

    //将子控件添加到当前界面上
    //接受的时候是用父类去接收子类
    //当需要访问子类的内容的时候  就要强制转化为对应的类
    public void addChild(View v){
        if (v instanceof Button) {
            Button btn = (Button)v;
            System.out.println(btn.title + "按钮显示到界面上");
        }

        if (v instanceof ImageView){
            ImageView iv = (ImageView)v;
            System.out.println(iv.picture+"的图片显示到界面上");
        }

        //保存子类控件
        childs.add(v);
    }
}
主界面(程序运行起来的第一个界面)
public class MainActivity extends Activity implements View.OnClickListener{
    Button btn;
    ImageView img;
    //构造方法
    public MainActivity(){
        //当界面被创建  就自动调用onCreate方法
        onCreate();
    }
    @Override
    public void onCreate() {
        //主界面如何布局
        //添加一个按钮
        btn = new Button("分享","红色");

        //添加一张图片
        img = new ImageView("周杰伦");

        //将创建的控件添加到当前界面
        addChild(btn);
        addChild(img);

        //1.
        //如果一个控件需要监听事件  那么就必须实现监听事件的接口
        //告诉按钮是谁在监听这个事件
        btn.listener = this;

        //2.
        //给imageView添加一个事件
        img.listener = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                System.out.println("图片被点击了");
            }
        };
    }

    //模拟触摸的
    public void touch(){
        //将屏幕触摸的事件传递给按钮
        btn.getTouchEvent();
        img.getTouchEvent();
    }

    @Override
    public void onDestory() {
        //销毁之前需要做点什么事情
    }

    //当事件触发  就会来调用这个onClick方法
    @Override
    public void onClick(View v) {
        System.out.println("按钮被点击了");
    }
}
管理一个视图显示和事件监听
什么情况下需要将一个父类做成抽象类(模板)
1.不能直接创建这个类的对象
2.这个类里面的某些方法 还不确定如何实现
public class View {
    String backgroundColor;
    String borderColor;

    //记录谁想监听我这个事件
    //暂时我不确定是谁要监听
    //但是要监听事件的人肯定实现了这个接口
    OnClickListener listener;

    //所有的视图都要监听事件
    //定义内部接口  封装
    public interface OnClickListener{
        //定义一套方法  约束外部使用监听这些方法来监听事件
        public abstract void onClick(View v);
    }

    //用于控件接收触摸事件
    public void getTouchEvent(){
        //调用监听者里面的onClick方法
        listener.onClick(this);
    }
}
显示一张图片
public class ImageView extends View{
    String picture;

    public ImageView(String picture){
        this.picture = picture;
    }
}
创建按钮类
public class Button extends View{
    String title;
    String titleColor;

    public Button(String title,String titleColor){
        this.title = title;
        this.titleColor = titleColor;
    }
}

运行结果

运行结果

2.创建一个可以方便地测出某个代码块的执行效率的模板

public class Time {
    public static void main(String[] args){
        MyCode m = new MyCode();
        m.calculate();
    }
}

/**
 * 希望能够创建一个模板
 * 使用这个模板可以方便地测出某个代码块的执行效率
 */

abstract class TimeTemplate{
    //通过实现这个方法  获得具体测量的代码
    public abstract void code();

    //实现测量
    public void calculate(){
        long start = System.currentTimeMillis();

        //测量的代码
        code();

        long end = System.currentTimeMillis();
        System.out.println(end-start);
    }
}

class MyCode extends TimeTemplate{
    @Override
    public void code() {
        //写自己的测试代码
        int total = 0;
        for (int i = 0 ; i < 100000 ; i++){
            total += i;
        }
    }
}

心得感悟

今天主要学了抽象类和接口,抽象类的具体使用还是懂了,但是接口还不是很清楚具体的使用方法。但通过这几天的学习,感觉自己对类、对象的理解要深刻了很多。不过我发现自己很多代码自己能够理解,但自己独立去写的时候又总感觉不熟悉。自己一定要在空闲时间多抽时间来敲代码。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,136评论 1 32
  • 昨晚没有风,漫天的星星,像极了春天的夜晚。 和妈妈刚通完电话,眼珠里的泪水没有流出来,所以,我好像并没有得那种...
    开着拖拉机迎春阅读 145评论 0 0
  • 人与人相交, 若是懂得,何必多言, 若是不懂,又何必解释? 懂得的人无须解释, 不懂的人更是不必解释! 你从来都没...
    琳阳阅读 421评论 1 3
  • 年轻时, 觉得外边的世界 哪都比自己呆的地方温暖 觉得自已有能力 打开一片天 觉得自已有爱 在天涯海角都能发芽。 ...
    梦游的柔儿阅读 200评论 0 0
  • 2012-09-04 成长小组体验4 2012.8.18日盼望已久的成长小组第四课开始了。那天半晚时分开始下雨,吃...
    e0a0a643f902阅读 199评论 0 0