0507构造代码块和static案例,接口interface

【重点】

1.局部变量,成员变量,静态变量的特点
2.接口
接口语法:interface A {} 接口内的成员变量【缺省属性】public static final
接口内的成员方法【缺省属性】public abstract 接口遵从的实现语法:
class A implements B {}
A类是B接口的实现类,A类遵从B接口
接口的实现类需完成接口中所有缺省值为【public abstract】的方法 一个类可以继承多个接口,接口可以继承接口 abstract修饰的类遵从接口,相对于非abstract修饰的类有什么区别?==>abstract遵从接口不强制实现任何方法 JDK1.8新特性:
default关键字可以在接口中使用,用于修饰方法。使用default关键字修饰的方法在接口中允许有方法体。
【默认方法】 【非强制重写方法】
interface 接口内如果有default修饰的方法,那么这个接口的实现类可以不必强制重写default的方法 3.多态
一个方法需要的参数的是父类,那么传入父类以及父类的子类都是可以的
一个方法返回的参数的是父类,那么返回父类以及父类的子类都是可以的 一个方法需要的参数时USB接口,但是传入的对象是USB接口的实现类或者间接类也是OK的 【多态】
父类引用指向子类的对象
接口的引用指向遵从接口的类对象

1. 构造代码块和static案例

1.1 分析过程
计数器
记录用户的登陆次数,当前网站的访问人数... 自动生成用户ID号
会员ID号不可以重复,而且是用户在申请账号时自动生成!!! 分析:
1. 程序不退出,ID号始终处于一种记录状态,保存下一个用户的ID号
2. 用户提供不管多少数据,都要给予一个对应的ID号 解决:
ID号始终处于一种记录状态
1. 这里需要一个变量来保存ID号
int类型
局部变量:
局部变量在方法内,方法运行结束,局部变量销毁,无法作为持久化保存。
【不能使用】 成员变量:
成员变量是保存在每一个对象中,而且每一个对象中保存的数据是不一样的,
而且需要操作对象来进行获取,对象是存在可能性在一定条件下被销毁的。
不具有持久性,操作较为繁琐。 静态成员变量:
整个代码运行周期内始终存在,并且和对象无关,不会受到对象的影响。
可以直接通过类名操作,该变量保存在内存数据区,是一个共享资源。
2. 用户提供不管多少数据,都要给予一个对应的ID号
用户使用不同的构造方法,都要能够赋值对应ID号,ID号不是用户提供的!!!
构造代码块不关你调用那一个new + 构造方法,都要执行对应的操作!!!
1.2 代码实现
package com.qfedu.a_count;

/**
* 不管用户采用哪一种方式来创建对象,都会有一个唯一的ID号赋值操作
* @author Anonymous
*
*/
public class Vip {
private int id;
private String name;
private int age;
private String address; /**
* 使用静态成员变量count来计数ID
*/
private static int count = 1; /*
* 构造代码块完成ID赋值操作,使用静态成员变量count来进行赋值
* 并且每一次操作完成之后,count += 1
*/
{
id = count;
count += 1;
} public Vip() {} public Vip(String name) {
this.name = name;
} public Vip(String name, int age) {
this.name = name;
this.age = age;
} public Vip(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public String getAddress() {
return address;
} public void setAddress(String address) {
this.address = address;
} @Override
public String toString() {
return "Vip [id=" + id + ", name=" + name + ", age=" + age + ", address=" + address + "]";
}
}

2. 接口 【重点】

2.1 生活中的接口
生活常见接口:
USB Type-C UBS-C 雷电 RJ45 HDMI VPA PCI-E Lighting 3.5MM M.2 SATA 接口有什么作用?
USB
U盘 移动硬盘 鼠标 键盘 耳机 网卡 声卡 摄像头...
拓展功能,链接外部设备 USB接口限制了什么?
制定规范,制定协议
符合USB接口规范,USB接口协议才可以连接 RJ45 网线接口!!!
2.2 Java中定义接口的格式
关键字:
interface 接口
UI Design User Interface 格式:
interface 接口名 {
成员变量
成员方法
}
要求:
1. 接口名要求符合命名规范,大驼峰命名法!!!见名知意
2. 成员变量【缺省属性】 public static final 定义时必须初始化
3. 成员方法【缺省属性】 public abstract 方法没有方法体
package com.qfedu.b_interface;

/**
* 自定义接口,接口名A
*
* 两个问题:
* 1. USB接口,尺寸固定之后,有人改吗?
* 没有人修改
* 2. USB接口做什么,是接口决定?还是设备决定?
* 设备
* 思考:
* 静态?
* abstract?
* final?
* 继承?
* @author Anonymous
*
*/
interface A {
/* 成员变量
* The blank final field num may not have been initialized
*
* 通过Outline工具,发现当前成员变量存在public static final修饰,但是代码并没有
* 显式当前修饰内容
* 【缺省属性】 public static final
*/
int num = 10; /*
* 成员方法
* Abstract methods do not specify a body
*
* 错误提示,当前代码中test方法是一个abstract修饰方法,并且在Outline发现方法
* 存在一个A标记,证明为abstract,但是代码中并没有显式展示abstract修饰
* 【缺省属性】public abstract
*/
void test();
} public class Demo1 { }
2.3 Java中类【遵从】接口的格式
关键字:
implements 格式:
class A implements B { }
A类是B接口的实现类
A类遵从B接口
/**
* B类通过关键字 implements 遵从接口A,要求是实现接口A中的所有
* 缺省属性为public abstract修饰的方法。
* @author Anonymous
*
*/
class B implements A { @Override
public void test() {
System.out.println("B类遵从接口A,实现test方法");
} }
2.4 一个类可以同时遵从多个接口
USB接口可以同时兼容多个协议
USB3.1 USB3.0 USB2.0 USB1.0
package com.qfedu.b_interface;

interface C {
void testC();
} interface D {
void testD();
} interface E {
void testE();
} /**
* 一个类可以同时遵从多个接口
* 在implements关键字之后,接口使用 , 分割
* @author Anonymous
*
*/
class F implements C, D, E { @Override
public void testE() {
System.out.println("遵从接口E,实现testE方法");
} @Override
public void testD() {
System.out.println("遵从接口D,实现testD方法");
} @Override
public void testC() {
System.out.println("遵从接口C,实现testC方法");
} } public class Demo2 { }
2.5 接口可以继承接口
关键字:
extends
package com.qfedu.b_interface;

/*
* USB1.0协议
*/
interface Usb1_0 {
void usb1_0();
} /*
* USB2.0协议
*/
interface Usb2_0 {
void usb2_0();
} /*
* USB3.0协议
*/
interface Usb3_0 {
void usb3_0();
} /**
* 小米电脑上的USB接口需要兼容USB1.0 USB2.0 USB3.0 协议
*
* 接口可以使用extends完成继承,并且允许多继承存在
* @author Anonymous
*
*/
interface UsbMi extends Usb1_0, Usb2_0, Usb3_0 {
void usbMi();
} class MiGameComputer implements UsbMi { @Override
public void usb1_0() {
System.out.println("兼容USB1.0");
} @Override
public void usb2_0() {
System.out.println("兼容USB2.0");
} @Override
public void usb3_0() {
System.out.println("兼容USB3.0");
} @Override
public void usbMi() {
System.out.println("小米USB接口");
} } public class Demo3 {
public static void main(String[] args) {
new MiGameComputer().usb1_0();
new MiGameComputer().usb2_0();
new MiGameComputer().usb3_0();
new MiGameComputer().usbMi();
}
}
2.6 abstract类遵从接口
abstract修饰的方法
1. 没有方法体
2. 必须定义在abstract修饰的类内,或者interface接口内 一个abstract修饰的类遵从接口,想对于非abstract修饰的类有什么区别???\
abstract遵从接口不强制实现任何方法!!!
package com.qfedu.b_interface;

interface Servlet {
/**
* init初始化方法
*/
void init(); /**
* 提供服务的核心方法
*/
void service();
} /**
* abstract修饰的类遵从接口,不强制完成接口中缺省属性为abstract修饰的方法
* 一般会选择性完成一些统一功能方法,简化后期代码的压力
* @author Anonymous
*
*/
abstract class BaseServlet implements Servlet { /*
* 利用abstract统一实现init方法,简化提供真实服务功能类内代码
* 结构
*/
@Override
public void init() {
System.out.println("BaseServlet实现init方法");
}
} class MyServlet extends BaseServlet { /*
* 提供服务的类只需要完成service核心方法即可
* init初始化方式有abstract class BaseServlet提供
*/
@Override
public void service() {
System.out.println("MyServlet实现service方法");
} } class MyServlet2 extends BaseServlet {
@Override
public void service() {
System.out.println("MyServlet2实现service方法");
}
} public class Demo4 {
public static void main(String[] args) {
new MyServlet().init();
new MyServlet().service(); System.out.println("--------------------"); new MyServlet2().init();
new MyServlet2().service();
}
}
2.7 JDK1.8新特征 default关键字
JDK1.8 更新特征
default关键字可以在接口中使用,用于修饰方法,使用default关键字修饰的方法在接口中是允许有方法体
【默认方法】【非强制重写方法】
package com.qfedu.b_interface;

interface DefaultInterface {
// 【缺省属性】public abstract
void test(); default public void testDefault() {
System.out.println("testDefault() 默认方法,非强制重写方法");
} default public void defaultMethod() {
System.out.println("defaultMethod() 默认方法,非强制重写方法");
}
} class Demo implements DefaultInterface { /*
* 只强制完成【缺省属性】public abstract修饰的方法test
*/
@Override
public void test() {
System.out.println("强制实现的test方法");
} @Override
public void testDefault() {
System.out.println("实现类重写default方法");
} } public class Demo5 {
public static void main(String[] args) {
new Demo().test();
new Demo().testDefault();
new Demo().defaultMethod();
}
}

3. 多态【重点】

3.1 动物之间的关系【三遍】
动物能不能看作是一个类?
Animal 动物园:
老虎 是不是动物??? 是
熊猫 是不是动物??? 是
猴子 是不是动物??? 是 class Animal { } 老虎,熊猫,猴子,能不能继承Animal类
package com.qfedu.c;

/**
* 动物类
* @author Anonymous
*
*/
class Animal { } /**
* 老虎类,继承Animal类
* @author Anonymous
*
*/
class Tiger extends Animal { } /**
* 熊猫类,继承Animal类
* @author Anonymous
*
*/
class Panda extends Animal { } /**
* 猴子类,继承Animal类
* @author Anonymous
*
*/
class Monkey extends Animal { } public class Demo1 {
public static void main(String[] args) {
Animal animal = new Animal();
Tiger tiger = new Tiger();
Panda panda = new Panda();
Monkey monkey = new Monkey(); showAnimal(animal); // tiger也是动物
showAnimal(tiger);
// panda也是动物
showAnimal(panda);
// monkey还是动物
showAnimal(monkey); System.out.println("--------------------------------");
// 引用数据类型强制类型转换,讲Animal类型强制转换为Panda
Panda p = (Panda) getAnimal();
System.out.println(p); } /**
* 展示动物的方法
*
* @param animal 这里需要的是一个Animal类对象
*/
public static void showAnimal(Animal animal) {
System.out.println(animal);
} /**
* 返回一个动物类对象
*
* @return Animal类对象
*/
public static Animal getAnimal() {
return new Panda(); //Panda类对象是动物
// return new Tiger(); //Tiger类对象是动物
// return new Monkey(); //Monkey类对象是动物
// return new Animal();
}
}
3.2 小总结
1. 一个方法需要的参数是父类,传入实际参数是父类对象本身,或者其子类对象都是OK的!
2. 一个方法返回值类型是父类,实际返回的数据时父类对象本身,或者其子类对象也是OK的!
3. 引用数据类型之间的强制类型转换时允许使用,但是要求明确真实数据类型是一致的,不然会导致异常出现ClassCastException
3.3 USB接口和USB设备【三遍】
USB接口
规定一个方法
connect方法 键盘一个类
鼠标一个类
package com.qfedu.c;

/**
* USB接口
*
* @author Anonymous
*
*/
interface USB {
/**
* 要求所有的USB设备,都要完成connect方法
* 告知PC当前设备是什么功能
*/
void connect();
} /**
* Mouse类遵从USB接口,可以认为是一个USB设备
*
* @author Anonymous
*
*/
class Mouse implements USB { @Override
public void connect() {
System.out.println("鼠标控制光标");
}
} /**
* Logi是Mouse类的子类,是鼠标类的子类,
* 是否间接遵从USB接口? 是的
*
* 算不算USB设备? 算
* @author Anonymous
*
*/
class Logi extends Mouse {
@Override
public void connect() {
System.out.println("Logi Master 2S");
}
} /**
* Keyboard类遵从USB接口,也可以认为是一个USB设备
*
* @author Anonymous
*
*/
class Keyboard implements USB { @Override
public void connect() {
System.out.println("键盘敲代码");
}
} /**
* IKBC类,继承Keyboard类,是键盘类的子类
* 算不算USB设备??? 算
* @author Anonymous
*
*/
class IKBC extends Keyboard {
@Override
public void connect() {
System.out.println("IKBC C87 270 -/+ RMB");
}
} /**
* 电脑类
*
* @author Anonymous
*
*/
class Computer {
/**
* 电脑使用通过USB接口,连接USB设备
* @param usb USB接口,要求连接是一个USB设备
*/
public void useUSBInterface(USB usb) {
// 通过USB设备执行connect方法,执行功能
usb.connect();
}
} public class Demo2 {
public static void main(String[] args) {
// 电脑类对象
Computer computer = new Computer(); // Mouse是USB设备
Mouse mouse = new Mouse();
// Keyboard也是USB设备
Keyboard keyboard = new Keyboard(); // 电脑需要通过USB接口连接USB设备
computer.useUSBInterface(mouse);
computer.useUSBInterface(keyboard); // computer通过USB设备连接Mouse或者Keyboard类的子类是完全OK的
// 因为这些子类也是USB设备
computer.useUSBInterface(new Logi());
computer.useUSBInterface(new IKBC());
}
}
3.4 小总结
1. 一个方法需要的参数是USB接口,但是传入的对象是USB接口的直接实现类或者间接实现类都是完全OK
2. 代码整个过程中是完全符合生活逻辑的!!!
3.5 这其实是多态【背下来】
1. 父类的引用指向子类的对象
2. 或者接口的引用指向遵从接口的类对象
这就是多态

0507 构造代码块和static案例,接口interface的更多相关文章

  1. Java静态代码块、构造代码块执行顺序问题

    package com.zxl.staticdemo; public class BlockTest { static { System.out.println("BlockTest静态代码 ...

  2. java中父类子类静态代码块、构造代码块执行顺序

    父类静态(代码块,变量赋值二者按顺序执行) 子类静态 父类构造代码块 父类构造方法 子类构造代码块 子类构造方法 普通方法在实列调用的时候执行,肯定位于上面之后了 //父类A public class ...

  3. -1-2 java 面向对象基本概念 封装继承多态 变量 this super static 静态变量 匿名对象 值传递 初始化过程 代码块 final关键字 抽象类 接口 区别 多态 包 访问权限 内部类 匿名内部类 == 与 equal

    java是纯粹的面向对象的语言 也就是万事万物皆是对象 程序是对象的集合,他们通过发送消息来相互通信 每个对象都有自己的由其他的对象所构建的存储,也就是对象可以包含对象 每个对象都有它的类型  也就是 ...

  4. 静态(static)代码块、构造代码块、构造函数、父类子类执行顺序

    静态代码块:static修饰的代码块. 在类加载-初始化的时候进行,主要目的是给变量赋予初始值 构造代码块:直接在类中定义且没有加static关键字的代码块称为构造代码块. java会把构造代码块放到 ...

  5. [改善Java代码]构造代码块会想你所想

    建议37: 构造代码块会想你所想 镜像博文:http://www.cnblogs.com/DreamDrive/p/5413408.html http://www.cnblogs.com/DreamD ...

  6. java学习(一)静态代码块 构造代码块 构造方法的执行顺序及注意问题

    今天我总结了一下java中静态代码块 构造代码块 构造方法的执行顺序及其注意问题 首先要知道静态代码块是随着类的加载而加载,而构造代码块和构造方法都是随着对象的创建而加载 当时做了这么一个小案例(想必 ...

  7. JAVA之旅(四)——面向对象思想,成员/局部变量,匿名对象,封装 , private,构造方法,构造代码块

    JAVA之旅(四)--面向对象思想,成员/局部变量,匿名对象,封装 , private,构造方法,构造代码块 加油吧,节奏得快点了 1.概述 上篇幅也是讲了这点,这篇幅就着重的讲一下思想和案例 就拿买 ...

  8. Java第11次作业:什么是继承?继承的好处?什么是覆写?super()?构造代码块?子父类初始化顺序? 抽象类能用final声明吗?final关键字声明类 方法 变量以及全局常量?抽象类的构造方法?

    什么是继承? 继承是以父类为基础,子类可以增加新的数据或新的功能.子类不能选择性地继承父类.这种技术使得复用以前的代码非常容易. JAVA不支持多继承,单继承使JAVA的继承关系很简单,一个类只能有一 ...

  9. About 静态代码块,普通代码块,同步代码块,构造代码块和构造函数的纳闷

    构造函数用于给对象进行初始化,是给与之对应的对象进行初始化,它具有针对性,函数中的一种.特点:1:该函数的名称和所在类的名称相同.2:不需要定义返回值类型.3:该函数没有具体的返回值.记住:所有对象创 ...

随机推荐

  1. nat和静态映射

    拓扑图: 实验要求: 1.R2.R3能访问外网的4.4.4.4(4.4.4.4为R4上的环回接口,用来模拟inter网). 2.R4访问222.222.222.100其实访问到的是内网的192.168 ...

  2. spark系列-4、spark序列化方案、GC对spark性能的影响

    一.spark的序列化 1.1.官网解释 http://spark.apache.org/docs/2.1.1/tuning.html#data-serialization 序列化在任何分布式应用程序 ...

  3. 基于HTML Canvas实现“指纹识别”技术

    https://browserleaks.com/canvas 说明所谓指纹识别是指为每个设备标识唯一标识符(以下简称UUID).诸如移动原生的APP都可以通过调用相关设备API来获取相应的UUID. ...

  4. C++类学习(2)

    Ⅰ:类概念 一:类的构成 class 类名 { public: 公有数据成员和成员函数:类的接口 protected: 保护数据成员和成员函数: private: 私有数据成员和成员函数: }://注 ...

  5. 图论--割点--Tarjan

    #include<iostream> #include<stdio.h> #include<vector> using namespace std; const i ...

  6. python selenium(用例断言)

    1.if ...else ...判断进行断言 from time import * from selenium import webdriver "): driver = webdriver ...

  7. python的unittest框架中的assert断言

    unittest框架自带断言,如果想用assert断言,一定要引入unittest.TestCase框架才行,不然不会自动识别assert断言

  8. GitHub 热点速览 Vol.18:刷 LeetCode 的正确姿势

    作者:HelloGitHub-小鱼干 摘要:找对路子,事半功倍,正如本周 GitHub Trending #刷 LeetCode# 主题想表达的那般,正确的学习姿势方能让人走得更远,走进大厂

  9. golang之array

    golang使用array表示固定大小的数组,使用slice表示动态数组. package main import "fmt" func main() { var a = [5]i ...

  10. QT入门指导

    罗列一些QT学习资料 1. http://www.qter.org/ 包含很多教程,包括著名的<学习之路>系列. 2. http://www.qtcn.org/bbs/index-htm- ...