多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
### 问题 ~~~ public class DianWorker { String name; String sex; public void work() { System.out.println(name+"做着电工的工作"); } } ~~~ ~~~ public class QianWorker { String name; String sex; public void work() { System.out.println(name+"做着钳工的工作"); } } ~~~ ~~~ public class WaWorker { String name; String sex; public void work() { System.out.println(name+"做着瓦工的工作"); } } ~~~ 三个类当中存在着相同的属性和行为,这里写了三次,为了解决这个问题--**继承** *** ### 继承(泛化)(extends) #### 概念 一个Java类可以从一个现有的类(父类,基类,超类)当中派生出来,派生出来的类(子类)具有父类的所有属性和方法,除了**构造器**和**私有成员** #### 特点 子类还可以增加自己独有的属性和方法来拓展功能 Java中的继承--单继承(一个类只能有一个直接父类) 继承提高了代码的复用性,也是实现**开闭原则**的基础 **开闭原则:对拓展开放,对修改关闭** #### 如何判断继承关系 1.A is a kind of B(A是一种B)-->B就是A的父类 2.**里氏替换原则**--任何父类可以出现的地方,子类一定可以出现,子类能够完全替代父类的功能 ### 子类实例化过程 实例化子类对象,子类构造器先默认去调用父类的无参构造器先生成父类对象,然后再生成子类对象,如果父类没有无参构造器,子类构造器就必须显式调用父类的其他有参构造器 ### super关键字 代表父类对象,使用与this完全一样 1.super.属性,super.方法名() 2.super()父类构造器 *** ### 封装 #### 访问权限操作符 ![](https://box.kancloud.cn/fa2b97df5a4ddbc4d06af1bc64519d4b_773x324.png) #### 概念 将属性和方法用不同的访问权限操作符修饰(控制可见范围),放入一个类中的过程 ### 方法重写(override覆盖,rewrite,运行时多态) 一定发生在子类当中,与父类**同名,同参,同返回值类型**的方法,子类覆盖方法的访问权限要不小于父类中被覆盖方法的访问权限 #### 重写(运行时多态,override)与重载(编译时多态,overload)的区别? ~~~ // 重写一定发生在子类当中,与父类方法同名,同参,同返回值类型的方法,子类覆盖方法的访问权限要不小于父类中被覆盖方法的访问权限 // 重载:同一个类当中,同名不同参的方法,与返回值类型无关 ~~~ ### 多态(解耦合) 字面意义:一个事物的不同形态(对同一消息做出的不同响应) 编码意义:一个方法的不同实现 设计意义:将做什么和怎么做分开 前提: 1.要有泛化(继承)关系 2.要有方法重写 3.要有上溯造型(父类引用指向子类对象) *** ### static静态 static能修饰方法,属性。 static修饰的方法(静态方法)和属性(静态属性),可以直接通过类名调用,所以静态属性和静态方法不在堆区当中,而在方法区当中的静态区(共享区) 静态区中的静态属性和静态方法归这个类所有对象共享 静态方法只能直接访问静态成员 #### 备注: 1.static不能修饰类 2.static不能修饰构造器 3.static不能修饰局部变量 4.static不能修饰抽象方法 ### 静态块 : 给静态属性初始化 执行时机:类型信息被加载到方法区中时 ~~~ static { System.out.println("静态块被调用"); num = 100; } ~~~ *** ### 单例模式(保证一个类只有一个实例-->对象) ~~~ public class Singleton { // 饿汉模式--饿加载 private static Singleton s = new Singleton(); /* * 单例模式: * 保证一个类只有一个实例(对象) */ // 构造器私有--不让其他类随意new对象 private Singleton() { } // 返回一个实例的方法--公有,静态的,返回值类型为Singleton的方法 public static Singleton getInstance() { return s; } } ~~~ **懒加载** ~~~ public class Singleton { // 懒汉模式--懒加载 private static Singleton s; /* * 单例模式: * 保证一个类只有一个实例(对象) */ // 构造器私有--不让其他类随意new对象 private Singleton() { } // 返回一个实例的方法--公有,静态的,返回值类型为Singleton的方法 public static Singleton getInstance() { if(s == null){ s = new Singleton(); } return s; } } ~~~ *** ### final关键字 final能修饰类,方法,属性 final修饰类,最后的类,不能被继承 final修饰方法,最后的方法,不能被重写 final修饰属性,最后的属性,不能被修改 *** ### 抽象类(abstract) 抽象方法:没有方法体(块),如果一个类当中存在抽象方法,那么这个类必须是抽象类 **抽象类不能实例化**(但是有构造器),它唯一的作用-->被继承(充当父类) 一旦一个子类继承了一个抽象类,就必须重写父类的所有抽象方法,除非这个子类也是抽象类 #### 思考:abstract与final能不能同时修饰一个类? 不能,abstract类唯一的作用就是被继承;final类不能被继承,即使能修饰,这个类也毫无意义 *** ### 接口(interface) 如果一个类当中的所有方法都是抽象方法,这个类可以定义为一个接口--接口不是类 接口只能用**public**和默认修饰,**工作不存在默认接口** 因为Java类是单继承,所以出现了接口,为的是弥补单继承的缺点 接口不能实例化(没有构造器),一个类实现了一个接口,必须实现它所有方法,除非这个类是抽象类 #### 接口中的成员 1.只允许声明常量 2.只允许声明抽象方法 属性,存在默认前缀**public static final** 方法,存在默认前缀**public abstract** **类与类的关系--单继承** **类与接口的关系--多实现** ~~~ public class InterfaceAImp implements InterfaceA{ public void test() { System.out.println("实现A接口"); } } ~~~ **接口与接口的关系--多继承** ~~~ public interface InterB extends InterA,InterC{ } ~~~ *** #### 面试题:抽象类和接口有哪些区别? 1.抽象类和接口都不能实例化 2.抽象类有构造器,接口没有 3.类是单继承,接口是多实现 4.抽象类是抽象成员和非抽象成员的集合体,接口中只允许存在常量和抽象方法 *** ### 接口的应用 接口就是一套规范 ![](https://box.kancloud.cn/b1307c4b8687d12126d98a8da7d5120d_1004x518.png) ~~~ public interface News { // 增加一条新闻 void addNews(); } ~~~ ~~~ public class Sports implements News{ public void addNews() { System.out.println("发布一条体育新闻到体育模块"); } } ~~~ ~~~ public class Happy implements News{ public void addNews() { System.out.println("发布一条娱乐新闻到娱乐模块"); } } ~~~ ~~~ public class ZhengZhi implements News{ public void addNews() { System.out.println("发布一条政治新闻到政治模块"); } } ~~~ ~~~ public class Main { public static void main(String[] args) { News n = null; while(true) { Scanner scan = new Scanner(System.in); System.out.println("请输入要发布什么新闻:"); System.out.println("1--------体育新闻;"); System.out.println("2--------娱乐新闻;"); System.out.println("3--------政治新闻;"); System.out.println("4--------退出程序;"); int option = scan.nextInt(); if(option < 0 || option > 4) { System.out.println("无效数字"); continue; } switch(option) { case 1: n = new Sports(); break; case 2: n = new Happy(); break; case 3: n = new ZhengZhi(); break; case 4: System.out.println("谢谢!!!!"); return; } n.addNews(); } } } ~~~ *** ### 内部类(innerClass) 内部类的唯一作用:能够直接访问外部类成员,包括私有 解决接口中方法同名同参问题: ~~~ public class InterImpTest implements Interface1{ public void test() { System.out.println("1"); } public class InnerClass implements Interface2{ public int test() { System.out.println("2"); return 0; } } } ~~~ *** #### 总结: **1.面向对象的四大特性** ①继承 一个Java类可以从一个现有的类(父类,基类,超类)当中派生出来,派生出来的类(子类)具有父类的所有属性和方法,除了**构造器**和**私有成员**,子类还可以增加自己独有的属性和方法来拓展功能 ②封装 将属性和方法用不同的访问权限操作符修饰(控制可见范围),放入一个类中的过程 ③多态(解耦合) 对同一消息做出的不同响应 前提: 1.要有泛化(继承)关系 2.要有方法重写 3.要有上溯造型(父类引用指向子类对象) ④抽象 将事物的主要特征和行为抽象成概念模型,在Java中抽象类和接口都是抽象的体现 *** **2.static** static能修饰方法,属性。 static修饰的方法(静态方法)和属性(静态属性),可以直接通过类名调用,所以静态属性和静态方法不在堆区当中,而在方法区当中的静态区(共享区) 静态区中的静态属性和静态方法归这个类所有对象共享 静态方法只能直接访问静态成员 #### 备注: static不能修饰类 static不能修饰构造器 static不能修饰局部变量 static不能修饰抽象方法 *** **3.单例模式** 懒加载 *** **4.抽象类和接口** 抽象类和接口都不能实例化 抽象类有构造器,接口没有 类是单继承,接口是多实现 抽象类是抽象成员和非抽象成员的集合体,接口中只允许存在常量和抽象方法 *** **5.final关键字** final能修饰类,方法,属性 final修饰类,最后的类,不能被继承 final修饰方法,最后的方法,不能被重写 final修饰属性,最后的属性,不能被修改 *** **6.方法的重写** 一定发生在子类当中,与父类**同名,同参,同返回值类型**的方法,子类覆盖方法的访问权限要不小于父类中被覆盖方法的访问权限 *** **7.上塑造型** 父类引用指向子类对象