ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

JAVA 联想学习(2)

JAVA 联想学习(2) package corepractice; interface Flyable { //interface 声明这是一个接口 Flyable 接口名大驼峰命名 void fly(); void land(); default void preCheck() { //default 默认方法。实现类可以不重写直接用 //------- System.out.println( → 飞行前检查引擎、油量、天气 ); } static void showPrinciple() { //属于接口本身 //为什么方法名这样设置----- System.out.println( 飞行原理伯努利定律机翼上下气压差产生升力\n); } } //---------接口定义部分 class Bird implements Flyable { //表示Bird类实现了Flyable接口 String name; Bird(String name) { this.name name; //成员变量name参数name } Override //注释 重写接口/父类 public void fly() { System.out.println(鸟 name 拍打翅膀飞向天空); } Override public void land() { System.out.println(鸟 name 落在树枝); } } class Plane implements Flyable { String model; Plane(String model) { this.model model; } Override public void fly() { System.out.println(飞机 model 引擎轰鸣起飞); } Override public void land() { System.out.println(飞机 model 落在跑道上); } void refuel() { System.out.println(加油站加油); } } //----实现类部分 interface Launchable { //新接口 void launch(); } class Rocket implements Flyable, Launchable { //多接口用逗号,分割 //同时实现两个接口 String name; Rocket(String name) { this.name name; } Override public void fly() { System.out.println(火箭 name 垂直升入太空); } Override public void land() { System.out.println(火箭 name 着陆); } Override public void launch() { System.out.println(火箭 name 点火发射); } } //-------实现类部分多接口 class Sky { void letItFly(Flyable f) { f.preCheck(); f.fly(); f.land(); } } //------使用类部分 public class Flydemo { public static void main(String[] args) { System.out.println(让飞机飞); Flyable.showPrinciple();//调用static Sky sky new Sky(); System.out.println(----让鸟飞-----); Flyable f1 new Bird(小燕子); sky.letItFly(f1); System.out.println(----让飞机飞-----); Flyable f2 new Plane(波音747); sky.letItFly(f2); System.out.println(----让火箭飞----); Flyable f3 new Rocket(长征五号); sky.letItFly(f3); System.out.println(飞机编队展示); Flyable[] formation { //Flyable[] 类型的数组名 变量数组名 new Bird(大雁), new Plane(F-22战斗机), new Rocket(神舟飞船)//逗号连接 }; for (int i 0; i formation.length; i) { System.out.println(编队第 (i 1) 位); formation[i].fly(); } } } /* -----命名规则----- 类/接口 大驼峰每个单词首字母大写 如Bird Flyable Sky 方法 小驼峰第一个小写其余大写 如fly preCheck 变量/字段 小驼峰 如name model f1 常量 全部字母大写下划线分割 如MAX_SPEED 包名 全小写点分割 如com.example.demo 构造方法 和类名一模一样 -----前缀----- pre 在...之前 preCheck preProgess post 在...之后 postHandle postInit get 获取值 getName() set 设置值 setName() is/has 返回布尔 isEmpty() on 事情触发时 onClick() onSuccess() do 真正执行动作 doConnect() show 展示/打印 showPrinciple() create/build 创建对象 createUser() */ /* -----代码结构----- 1.Flyable接口 default和static 要写具体实现代码其他不用它俩有什么区别 2.实现接口时要用implements,Override覆盖内部还需要public声明这里的public起什么作用 3.使用类需要创建一个类将接口内容进行汇总直接调用 class Sky { void letItFly(Flyable f) { f.preCheck(); f.fly(); f.land(); } } 接口定义一个对象f,f调用内部函数为什么不在main内直接调用呢 4.程序入口 Flyable f1 new Bird(小燕子); 为什么一个接口对象可以指向一个类对象 ----相当于父类子类 sky.letItFly(f1); 这是可以自动内部识别出f1吗如果是一个未定义的类呢 */ /* -----解答-------- 1.(1).defult直接写出实现代码后续可以不重写且自动继承一般的必须重写都不自动继承//除抽象类 如果同时有多个接口有同名 default 方法实现类必须重写否则编译报错 (2).defult通过对象名调用static通过接口名调用 (3).defult 的this指向实现类对象static没有this (4).前者为 给接口升级时不破坏已有实现类 后者为 提供和接口相关的工具方法 2.接口内默认访问限制public,类内不写修饰符默认包私有package-private) 而子类/实现类重写方法时访问权限不能比父类/接口更严格 3.(1).解耦:调用者不关心具体类型 (2).真实项目缩影 用户请求 → Controller层 → Service层 → DAO层 → 数据库 (3).统一处理多个对象 4. 继承 接口 关键字 extends implements 引用类型 父类 接口 实际对象 子类 实现类 运行时行为 调用子类重写的方法 调用实现类的方法 本质 多态​ 多态​ 5.动态绑定 */ /* ------类比------ 继承 VS 接口 关系 is-a can-do 例子 Bird extends Animal Bird implements Flyable 数量 只能继承一个父类 可以实现多个接口 关注点 代码复用 行为规范只定义要做什么 class Bird extends Animal implements Flyable, Swimmable { // 鸟是一种动物继承同时能飞能游接口 } 接口 VS 多态 接口是多态最常见的载体 ...... 还有抽象类 回调函数 USB */ /* --------动态绑定-------- 条件 说明 你的代码里 1. 有继承/实现关系 类和类之间或类和接口之间 Bird implements Flyable 2. 有方法重写 子类/实现类重写了父类/接口的方法 Bird 重写了 fly() 3. 有向上转型 父类/接口引用指向子类/实现类对象 Flyable f1 new Bird() 4. 通过引用调用方法 通过那个父类/接口引用来调用 f1.fly() */ //9-5-1
返回列表