Java语言的学习与实践6(抽象类,接口,模板设计模式)

1.收获

在今天开始学习抽象类的时候,当时脑子乱的,感觉自己什么都不知道,只能自己一步一步来理解,但是毕竟是上课,所以就有点跟不上上课的节奏,以至于后面讲的demo都不知道是哪一步是哪一步,当时就是脑子像乱炖一样,根本没有一点逻辑,没有一点思路,当时心里面烦躁,有点学不下去的感觉,但是自己心头一热,不能放弃,我就不相信就不能理解,于是自己先慢慢理解思路,问的同学,最后自己有了一点头绪,但是还有一些点不能理解,于是就去问东哥,在东哥讲解下理解了那些点,自己下来后慢慢分析了一次,最后还是把它理解了。无论是什么,只要自己不要放弃,就有可能,就有希望!感谢东哥!感谢坚持的自己!加油!

2.技术(知识点)

(1)抽象类的定义和使用
(2)接口的定义和使用
(3)模板设计模式的使用

3.技术(知识点)实际运用

(1)抽象类的定义和使用
什么是抽象类:按照我自己的理解就是就是一个模板或者是模型,当有的类想要有的属性和方法和那个模型一样的时候,那么这个类就可以继承于那个模板类,那麽这个子类就有那个模板类的属性和方法了。但是并不是像继承那样就可以了,还有许多不同的地方。
抽象类的定义:首先要用absract来修饰这个父类(模板类),在抽象累中可以实现代码块,构造方法,普通方法,内部类,定义静态的常量。

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 primier";

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

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

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

                public void show() {
                    System.out.println("我的梦想是:" + name);
                }
            }
        }

注意在抽象类中的抽象方法是不需要实现的,具体的实现过程在子类中完成。

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;

    }
}

使用extends来继承一个抽象类 ,如果继承一个抽象类 就必须要实现抽象类里面的抽象方法, 如果不是实现抽象方法,也可以把这个类定义为抽象类。然后再主函数中创建子类的具体对象进行调用。

 Student student =new Student("向往", "c语言", "科学家");

(2)接口的定义和使用
什么接口:按照我自己的理解就是一套规则,如果你想使用这个接口的话,就必须要遵守这套规则,不能违反这套规则。不要把接口理解为某一个物理存在的东西,他有的东西实现不了的,虚拟的,只是一个模板。
接口的定义:接口前面有interface修饰

interface testInvterface{}

接口里面默认变量static final ,常量默认情况下不需要自己写public static final, 不能定义变量

int I =100;
 int COUNT=20;

这就是在接口中定义常量。
注意:接口与抽象类不同,接口里面不能定一个代码块,接口里面不能定义构造方法,接口里面不能添加普通/对象/实例方法,只有抽象方法,默认就是public abstract,而这些在抽象类中是可以实现的。
例如:

 void test();
     void test1();
      void test2();

这些方法是默认的是public abstract。但是在接口中是可以定义内部类。
例如:

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

在接口接口中的内部类于在类中的内部类有区别的,在接口内的类是 默认是静态的。
接口可以继承接口,一个接口可以继承多个接口 interface testInvterface1 extends testInvterface,testInvterface2{}
例如:

interface testInvterface1 extends testInvterface{}

接口的实现:

class PXDClass implements testInvterface,testInvterface1{

     @Override
     public void test() {
         testInvterface.inner in=new testInvterface.inner();
         in.show();
     }

     @Override
     public void test1() {

     }

     @Override
     public void test2() {

     }
 }

使用implements实现一个接口,也可以实现多个接口,在实现接口后,要将接口中的抽象方法实现,不然的话会报错。一个类可以实现多个接口: class PXDClass implements testInvterface,testInvterface1{}
接口的使用:

class Te{
     public static void main(String[] agrs){
         PXDClass pxd=new PXDClass();
         testInvterface t=new PXDClass();
     }
}

在这里有两种的使用方法PXDClass pxd=new PXDClass();这种方法都应该知道
而 testInvterface t=new PXDClass();因为 class PXDClass implements testInvterface,与多态是一个道理。

(3)模板设计模式的使用
希望能够创建一个模板,使用这个模板可以方便地测出模块代码的执行的效率
那么我们就可以定义一个抽象类

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<1000000;i++){
           total+=1;
        }
    }
}

然后再主函数定义一个子类的具体对象,再来调用方法

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

最后效果


QQ图片20190812202621.png

4.知识点的实践

这个demo是同样是要进行分析的,我们要实现什么样的功能,才能进行分析。
在这个demo我们想实现一个界面,界面上有一些事件,例如按钮,图片,当我们点击图片或者是按钮时,会实现按钮被点击显示出来。
分析结果:


QQ图片20190812194107.jpg

接下来我首先要做的就是要实现Activerty这个类,在这个类里面有两个方法而这两个类我们是不急于实现的,所以我们用抽象类来定义

public abstract class Activerty {
    //保存所有控件
    ArrayList<View>childs=new ArrayList();

   public abstract void onCreatk();
    public abstract void onDestroy();
}

在这里用到了view类,我们就要去创建这个类

public class View {}

然后我们在view 这个类里面创建一些属性,在这里我们就要想到事件触发来统一,应该一个接口,当事件被触发时,我们并不知道是那个监听者,所以我们需要一个来记录监听者,由于在触发事件时,一定会实现这个接口,利用多态来定义一个接口类的监听者。

public class View {
    String backcolor;
    String bordercolor;
    //记录谁想监听
    OnClickLisener lisener;
    //所有控件被监听

    public interface OnClickLisener{
        void OnClick(View v);
    }
}

现在我们来创建一个管理主界面的类,在这个是继承Activerty,那磨就要去实现父类里面的抽象方法,创建构造方法,当在主界面被创建时,就会被调用。将抽象方法实现进行创建界面,添加按钮,添加图片。

public class MainActiverty extends Activerty implements View.OnClickLisener {
    Botton btn;
    ImageView img;
    //构造方法
    public MainActiverty(){
        //当界面被创建 就自动调用onCreatk方法
        onCreatk();
    }
    @Override
    public void onCreatk() {
        //添加一个按钮
       
        //添加一张图片
      
        //将创建的控件添加到界面
        
    
    }
 
    @Override
    public void onDestroy() {

    }
}

那麽此时我们就会想到要去创建Botton,ImageView,这两个类

public class Botton extends View{
    String title;
    String color;

    public Botton(String title,String color){
        this.color=color;
        this.title=title;
    }
}
public class ImageView extends View {
    String picture;
    public ImageView(String picture){
        this.picture=picture;
    }
}

创建完成之后,就要创建一个添加函数,来添加控件,空件的添加是每一个界面要做的,所以将这个函数定义在Activerty里面。

 public void addChild(View v){
        if(v instanceof Botton){
            Botton btn=(Botton) v;
            System.out.println(btn.title+"按钮被添加了");
        }
        if(v instanceof ImageView){
            ImageView img=(ImageView) v;
            System.out.println(img.picture+"图片被添加了");
        }
        childs.add(v);
    }
}

在添加函数完成之后,就可以调用函数添加了

public void onCreatk() {
        //添加一个按钮
       btn=new Botton("分享","红色");
        //添加一张图片
        img=new ImageView("周杰伦");
        //将创建的控件添加到界面
        addChild(btn);
        addChild(img);
    }

现在需要来实现接口和接口里面的方法

public class MainActiverty extends Activerty implements View.OnClickLisener {
//当事件被触发 就会调用OnClick方法
    @Override
    public void OnClick(View v) {
        if(v==btn){
            System.out.println("按钮被点击了");
        }else{
            System.out.println("图片被点击了");
        }
    }
}

现在控件被添加上去了那麽就需要告诉控件是谁在监听它

//告诉按钮谁在监听
        btn.lisener=this;
        img.lisener=this;

现在这些控件就等着被触发,当被触发时,控件就应该被告诉他已经被触发了,现在就创建一个函数来告知控件被触发

//用于控件接收触摸事件
    public void getTouchEvent(){
        //调用监听者里面的OnClick方法
        lisener.OnClick(this);
    }

现在这些控件就等着被触发,现在就创建一个函数来触发控件

 //模拟触发
    public  void touch(){
        btn.getTouchEvent();
        img.getTouchEvent();
    }

现在就需要在主函数里面创建一个界面的对象,来创建界面,然后调用触发方法,进行触发

   MainActiverty main=new MainActiverty();
             main.touch();

最后效果


QQ图片20190812234823.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,417评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,921评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,850评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,945评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,069评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,188评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,239评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,994评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,409评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,735评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,898评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,578评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,205评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,916评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,156评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,722评论 2 363
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,781评论 2 351

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,094评论 1 32
  • 面向对象编程(OOP) 在前面的章节中,我们学习了Kotlin的语言基础知识、类型系统、集合类以及泛型相关的知识。...
    Tenderness4阅读 4,429评论 1 6
  • 3. 类设计者工具 3.1 拷贝控制 五种函数拷贝构造函数拷贝赋值运算符移动构造函数移动赋值运算符析构函数拷贝和移...
    王侦阅读 1,797评论 0 1
  • 一、抽象类 1、抽象类含义的概括: 当多个类出现相同功能时,但功能主体不同,这样可以向上抽取,抽取时只抽取功能定义...
    玉圣阅读 828评论 0 6
  • 一、学习目的 抽象类最核心的作用就是作为模板,接口是定义一套方法,用于对象之间的通信。抽象类和接口在编写程序时有很...
    颵麏阅读 886评论 0 2