抽象类:
作用:起到定义模板的作用
//管理界面的抽象类 定义了一个从界面创建到界面结束的模板
public abstract class Activity {
//保存这个界面里面的所有子视图
public ArrayList<View> childs = new ArrayList<>();
//界面创建
public abstract void onCreate();
//界面销毁
public abstract void onDestory();
}
抽象类的定义和普通类的唯一区别是: 抽象类中有抽象方法
注:
1.一个类被定义为抽象类就不能用new运算符创建具体的实例对象,而必须通过覆盖的方式来实现抽象类中的方法 且子类继承抽象类的话,必须覆写抽象类的所有抽象方法
abstract class LeagueOfLegendsPlayer {
public static final String TEAM = "RNG";
private String name = "Uzi";
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public abstract print();
}
class print extends LeagueOfLegendsPlayer{
public void print(){
System.out.println("TEAM:"+TEAM)
System.out.println("name:"+name)
}
}
2.抽象类是需要被继承的所以不能用final 来修饰
匿名类对象的使用:
- 当我们只需要一次调用类的对象的时候,我们就可以考虑使用匿名类的创建方式创建匿名类对象。
- 创建的匿名类对象只能够调用一次!
匿名类只能调用一次的原因:
1.创建的时候只在jvm的堆空间新建了对象,并进行初始化,但栈空间没有一个变量名指向匿名对象。
- jvm垃圾回收机制在发现堆空间的对象,没有一个引用指向他,就给回收内存了。
public class ZJYTest {
public static void main (String [] args){
System.out.println(new Test());
}
}
class Test{
int a= 1;
Test(){
System.out.println("构造方法");
}
}
运行结果:
接口:定义一套方法 用于对象之间的通信 interface
注:不要把接口理解为某一个物理存在的东西 接口就是定义一套规则/规范
接口里面默认的变量都是static final 常量,默认情况下不需要自己写 public static final
接口里面不能定义变量,不能有代码块,不能添加普通方法/对象/实例方法,方法默认就是public abstract
如果需要定义已经有实现的方法,使用default
使用implements 实现一个接口,一个类可以实现多个接口
格式如下:
class ZHTClass implements testInterface2,testInterface
一个接口可以继承多个接口
格式如下:
interface testInterface extends testInterface2,testInterface3
可以在接口里面定义内部类:
interface testInterface extends testInterface2,testInterface3{
int I = 100;
int COUNT = 20;
void test();
class inner{
int name;
public void show(){
System.out.println("内部类");
}
}
}
实现接口:
实现继承的接口里定义的方法
class ZHTClass implements testInterface2,testInterface{
@Override
public void test2() {
testInterface.inner in = new testInterface.inner();
in.show();
}
@Override
public void test3() {
}
@Override
public void test() {
}
}
接口的使用:
class Te{
public static void main (String [] args){
ZHTClass xw = new ZHTClass();
testInterface t = new ZHTClass();
}
}
模板设计模式::(抽象类的模板设计)
package ZHT;
import java.sql.Time;
public class Myclass {
public static void main (String [] args) {
Mycode test = new Mycode();
test.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;
}
}
}
实战:
界面设计
思路:
先编写一个Activity类写出界面创捷、界面销毁的模板,MainActivity继承它。
在编写视图View类,设置好所有控件都有的属性
编写Button、imageView类继承于View并完善自己的属性
通过接口来规范外部条件监听事件,假设假设MainActivity要监听事件,那么它必须通过实现接口来获取Button等控件的信息,回调控件中处理事件的功能。
具体代码:
package day6.viewDemo;
import java.util.ArrayList;
public class Myclass {
public static void main (String [] args){
ZMainactivity mainactivity = new ZMainactivity();
mainactivity.touch();
}
}
abstract class Zactivity{
//保存这个界面的所有子视图
public ArrayList<Zview> childs = new ArrayList<>();
//界面创建
public abstract void ZonCreate();
//界面销毁
public abstract void ZonDestory();
//用父类接收子类 利用多态编写
//访问子类内容时 强制转化为对应的类
public void addChild(Zview v){
if(v instanceof Zbutton){
Zbutton but = (Zbutton)v;
System.out.println(but.title+"被显示到界面上了");
}
if(v instanceof ZimageView){
ZimageView img = (ZimageView)v;
System.out.println(img.picture+"被显示到界面上了");
}
childs.add(v);
}
}
class ZMainactivity extends Zactivity implements Zview.Lisenter {
Zbutton but;
ZimageView img;
public ZMainactivity(){
ZonCreate();
}
@Override
public void ZonCreate() {
//添加按钮
but=new Zbutton("周杰伦","红色");
//添加图片
img=new ZimageView("铁臂阿童木");
//将其添加到主界面
addChild(but);
addChild(img);
//告诉监听者的两种方法:
but.lisenter = this;
//2.使用匿名接口
img.lisenter = new Zview.Lisenter() {
@Override
public void Onclick(Zview v) {
System.out.println("图片被显示到界面");
}
};
}
//用touch触发
public void touch(){
but.getTouch();
img.getTouch();
}
@Override
public void ZonDestory() {
//写入毁灭前要做的事情
}
//实现接口
@Override
public void Onclick(Zview v) {
System.out.println("奥特合体,鸡你太美 按钮已上线");
}
}
class Zview{
String BackGroundColor;
String CircleColor;
//记录这要监听这个事件
Lisenter lisenter;
interface Lisenter{
//定义一套规则,约束外部条件用这些方法监听事件
void Onclick(Zview v);
}
public void getTouch(){
lisenter.Onclick(this);
}
}
class Zbutton extends Zview{
String title;
String Titlecolor;
public Zbutton(String title,String titlecolor){
this.title = title;
this.Titlecolor = titlecolor;
}
}
class ZimageView extends Zview{
String picture;
public ZimageView(String pic){
this.picture = pic;
}
}
注意:
其中的this指的是当前类即当前类的对象为监听者
这里的this指当前的控件,不要搞混。
运行结果
感悟:
今天自己把Demo弄懂并写了出来,收获满满,从一开始上课听的云里雾里,到慢慢的听懂一点,再到自己不停的看代码,想代码,问东哥,然后晚上再看视频讲解,弄懂后,试着自己写Demo到最后顺利写成。整个过程虽然费时费力,不过最后写出来还是有点小爽。明天加油!