15. 构造代码块,static案例,接口interface
1.构造代码块和static案例
1.1 分析
静态成员变量:
整个代码运行周期内始终存在,并且和对象无关,不会受到对象的影响。 可以直接通过类名操作,该变量保存在内存数据区,是一个共享资源。
用户提供不管多少数据,都要给予一个对应的ID号
用户使用不同的构造方法,都要能够赋值对应ID号,ID号不是用户提供的!!!
构造代码块不关你调用哪一个new + 构造方法,都要执行对应的操作!!!
1.2代码实现
public class Vip{
private int id;
private String name;
private int age;
private String address;
private static int 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 方法没有方法体
interface A{
int num=10;
void test();
}
public class Demo1{
}
2.3 java中类【遵从】接口的格式
关键字:
implements
格式:
class A implements B{
}
A类是B接口的实现类
A类遵从B接口
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
interface C {
void testC();
}
interface D {
void testD();
}
interface E {
void testE();
}
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
interface Usb1_0{
void usb1_0();
}
interface Usb2_0{
void usb2_0();
}
interface Usb3_0{
void usb3_0();
}
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("兼容USB4.0");
}
@Override
public void usbMi() {
System.out.println("小米USB接口");
}
}
public class Demo1 {
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遵从接口不强制实现任何方法!!!
interface Servlet{
void init();
void service();
}
abstract class BaseServlet implements Servlet{
@Override
public void init() {
System.out.println("BaseServlet实现init方法");
}
}
class MyServlet extends 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 Demo2 {
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关键字修饰的方法在接口中是允许有方法体
【默认方法】【非强制重写方法】
interface DefaultInterface{
void test();
default public void testDefault() {
System.out.println("testDefault()默认方法,非强制重写");
}
default public void defaultMethod() {
System.out.println("defaultMethod()默认方法,非强制重写");
}
}
class Demo implements DefaultInterface{
@Override
public void test() {
System.out.println("强制实现test方法");
}
@Override
public void testDefault() {
System.out.println("实现类重写default方法");
}
}
public class Demo3 {
public static void main(String[] args) {
new Demo().test();
new Demo().testDefault();
new Demo().defaultMethod();
}
}
3.多态
3.1 动物之间的关系
动物能不能看作是一个类?
Animal
动物园:
老虎 是不是动物??? 是
熊猫 是不是动物??? 是
猴子 是不是动物??? 是
class Animal {
}
老虎,熊猫,猴子,能不能继承Animal类
class Animal{
}
class Tiger extends Animal{
}
class Panda extends Animal{
}
class Monkey extends Animal{
}
public class Demo4 {
public static void main(String[] args) {
Animal animal = new Animal();
Tiger tiger = new Tiger();
Panda panda=new Panda();
Monkey monkey = new Monkey();
showAnimal(animal);
showAnimal(tiger);
showAnimal(panda);
showAnimal(monkey);
System.out.println("------------------------");
Panda p=(Panda) getAnimal();
System.out.println(p);
}
private static void showAnimal(Animal animal) {
System.out.println(animal);
}
public static Animal getAnimal() {
return new Panda();
}
}
3.2 总结
1. 一个方法需要的参数是父类,传入实际参数是父类对象本身,或者其子类对象都是OK的!
2. 一个方法返回值类型是父类,实际返回的数据时父类对象本身,或者其子类对象也是OK的!
3. 引用数据类型之间的强制类型转换时允许使用,但是要求明确真实数据类型是一致的,不然会导致异常出现ClassCastException
3.3 USB接口和USB设备
USB接口
规定一个方法
connect方法
键盘一个类
鼠标一个类
interface USB{
void connect();
}
class Mouse implements USB{
@Override
public void connect() {
System.out.println("鼠标控制光标");
}
}
class Logi extends Mouse{
@Override
public void connect() {
System.out.println("Logi Master 25");
}
}
class Keyboard implements USB{
@Override
public void connect() {
System.out.println("键盘敲键盘");
}
}
class IKBC extends Keyboard{
@Override
public void connect() {
System.out.println("IKBC C87 270 -/+ RMB");
}
}
class Computer{
public void useUSBInterface(USB usb) {
usb.connect();
}
}
public class Demo5 {
public static void main(String[] args) {
Computer computer = new Computer();
Mouse mouse = new Mouse();
Keyboard keyboard = new Keyboard();
computer.useUSBInterface(mouse);
computer.useUSBInterface(keyboard);
computer.useUSBInterface(new Logi());
computer.useUSBInterface(new IKBC());
}
}
3.4 总结
1. 一个方法需要的参数是USB接口,但是传入的对象是USB接口的直接实现类或者间接实现类都是完全OK
2. 代码整个过程中是完全符合生活逻辑的!!!
3.5 多态
1. 父类的引用指向子类的对象
2. 或者接口的引用指向遵从接口的类对象
这就是多态