1.收獲
在今天開始學(xué)習(xí)抽象類的時(shí)候,當(dāng)時(shí)腦子亂的,感覺自己什么都不知道,只能自己一步一步來(lái)理解,但是畢竟是上課,所以就有點(diǎn)跟不上上課的節(jié)奏,以至于后面講的demo都不知道是哪一步是哪一步,當(dāng)時(shí)就是腦子像亂燉一樣,根本沒有一點(diǎn)邏輯,沒有一點(diǎn)思路,當(dāng)時(shí)心里面煩躁,有點(diǎn)學(xué)不下去的感覺,但是自己心頭一熱,不能放棄,我就不相信就不能理解,于是自己先慢慢理解思路,問的同學(xué),最后自己有了一點(diǎn)頭緒,但是還有一些點(diǎn)不能理解,于是就去問東哥,在東哥講解下理解了那些點(diǎn),自己下來(lái)后慢慢分析了一次,最后還是把它理解了。無(wú)論是什么,只要自己不要放棄,就有可能,就有希望!感謝東哥!感謝堅(jiān)持的自己!加油!
2.技術(shù)(知識(shí)點(diǎn))
(1)抽象類的定義和使用
(2)接口的定義和使用
(3)模板設(shè)計(jì)模式的使用
3.技術(shù)(知識(shí)點(diǎn))實(shí)際運(yùn)用
(1)抽象類的定義和使用
什么是抽象類:按照我自己的理解就是就是一個(gè)模板或者是模型,當(dāng)有的類想要有的屬性和方法和那個(gè)模型一樣的時(shí)候,那么這個(gè)類就可以繼承于那個(gè)模板類,那麼這個(gè)子類就有那個(gè)模板類的屬性和方法了。但是并不是像繼承那樣就可以了,還有許多不同的地方。
抽象類的定義:首先要用absract來(lái)修飾這個(gè)父類(模板類),在抽象累中可以實(shí)現(xiàn)代碼塊,構(gòu)造方法,普通方法,內(nèi)部類,定義靜態(tài)的常量。
abstract class BaseAndroidStudy {
//代碼塊
{
System.out.println("鍛煉好身體");
}
//定義一個(gè)屬性 用于保存數(shù)據(jù)
public String Javabook;
public Dream dream;
//定義一個(gè)構(gòu)造方法
public BaseAndroidStudy(String Javabook, String dream) {
this.Javabook = Javabook;
this.dream = new Dream();
this.dream.name = dream;
}
//定義一個(gè)靜態(tài)的常量
public final String CBOOK = "C primier";
//定義一個(gè)抽象方法 不需要實(shí)現(xiàn) 子類來(lái)實(shí)現(xiàn)
public abstract void studyC();
//定義一個(gè)普通的方法 已經(jīng)確定這個(gè)方法的具體實(shí)現(xiàn)
public void studyJava() {
System.out.println("參加Java培訓(xùn)班");
}
//定義一個(gè)內(nèi)部類用于管理每個(gè)人的夢(mèng)想
class Dream {
public String name;
public void show() {
System.out.println("我的夢(mèng)想是:" + name);
}
}
}
注意在抽象類中的抽象方法是不需要實(shí)現(xiàn)的,具體的實(shí)現(xiàn)過程在子類中完成。
class Student extends BaseAndroidStudy{
String name;
//實(shí)現(xiàn)抽象方法
@Override
public void studyC() {
System.out.println("看書 看視頻");
}
//構(gòu)造方法
public Student(String name,String bookName,String dream){
super(bookName,dream);
this.name=name;
}
}
使用extends來(lái)繼承一個(gè)抽象類 ,如果繼承一個(gè)抽象類 就必須要實(shí)現(xiàn)抽象類里面的抽象方法, 如果不是實(shí)現(xiàn)抽象方法,也可以把這個(gè)類定義為抽象類。然后再主函數(shù)中創(chuàng)建子類的具體對(duì)象進(jìn)行調(diào)用。
Student student =new Student("向往", "c語(yǔ)言", "科學(xué)家");
(2)接口的定義和使用
什么接口:按照我自己的理解就是一套規(guī)則,如果你想使用這個(gè)接口的話,就必須要遵守這套規(guī)則,不能違反這套規(guī)則。不要把接口理解為某一個(gè)物理存在的東西,他有的東西實(shí)現(xiàn)不了的,虛擬的,只是一個(gè)模板。
接口的定義:接口前面有interface修飾
interface testInvterface{}
接口里面默認(rèn)變量static final ,常量默認(rèn)情況下不需要自己寫public static final, 不能定義變量
int I =100;
int COUNT=20;
這就是在接口中定義常量。
注意:接口與抽象類不同,接口里面不能定一個(gè)代碼塊,接口里面不能定義構(gòu)造方法,接口里面不能添加普通/對(duì)象/實(shí)例方法,只有抽象方法,默認(rèn)就是public abstract,而這些在抽象類中是可以實(shí)現(xiàn)的。
例如:
void test();
void test1();
void test2();
這些方法是默認(rèn)的是public abstract。但是在接口中是可以定義內(nèi)部類。
例如:
class inner{
String name;
public void show(){
System.out.println("內(nèi)部類");
}
}
在接口接口中的內(nèi)部類于在類中的內(nèi)部類有區(qū)別的,在接口內(nèi)的類是 默認(rèn)是靜態(tài)的。
接口可以繼承接口,一個(gè)接口可以繼承多個(gè)接口 interface testInvterface1 extends testInvterface,testInvterface2{}
例如:
interface testInvterface1 extends testInvterface{}
接口的實(shí)現(xiàn):
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實(shí)現(xiàn)一個(gè)接口,也可以實(shí)現(xiàn)多個(gè)接口,在實(shí)現(xiàn)接口后,要將接口中的抽象方法實(shí)現(xiàn),不然的話會(huì)報(bào)錯(cuò)。一個(gè)類可以實(shí)現(xiàn)多個(gè)接口: 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();這種方法都應(yīng)該知道
而 testInvterface t=new PXDClass();因?yàn)?class PXDClass implements testInvterface,與多態(tài)是一個(gè)道理。
(3)模板設(shè)計(jì)模式的使用
希望能夠創(chuàng)建一個(gè)模板,使用這個(gè)模板可以方便地測(cè)出模塊代碼的執(zhí)行的效率
那么我們就可以定義一個(gè)抽象類
abstract class TimeTemplate{
//通過實(shí)現(xiàn)這個(gè)方法 獲得具體測(cè)量的代碼
public abstract void code();
//實(shí)現(xiàn)測(cè)量
public void calculate(){
long start=System.currentTimeMillis();
//測(cè)量代碼
code();
long end=System.currentTimeMillis();
System.out.println(end-start);
}
}
然后在定義一個(gè)類來(lái)繼承這個(gè)抽象類,并實(shí)現(xiàn)抽象類中的抽象方法
class MyCode extends TimeTemplate{
@Override
public void code() {
//寫自己的測(cè)試代碼
int total=0;
for(int i=0;i<1000000;i++){
total+=1;
}
}
}
然后再主函數(shù)定義一個(gè)子類的具體對(duì)象,再來(lái)調(diào)用方法
public class MyClass {
public static void main(String[] args) {
MyCode myCode=new MyCode();
myCode.calculate();
}
}
最后效果

4.知識(shí)點(diǎn)的實(shí)踐
這個(gè)demo是同樣是要進(jìn)行分析的,我們要實(shí)現(xiàn)什么樣的功能,才能進(jìn)行分析。
在這個(gè)demo我們想實(shí)現(xiàn)一個(gè)界面,界面上有一些事件,例如按鈕,圖片,當(dāng)我們點(diǎn)擊圖片或者是按鈕時(shí),會(huì)實(shí)現(xiàn)按鈕被點(diǎn)擊顯示出來(lái)。
分析結(jié)果:

接下來(lái)我首先要做的就是要實(shí)現(xiàn)Activerty這個(gè)類,在這個(gè)類里面有兩個(gè)方法而這兩個(gè)類我們是不急于實(shí)現(xiàn)的,所以我們用抽象類來(lái)定義
public abstract class Activerty {
//保存所有控件
ArrayList<View>childs=new ArrayList();
public abstract void onCreatk();
public abstract void onDestroy();
}
在這里用到了view類,我們就要去創(chuàng)建這個(gè)類
public class View {}
然后我們?cè)趘iew 這個(gè)類里面創(chuàng)建一些屬性,在這里我們就要想到事件觸發(fā)來(lái)統(tǒng)一,應(yīng)該一個(gè)接口,當(dāng)事件被觸發(fā)時(shí),我們并不知道是那個(gè)監(jiān)聽者,所以我們需要一個(gè)來(lái)記錄監(jiān)聽者,由于在觸發(fā)事件時(shí),一定會(huì)實(shí)現(xiàn)這個(gè)接口,利用多態(tài)來(lái)定義一個(gè)接口類的監(jiān)聽者。
public class View {
String backcolor;
String bordercolor;
//記錄誰(shuí)想監(jiān)聽
OnClickLisener lisener;
//所有控件被監(jiān)聽
public interface OnClickLisener{
void OnClick(View v);
}
}
現(xiàn)在我們來(lái)創(chuàng)建一個(gè)管理主界面的類,在這個(gè)是繼承Activerty,那磨就要去實(shí)現(xiàn)父類里面的抽象方法,創(chuàng)建構(gòu)造方法,當(dāng)在主界面被創(chuàng)建時(shí),就會(huì)被調(diào)用。將抽象方法實(shí)現(xiàn)進(jìn)行創(chuàng)建界面,添加按鈕,添加圖片。
public class MainActiverty extends Activerty implements View.OnClickLisener {
Botton btn;
ImageView img;
//構(gòu)造方法
public MainActiverty(){
//當(dāng)界面被創(chuàng)建 就自動(dòng)調(diào)用onCreatk方法
onCreatk();
}
@Override
public void onCreatk() {
//添加一個(gè)按鈕
//添加一張圖片
//將創(chuàng)建的控件添加到界面
}
@Override
public void onDestroy() {
}
}
那麼此時(shí)我們就會(huì)想到要去創(chuàng)建Botton,ImageView,這兩個(gè)類
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;
}
}
創(chuàng)建完成之后,就要?jiǎng)?chuàng)建一個(gè)添加函數(shù),來(lái)添加控件,空件的添加是每一個(gè)界面要做的,所以將這個(gè)函數(shù)定義在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);
}
}
在添加函數(shù)完成之后,就可以調(diào)用函數(shù)添加了
public void onCreatk() {
//添加一個(gè)按鈕
btn=new Botton("分享","紅色");
//添加一張圖片
img=new ImageView("周杰倫");
//將創(chuàng)建的控件添加到界面
addChild(btn);
addChild(img);
}
現(xiàn)在需要來(lái)實(shí)現(xiàn)接口和接口里面的方法
public class MainActiverty extends Activerty implements View.OnClickLisener {
//當(dāng)事件被觸發(fā) 就會(huì)調(diào)用OnClick方法
@Override
public void OnClick(View v) {
if(v==btn){
System.out.println("按鈕被點(diǎn)擊了");
}else{
System.out.println("圖片被點(diǎn)擊了");
}
}
}
現(xiàn)在控件被添加上去了那麼就需要告訴控件是誰(shuí)在監(jiān)聽它
//告訴按鈕誰(shuí)在監(jiān)聽
btn.lisener=this;
img.lisener=this;
現(xiàn)在這些控件就等著被觸發(fā),當(dāng)被觸發(fā)時(shí),控件就應(yīng)該被告訴他已經(jīng)被觸發(fā)了,現(xiàn)在就創(chuàng)建一個(gè)函數(shù)來(lái)告知控件被觸發(fā)
//用于控件接收觸摸事件
public void getTouchEvent(){
//調(diào)用監(jiān)聽者里面的OnClick方法
lisener.OnClick(this);
}
現(xiàn)在這些控件就等著被觸發(fā),現(xiàn)在就創(chuàng)建一個(gè)函數(shù)來(lái)觸發(fā)控件
//模擬觸發(fā)
public void touch(){
btn.getTouchEvent();
img.getTouchEvent();
}
現(xiàn)在就需要在主函數(shù)里面創(chuàng)建一個(gè)界面的對(duì)象,來(lái)創(chuàng)建界面,然后調(diào)用觸發(fā)方法,進(jìn)行觸發(fā)
MainActiverty main=new MainActiverty();
main.touch();
最后效果
