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();
}
}
最后效果
4.知识点的实践
这个demo是同样是要进行分析的,我们要实现什么样的功能,才能进行分析。
在这个demo我们想实现一个界面,界面上有一些事件,例如按钮,图片,当我们点击图片或者是按钮时,会实现按钮被点击显示出来。
分析结果:
接下来我首先要做的就是要实现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();
最后效果