抽象类 和 接口

抽象类

抽象类 abstract 模板
模板的作用 模具-玩具(颜色不一样 材质不一样)

1.主函数

BaseAndroidStudy 是Student的父类,可以用BaseAndroidStudy代替 Student xw=new Student中的Student


public class MyClass {
    public static void main(String[]args)
    {
        //显示创建一个子类 继承抽象类   创建这个类的对象
       BaseAndroidStudy xw=new Student("xiaow","book","xuexi");
       xw.studyc();
       //2.创建使用匿名类  只使用一次
        BaseAndroidStudy zx=new BaseAndroidStudy("book","xuexi") {
            @Override
            public void studyc() {

            }
        };

    }
}
2.抽象类
  • 抽象方法不需要实现
  • 定义一个抽象类 管理学习Android开发的路线
  • 抽象类里面定义使用这个功能就必须实现的方法和属性
abstract class  BaseAndroidStudy{
    //定义一个代码块
    {
        System.out.println("锻炼身体");
    }
    //定义一个属性用于保存数据
    public String  javaBook;
    //定义一个静态的常量
    public static final String  cBook="c 语言 基础 ";
    //定义一个抽象方法 不需要实现 子类实现
    public abstract void studyc();
    //定义一个普通方法  已经确定方法的具体实现
    public void studyjava()
    {
        System.out.println("参见Java被训班");
    }
    public  Dream dream;
    public BaseAndroidStudy(String javaBook,String dream)
    {
        this.javaBook=javaBook;
        this.dream=new Dream();
        this.dream.name=dream;
    }

    //定义一个内部类用于管理目标梦想
    private class Dream
    {
        public String name;
        public void show()
        {
            System.out.println("我的梦想是"+name);
        }
    }

}
3.普通类
  • 使用extents 继承 BaseAndroidStudy
  • 如果继承一个抽象类 就必须在普通类里面实现抽象类的抽象方法
  • 如果不实现抽象类 也可以把这个类定义为抽象类
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;
    }
}

接口

  • 接口 interface 定义一套(两者之间相互转换)方法 用于对象之间的通信
  • 不要把接口理解为某个物理存在的东西
  • 接口就是定义一套规则/规范
    *接口里面默认变量都是static final 常量
    *默认情况下不需要自己写 public static final
  • 不能定义变量
  • 接口里面不能定义代码块
  • 接口里面不能定义构造方法
  • 接口里面不能添加普通/对象/实例方法
  • 只有抽象方法
  • ,默认就是public abstract
  • 如果需要定义已经有实现的方法
  • 使用default
  • 接口里面可以使用内部类
  • 使用implements 实现一个接口
  • 一个类可以实现多个接口
  • class Test implements Test2,Test1
  • 一个接口可以继承多个接口
  • interface Test1 extends Test2
1.主函数
public class MyClass {
    public static void main (String [] args)
    {
        Test a=new Test();
        a.test();
    }
}

2.接口Test1
interface  Test1
{
    int i=100;
    int count =20;
    void test();
    class inner
    {
        int name;
        public void show()
        {
            System.out.println("suydafyfweuydf");
        }
    }
}

3.接口Test2 ,并使用extents继承接口Test1
interface  Test2 extends Test1
{
    int i=100;
    int count =20;
    void test();
    void test1();
    class inner
    {
        int name;
        public void show()
        {
            System.out.println("suydafyfweuydf");
        }
    }
}
4.创建普通类
  • 创建类用implements继承接口Test1,Test2
  • 实现接口中的抽象方法,注意同名方法是属于Test1还是Test2
class Test implements Test2 ,Test1
{

    @Override
    public void test() {

        Test1.inner  in=new Test1.inner();
        in.show();
    }

    @Override
    public void test1() {

    }
}
结果.png

抽象类和接口的混合使用

按钮的实验

1.主函数
  • 创建MainActivity类的变量main
  • 用变量main 使用MainActivity类中的方法teach
public class MyClass {
    public static void main( String[]args)
    {
        long start=System.currentTimeMillis();
      MainActivity main=new MainActivity();
      main.touch();
      long end=System.currentTimeMillis();
      System.out.println(end-start);
    }

}

2.创建抽象类Activity
  • 用ArrayList 定义数组(不明确内容数量)
  • 定义 界面的创建和销毁
  • 定义addChild(View v),将在界面上显示内容
public  abstract class Activity {
    //保存这个界面的所有子视图
    public ArrayList<View> childs=new ArrayList<>();
    //界面的创建
    public  abstract void Oncreat();
    //界面的销毁
    public abstract void Destory();
    //将子控件添加到当前界面上
    //接受时 用父类去接收子类  当需要访问子类时  就要强制转化为对应得到类型
    public  void addChild(View v) {
        if (v instanceof Botton) {
            Botton btn = (Botton) v;
            System.out.println(btn.titie + "按钮显示在界面上了");
            System.out.println(btn.titieColour + "按钮显示在界面上了");
        }
        //保存子控件
        childs.add(v);
    }
}

3.定义一个普通类MainActivity
  • 继承抽象类Activity ,继承接口View.OnClickListener
  • 定义构造方法 ,执行操作Oncreak()
  • 定义操作触摸 teach
  • 执行抽象方法Oncreak,和Destory
public class MainActivity extends Activity  implements  View.OnClickListener{
    Botton bin;

   public  MainActivity()
    {
        Oncreat();
    }
    @Override
    public void Oncreat() {
        //主界面如何布局
        //添加一个按钮
        bin=new Botton("分享","红色");
        //添加一个图片
        //将创建的控件添加的当前界面
         addChild(bin);

        //告诉按钮是谁监听这个事件
        bin.listener=this;

    }
    //模拟触摸
    public void touch()
    {
        //将屏幕触摸的事件传递给按钮
       bin.gettouch();
    }
    @Override
   //销毁之前需要做什么事情
        public void Destory() {

    }
   //当事件触发了  就会来调用 onClick方法
    @Override
    public void onClick(View v) {
        System.out.println("按钮被点击了");
    }
}

4.定义一个类View
  • 管理一个视图显示和事件监听
  • 什么情况下需要将一个父类做成抽象类(模板)
  • 1.不要直接创建这个类的对象
  • 2.这个类里面的某些方法 还不确定如何实现
  • 定义方法gettouch,表示接触事件
public class View {
    //所有的视图共有的属性
    String  backgrountcolour;
    String   bordercolour;
    //记录谁想监听这个事件
    //暂时不确定谁监听这个事件
    //但是监听事件的人一定实现了这个接口
    OnClickListener  listener;
    //所有的视图都要监听事件
    //如果一个事件需要监听事件  那么就必须实现监听事件的接口
    //定义内部接口  封装
    public  interface OnClickListener
    {
       //
        void   onClick(View v);
    }
    //用于控件接受触摸事件
    public  void gettouch()
    {
        listener.onClick(this);
    }
}
5.定义类Botten
public class Botton  extends View{
    String titie;
    String titieColour;

    public Botton(String titie,String titieColour)
    {
        this.titie=titie;
        this.titieColour=titieColour;
    }


}
6.显示结果
QQ截图20190812192620.png

记录代码的测试时间


public class Test {
    public static  void main (String[] args)
    {
         mycode test=new mycode();
         test.calculate();
    }
}
abstract class TimeTemplate
{
    //通过实现这个方法  获得具体测量的代码
    public  abstract void code();
    //实现测量
    public void calculate()
    {
        long state= System.currentTimeMillis();
        code();
        long end=System.currentTimeMillis();
        System.out.println(end-state);
    }
}
class mycode extends TimeTemplate {

    @Override
    public void code() {
        //写自己的代码
        int total =0;
        for(int i=0;i<10000;i++)
        {
            total=total+i;
        }
    }
}
QQ截图20190812194550.png

感悟:对于新知识来讲,我始终认为循环渐进式的学习方式最好,学完之后先写小程序熟悉如何使用,从中找出没有注意到的小细节,然后感觉差不多后在进行大程序。今天我们写了三四个小程序,但是大程序还是逻辑理不清,一个个类分开可以知道是什么作用,但是合在一起就有点搞不清了。

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

推荐阅读更多精彩内容