1. java学习笔记二、面向对象【OOPObject Oriented Programming

  2. 一、三大特性:
  3. 1、封装:隐藏对象的属性和实现细节,仅对外提供公共访问方式,将变化隔离,便于使用,提高复用性和安全性。
  4. 2、继承:提高代码复用性;继承是多态的前提
  5. 3、多态:父类或接口定义的引用变量可以指向子类或具体实现类的实例对象。提高了程序的拓展性。
  6.  
  7. 二、五大原则
  8. 1、单一职责原则SRP(Single Responsibility Principle)
  9. 类的功能要单一,不能包罗万象,跟杂货铺似的。
  10.  
  11. 2、开放封闭原则OCP(OpenClose Principle)
  12. 一个模块对于拓展是开放的,对于修改是封闭的,想要增加功能热烈欢迎,想要修改,哼,一万个不乐意。
  13.  
  14. 3、里式替换原则LSP(the Liskov Substitution Principle LSP)
  15. 子类可以替换父类出现在父类能够出现的任何地方。比如你能代表你爸去你姥姥家干活。哈哈~~
  16.  
  17. 4、依赖倒置原则DIP(the Dependency Inversion Principle DIP)
  18. 高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。抽象不应该依赖于具体实现,具体实现应该依赖于抽象。就是你出国要说你是中国人,而不能说你是哪个村子的。比如说中国人是抽象的,下面有具体的xx省,xx市,xx县。你要依赖的是抽象的中国人,而不是你是xx村的。
  19.  
  20. 5、接口分离原则ISP(the Interface Segregation Principle ISP)
  21. 设计时采用多个与特定客户类有关的接口比采用一个通用的接口要好。就比如一个手机拥有打电话,看视频,玩游戏等功能,把这几个功能拆分成不同的接口,比在一个接口里要好的多。


  1. 三、继承格式
  2. Java 中通过 extends 关键字可以申明一个类是从另外一个类继承而来的,一般形式如下:
  3.  
  4. 3.1、类的继承格式
  5. class 父类 {
  6. }
  7.  
  8. class 子类 extends 父类 {
  9. }
  10. 3.2、继承的特性:
  11. 1、子类拥有父类非 private 的属性、方法。
  12.  
  13. 2、子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
  14.  
  15. 3、子类可以用自己的方式实现父类的方法。
  16.  
  17. 4Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,
  18. 例如 B 类继承 A 类,C 类继承 B 类,
  19. 所以按照关系就是 B 类是 C 类的父类,A 类是 B 类的父类,这是 Java 继承区别于 C++ 继承的一个特性。
  20. 提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)
  21.  
  22. 3.3、继承关键字
  23. 1、继承可以使用 extends implements 这两个关键字来实现继承,而且所有的类都是继承于
  24. java.lang.Object,当一个类没有继承的两个关键字,
  25. 则默认继承object(这个类在 java.lang 包中,所以不需要 import)祖先类。
  26.  
  27. 2extends关键字
  28. Java 中,类的继承是单一继承,也就是说,一个子类只能拥有一个父类,所以 extends 只能继承一个类。
  29. 案例:extends 关键字
  30. public class Animal {
  31. private String name;
  32. private int id;
  33. public Animal(String myName, String myid) {
  34. //初始化属性值
  35. }
  36. public void eat() { //吃东西方法的具体实现 }
  37. public void sleep() { //睡觉方法的具体实现 }
  38. }
  39.  
  40. public class Penguin extends Animal{
  41. }
  42. 3implements关键字
  43. 使用 implements 关键字可以变相的使java具有多继承的特性,
  44. 使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔)。
  45. 案例:implements 关键字
  46. """
  47. public interface A {
  48. public void eat();
  49. public void sleep();
  50. }
  51.  
  52. public interface B {
  53. public void show();
  54. }
  55.  
  56. public class C implements A,B {
  57. }
  58. """
  59.  
  60. 4super this 关键字
  61. super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。
  62. this关键字:指向自己的引用。
  63. 案例:
  64. class Animal {
  65. void eat() {
  66. System.out.println("animal : eat");
  67. }
  68. }
  69.  
  70. class Dog extends Animal {
  71. void eat() {
  72. System.out.println("dog : eat");
  73. }
  74. void eatTest() {
  75. this.eat(); // this 调用自己的方法
  76. super.eat(); // super 调用父类方法
  77. }
  78. }
  79.  
  80. public class Test {
  81. public static void main(String[] args) {
  82. Animal a = new Animal();
  83. a.eat();
  84. Dog d = new Dog();
  85. d.eatTest();
  86. }
  87. }
  88.  
  89. 5.1final关键字
  90. final 关键字声明类可以把类定义为不能继承的,即最终类;或者用于修饰方法,该方法不能被子类重写:
  91. 声明类:
  92. final class 类名 {//类体}
  93. 声明方法:
  94. 修饰符(public/private/default/protected) final 返回值类型 方法名(){//方法体}
  95.  
  96. 6.1、构造函数
  97. 1、子类是不继承父类的构造器,它只是调用(隐式或显式);
  98. 2、如果父类的构造器带有参数,则必须在子类的构造器中显式地通过
  99. super 关键字调用父类的构造器并配以适当的参数列表;
  100. 3、如果父类构造器没有参数,则在子类的构造器中不需要使用
  101. super 关键字调用父类构造器,系统会自动调用父类的无参构造器
  102.  
  103. 案例:
  104. """
  105. class SuperSub{
  106. private int n;
  107.  
  108. //构造函数1
  109. SuperSub() {
  110. // TODO Auto-generated constructor stub
  111. System.out.println("SuperClass()");
  112. }
  113.  
  114. //构造函数2
  115. SuperSub(int n){
  116. System.out.println("SuperClass(int n)");
  117. this.n=n;
  118.  
  119. }
  120. }
  121.  
  122. //继承
  123. class SubClass extends SuperSub{
  124. private int n;
  125.  
  126. //// 自动调用父类的无参数构造器
  127. SubClass() {
  128. // TODO Auto-generated constructor stub
  129. System.out.println("SubClass");
  130. }
  131.  
  132. public SubClass(int n) {
  133. super(300);// 调用父类中带有参数的构造器
  134. System.out.println("SubClass(int n):"+n);
  135. this.n=n;
  136. }
  137. }
  138.  
  139. //SubClass类继承
  140. class SubClass2 extends SuperSub{
  141. private int n;
  142. //自动调用父类的无参数构造器
  143. public SubClass2(int n) {
  144. // TODO Auto-generated constructor stub
  145. System.out.println("SubClass2(int n):"+n);
  146. this.n=n;
  147. }
  148.  
  149. SubClass2() {
  150. super(400);
  151. // TODO Auto-generated constructor stub
  152. System.out.println("SubClass2()");
  153. }
  154. }
  155.  
  156. public class TestSuperSub{
  157. public static void main(String[] args) {
  158. System.out.println("------SubClass 类继承------");
  159. SubClass sc1 = new SubClass();
  160. SubClass sc2 = new SubClass(100);
  161.  
  162. System.out.println("------SubClass2 类继承------");
  163. SubClass2 sc3 = new SubClass2();
  164. SubClass2 sc4 = new SubClass2(200);
  165. }
  166. }
  167.  
  168. /*
  169. *
  170. * ------SubClass 类继承------
  171. SuperClass()
  172. SubClass
  173. SuperClass(int n)
  174. SubClass(int n):100
  175.  
  176. ------SubClass2 类继承------
  177. SuperClass(int n)
  178. SubClass2()
  179. SuperClass()
  180. SubClass2(int n):200
  181. *
  182. *
  183. */
  184.  
  185. """
  186. 四、Java重写(Override)与重载Overload
  187. 1 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!
  188. 2 重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。
  189. 3 重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。例如: 父类的一个方法申明了一个检查异常 IOException,但是在重写这个方法的时候不能抛出 Exception 异常,
  190. 因为 Exception IOException 的父类,只能抛出 IOException 的子类异常。 在面向对象原则里,重写意味着可以重写任何现有方法。实例如下:
  191.  
  192. """
  193.  
  194. class Animal{
  195. public void move() {
  196. System.out.println("动物可以移动");
  197. }
  198. }
  199.  
  200. class Dog extends Animal{
  201. public void move() {
  202. //Super 关键字的使用:当需要在子类中调用父类的被重写方法时,要使用 super 关键字。
  203. super.move(); // 应用super类的方法
  204. System.out.println("狗可以跑");
  205. }
  206.  
  207. public void bark(){
  208. System.out.println("狗可以吠叫");
  209. }
  210. }
  211.  
  212. public class TestDog{
  213. public static void main(String args[]) {
  214. Animal a = new Animal();
  215. Dog b = new Dog();
  216.  
  217. a.move();
  218.  
  219. b.move();
  220.  
  221. b.bark();
  222. }
  223. }
  224.  
  225. """
  226. 1、方法重写的规则
  227. 参数列表与被重写方法的参数列表必须完全相同。
  228. 返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类(java5 及更早版本返回类型要一样,java7 及更高版本可以不同)。
  229. 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为 public,那么在子类中重写该方法就不能声明为 protected
  230. 父类的成员方法只能被它的子类重写。
  231. 声明为 final 的方法不能被重写。
  232. 声明为 static 的方法不能被重写,但是能够被再次声明。
  233. 子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为 private final 的方法。
  234. 子类和父类不在同一个包中,那么子类只能够重写父类的声明为 public protected 的非 final 方法。
  235. 重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。
  236. 构造方法不能被重写。
  237. 如果不能继承一个类,则不能重写该类的方法。
  238.  
  239. 2、重载(Overload)
  240. 重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。
  241.  
  242. 每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。
  243.  
  244. 最常用的地方就是构造器的重载。
  245.  
  246. 重载规则:
  247.  
  248. 被重载的方法必须改变参数列表(参数个数或类型不一样);
  249. 被重载的方法可以改变返回类型;
  250. 被重载的方法可以改变访问修饰符;
  251. 被重载的方法可以声明新的或更广的检查异常;
  252. 方法能够在同一个类中或者在一个子类中被重载。
  253. 无法以返回值类型作为重载函数的区分标准。
  254.  
  255. 案例:
  256. """
  257. public class Overloading {
  258. public int test(){
  259. System.out.println("test1");
  260. return 1;
  261. }
  262.  
  263. public void test(int a){
  264. System.out.println("test2");
  265. }
  266.  
  267. //以下两个参数类型顺序不同
  268. public String test(int a,String s){
  269. System.out.println("test3");
  270. return "returntest3";
  271. }
  272.  
  273. public String test(String s,int a){
  274. System.out.println("test4");
  275. return "returntest4";
  276. }
  277.  
  278. public static void main(String[] args){
  279. Overloading o = new Overloading();
  280. System.out.println(o.test());
  281. o.test(1);
  282. System.out.println(o.test(1,"test3"));
  283. System.out.println(o.test("test4",1));
  284. }
  285. }
  286.  
  287. """
  288. 总结:
  289. 方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载可以理解成多态的具体表现形式。
  290.  
  291. (1)方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载(Overloading)。
  292. (2)方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法,就称为重写(Overriding)。
  293. (3)方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。
  294.  
  1.  
  1.  
  1. 五、Java 多态
  2. 多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作
  3. 多态存在的三个必要条件
  4. 1、继承
  5. 2、重写
  6. 3、父类引用指向子类对象:Parent p = new Child();
  7. 案例:
  8. """
  9. class Shape{
  10. void draw(){}
  11. }
  12.  
  13. class Circle extends Shape{
  14. void draw(){
  15. System.out.println("Circle.draw()");
  16. }
  17. }
  18.  
  19. class Square extends Shape{
  20. void draw(){
  21. System.out.println("Square.draw()");
  22. }
  23. }
  24. //1、继承extendsextends,2、重写draw、
  25. class Triangle extends Shape{
  26. void draw(){
  27. System.out.println("Triangle.draw()");
  28. }
  29. }
  30. 多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。
  31.  
  32. """
  33.  
  34. 案例3
  35. """
  36. public class Test3{
  37. public static void main(String[] args) {
  38. show(new Cat()); // 以 Cat 对象调用 show 方法
  39. show(new Dog()); // 以 Dog 对象调用 show 方法
  40.  
  41. Animal a = new Cat(); // 向上转型 --父类引用变量可以访问子类中属于父类的属性和方法,但是不能访问子类独有的属性和方法。
  42. a.eat(); // 调用的是 Cat 的 eat
  43. Cat c = (Cat)a; // 向下转型 只有当这个对象原本就是子类对象,通过向上转型得到的时候才能够成功转型。
  44. c.work(); // 调用的是 Cat 的 work
  45.  
  46. }
  47.  
  48. public static void show(Animal a) {
  49.  
  50. a.eat();
  51. //类型判断
  52. if (a instanceof Cat) {//猫做
  53. Cat c = (Cat)a;
  54. c.work();
  55. }else if (a instanceof Brid) {
  56. Brid c = (Brid)a;
  57. c.work();
  58. }
  59. }
  60. }
  61.  
  62. abstract class Animal{
  63. abstract void eat();
  64. }
  65.  
  66. class Cat extends Animal{
  67. public void eat() {
  68. System.out.println("eat fish");
  69. }
  70.  
  71. public void work() {
  72. System.out.println("抓老鼠");
  73. }
  74. }
  75.  
  76. class Brid extends Animal{
  77. public void eat() {
  78. System.out.println("吃骨头");
  79. }
  80.  
  81. public void work() {
  82. System.out.println("看家");
  83. }
  84. }
  85. """
  86. 基础知识:Java中的继承机制使得一个类可以继承另一个类,继承的类称为子类,
  87. 被继承的类称为父类。在一个子类被创建的时候,首先会在内存中创建一个父类对象,
  88. 然后在父类对象外部放上子类独有的属性,两者合起来形成一个子类的对象,
  89. 所以子类可以继承父类中所有的属性和方法,包括private修饰的属性和方法,
  90. 但是子类只是拥有父类private修饰的属性和方法,却不能直接使用它,
  91. 也就是无法直接访问到它(子类可以通过调用父类的public声明的get方法来获取父类的private属性,
  92. 但无法访问父类的private方法)。同时子类可以对继承的方法进行重写(@Override),并且新建自己独有的方法。
  93.  
  94. 虚函数:
  95. 虚函数的存在是为了多态。
  96. Java 中其实没有虚函数的概念,它的普通函数就相当于 C++ 的虚函数,
  97. 动态绑定是Java的默认行为。如果 Java 中不希望某个函数具有虚函数特性,可以加上 final 关键字变成非虚函数。
  98.  
  99. 重写:
  100. 我们将介绍在 Java 中,当设计类时,被重写的方法的行为怎样影响多态性。
  101. 我们已经讨论了方法的重写,也就是子类能够重写父类的方法。
  102. 当子类对象调用重写的方法时,调用的是子类的方法,而不是父类中被重写的方法。
  103. 要想调用父类中被重写的方法,则必须使用关键字 super
  104.  
  105. 六、Java 抽象类
  106. 抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
  107. 由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。
  108. 案例:
  109. """
  110. /* 文件名 : Employee.java */
  111. public abstract class Employee
  112. {
  113. private String name;
  114. private String address;
  115. private int number;
  116. public Employee(String name, String address, int number)
  117. {
  118. System.out.println("Constructing an Employee");
  119. this.name = name;
  120. this.address = address;
  121. this.number = number;
  122. }
  123. public double computePay()
  124. {
  125. System.out.println("Inside Employee computePay");
  126. return 0.0;
  127. }
  128. public void mailCheck()
  129. {
  130. System.out.println("Mailing a check to " + this.name
  131. + " " + this.address);
  132. }
  133. public String toString()
  134. {
  135. return name + " " + address + " " + number;
  136. }
  137. public String getName()
  138. {
  139. return name;
  140. }
  141. public String getAddress()
  142. {
  143. return address;
  144. }
  145. public void setAddress(String newAddress)
  146. {
  147. address = newAddress;
  148. }
  149. public int getNumber()
  150. {
  151. return number;
  152. }
  153. }
  154.  
  155. """
  156.  
  157. 案例2
  158. """
  159. /* 文件名 : AbstractDemo.java */
  160. public class AbstractDemo
  161. {
  162. public static void main(String [] args)
  163. {
  164. /* 以下是不允许的,会引发错误 */
  165. Employee e = new Employee("George W.", "Houston, TX", 43);
  166.  
  167. System.out.println("\n Call mailCheck using Employee reference--");
  168. e.mailCheck();
  169. }
  170. }
  171.  
  172. """
  173.  
  174. Abstract 关键字同样可以用来声明抽象方法,抽象方法只包含一个方法名,而没有方法体。
  175. 抽象方法没有定义,方法名后面直接跟一个分号,而不是花括号。
  176.  
  177. public abstract class Employee
  178. {
  179. private String name;
  180. private String address;
  181. private int number;
  182.  
  183. public abstract double computePay();
  184.  
  185. //其余代码
  186. }
  187. 声明抽象方法会造成以下两个结果:
  188. 1、如果一个类包含抽象方法,那么该类必须是抽象类。
  189. 2、任何子类必须重写父类的抽象方法,或者声明自身为抽象类。
  190.  
  191. 继承抽象方法的子类必须重写该方法。否则,该子类也必须声明为抽象类。最终,必须有子类实现该抽象方法,否则,从最初的父类到最终的子类都不能用来实例化对象。
  192. 如果Salary类继承了Employee类,那么它必须实现computePay()方法:
  193.  
  194. Salary.java 文件代码:
  195. /* 文件名 : Salary.java */
  196. public class Salary extends Employee
  197. {
  198. private double salary; // Annual salary
  199.  
  200. public double computePay()
  201. {
  202. System.out.println("Computing salary pay for " + getName());
  203. return salary/52;
  204. }
  205.  
  206. //其余代码
  207. }
  208. 抽象类总结规定
  209. 1. 抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。
  210.  
  211. 2. 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
  212.  
  213. 3. 抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。
  214.  
  215. 4. 构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。
  216.  
  217. 5. 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。
  218.  
  219. 八、Java 封装
  220. 在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法
  221. 封装的优点
  222. 1. 良好的封装能够减少耦合。
  223.  
  224. 2. 类内部的结构可以自由修改。
  225.  
  226. 3. 可以对成员变量进行更精确的控制。
  227.  
  228. 4. 隐藏信息,实现细节。
  229.  
  230. 采用 this 关键字是为了解决实例变量(private String name)和局部变量(setName(String name)中的name变量)之间发生的同名的冲突。
  231. 案例:
  232. """
  233. /*
  234. * 实现Java封装的步骤
  235. * 1. 修改属性的可见性来限制对属性的访问(一般限制为private)
  236. * 这段代码中,将 name 和 age 属性设置为私有的,只能本类才能访问,其他类都访问不了,如此就对信息进行了隐藏。
  237. *
  238. * 2. 对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问
  239. */
  240.  
  241. public class Person{
  242. private String name;
  243. private int age;
  244.  
  245. public int getAge() {
  246. return age;
  247. }
  248.  
  249. public String getName() {
  250. return name;
  251. }
  252.  
  253. public void setAge(int age) {
  254. //采用 this 关键字是为了解决实例变量(private String name)
  255. //和局部变量(setName(String name)中的name变量)之间发生的同名的冲突。
  256. this.age = age;
  257. }
  258.  
  259. public void setName(String name) {
  260. this.name=name;
  261. }
  262. }
  263.  
  264. """
  265.  
  266. 九、Java 接口
  267. 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方
  268. 接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。
  269. 接口与类相似点:
  270. 一个接口可以有多个方法。
  271. 接口文件保存在 .java 结尾的文件中,文件名使用接口名。
  272. 接口的字节码文件保存在 .class 结尾的文件中。
  273. 接口相应的字节码文件必须在与包名称相匹配的目录结构中。
  274. 接口与类的区别:
  275. 接口不能用于实例化对象。
  276. 接口没有构造方法。
  277. 接口中所有的方法必须是抽象方法。
  278. 接口不能包含成员变量,除了 static final 变量。
  279. 接口不是被类继承了,而是要被类实现。
  280. 接口支持多继承。
  281. 接口特性
  282. 接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)。
  283. 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)。
  284. 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。
  285. 案例:
  286. """
  287. import java.lang.*;
  288. public interface NameOfInterface{
  289.  
  290. }
  291. """
  292. 接口有以下特性:
  293. 接口是隐式抽象的,当声明一个接口的时候,不必使用abstract关键字。
  294. 接口中每一个方法也是隐式抽象的,声明时同样不需要abstract关键字。
  295. 接口中的方法都是公有的。
  296. """
  297. interface Animal{
  298. public void eat();
  299. public void travel();
  300. }
  301.  
  302. public class MammalInt implements Animal{
  303. public void eat(){
  304. System.out.println("mammalInt eat");
  305. }
  306.  
  307. public void travel(){
  308. System.out.println("mammalInt travel");
  309. }
  310.  
  311. public int noOfLegs(){
  312. return 0;
  313. }
  314.  
  315. public static void main(String [] args){
  316. MammalInt m = new MammalInt();
  317. m.eat();
  318. m.travel();
  319. }
  320. }
  321. """
  322.  
  323. 接口的继承
  324. 一个接口能继承另一个接口,和类之间的继承方式比较相似。接口的继承使用extends关键字,子接口继承父接口的方法。
  325.  
  326. 下面的Sports接口被HockeyFootball接口继承:
  327.  
  328. // 文件名: Sports.java
  329. public interface Sports
  330. {
  331. public void setHomeTeam(String name);
  332. public void setVisitingTeam(String name);
  333. }
  334.  
  335. // 文件名: Football.java
  336. public interface Football extends Sports
  337. {
  338. public void homeTeamScored(int points);
  339. public void visitingTeamScored(int points);
  340. public void endOfQuarter(int quarter);
  341. }
  342.  
  343. // 文件名: Hockey.java
  344. public interface Hockey extends Sports
  345. {
  346. public void homeGoalScored();
  347. public void visitingGoalScored();
  348. public void endOfPeriod(int period);
  349. public void overtimePeriod(int ot);
  350. }
  351. Hockey接口自己声明了四个方法,从Sports接口继承了两个方法,这样,实现Hockey接口的类需要实现六个方法。
  352.  
  353. 相似的,实现Football接口的类需要实现五个方法,其中两个来自于Sports接口。
  354.  
  355. 接口的多继承
  356. Java中,类的多继承是不合法,但接口允许多继承。
  357.  
  358. 在接口的多继承中extends关键字只需要使用一次,在其后跟着继承接口。 如下所示:
  359.  
  360. public interface Hockey extends Sports, Event
  361. 以上的程序片段是合法定义的子接口,与类不同的是,接口允许多继承,而 Sports Event 可能定义或是继承相同的方法
  362.  
  363. 九、java 枚举(enum)
  364. Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一个年的 12 个月份,一个星期的 7 天,方向有东南西北等。
  365. Java 枚举类使用 enum 关键字来定义,各个常量使用逗号 , 来分割。
  366. """
  367. enum Color{
  368. RED,GREEN,BLUE;
  369. }
  370. public class Test{
  371. public static void main(String[] args){
  372. Color c1= Color.RED;
  373. System.out.println(c1);
  374. }
  375.  
  376. }
  377. 或者for循环
  378. public class MyClass{
  379. public static void main(String[] args){
  380. for (Color myVar:Color.values()){
  381. System.out.println(myVar);
  382. }
  383. }
  384. }
  385.  
  386. 或者switch循环
  387. public class MyClass{
  388. public static void main(String[] args){
  389. Color myVar = Color.BLUE;
  390.  
  391. switch (myVar){
  392. case RED:
  393. System.out.println("RED");
  394. break;
  395. case BLUE:
  396. System.out.println("BLUE");
  397. break;
  398. case GREEN:
  399. System.out.println("GREEN");
  400. break;
  401.  
  402. }
  403. }
  404. }
  405.  
  406. """
  407. values(), ordinal() valueOf() 方法
  408. enum 定义的枚举类默认继承了 java.lang.Enum 类,并实现了 java.lang.Seriablizable java.lang.Comparable 两个接口。
  409.  
  410. values(), ordinal() valueOf() 方法位于 java.lang.Enum 类中:
  411.  
  412. values() 返回枚举类中所有的值。
  413. ordinal()方法可以找到每个枚举常量的索引,就像数组索引一样。
  414. valueOf()方法返回指定字符串值的枚举常量。
  415.  
  416. 枚举类成员:
  417. 枚举跟普通类一样可以用自己的变量、方法和构造函数,构造函数只能使用 private 访问修饰符,所以外部无法调用。
  418. 枚举既可以包含具体方法,也可以包含抽象方法。 如果枚举类具有抽象方法,则枚举类的每个实例都必须实现它。
  419. 案例:
  420. """
  421. enum Color{
  422. RED,BLUE,GREEN;
  423.  
  424. //构造函数
  425. private Color(){
  426. System.out.println("Constructor called for:"+this.toString());
  427. }
  428.  
  429. public void colorInfo(){
  430. System.out.println("Universal Color");
  431. }
  432. }
  433. public class Test{
  434. public static void main(String[] args){
  435. Color c1 = Color.RED;
  436. System.out.println(c1);
  437. c1.colorInfo();
  438. }
  439. }
  440.  
  441. """
  442.  
  443. 案例:
  444. """
  445. enum Color{
  446. RED{
  447. public String getColor(){//枚举对象实现抽象方法
  448. return "红色";
  449. }
  450. },
  451. GREEN{
  452. public String getColor(){//枚举对象实现抽象方法
  453. return "绿色";
  454. }
  455. },
  456. BLUE{
  457. public String getColor(){//枚举对象实现抽象方法
  458. return "蓝色";
  459. }
  460. };
  461. public abstract String getColor();//定义抽象方法
  462. }
  463. //主函数
  464. public class Test{
  465. public static void main(String[] args) {
  466. for (Color c:Color.values()){
  467. System.out.print(c.getColor() + "");
  468. }
  469. }
  470. }
  471.  
  472. """

Java 包(package)

为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间。

包的作用

  • 1、把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。

  • 2、如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。

  • 3、包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。

Java 使用包(package)这种机制是为了防止命名冲突,访问控制,提供搜索和定位类(class)、接口、枚举(enumerations)和注释(annotation)等。

java学习笔记之OOP(二)的更多相关文章

  1. 疯狂java学习笔记之面向对象(二) - 成员变量与局部变量

    Java变量按其作用域可分为:成员变量和局部变量.注意:在Java中是没有全局变量这个概念的 一.成员变量: 成员变量是在类中定义的变量,具体可分为类变量与实例变量--有无static修饰 实例变量的 ...

  2. 【Java学习笔记之十二】Java8增强的工具类:Arrays的用法整理总结

    本文将整理 java.util.Arrays 工具类比较常用的方法:  本文介绍的方法基于JDK 1.7 之上.  1.  asList方法 @SafeVarargs public static &l ...

  3. java学习笔记-JavaWeb篇二

    JavaWEB篇二 45 HttpSession概述46 HttpSession的生命周期 47 HttpSession常用方法示例48 HttpSessionURL重写 49 HttpSession ...

  4. Java学习笔记(十二)——eclipse和SVN配置,导入SVN服务器项目

    [前面的话] 北京的天气外加自己的不小心终于病了,在病的过程中,感觉身体好着真好,可以学习,可以吃好吃的,可以去运动,这一病了,干什么都感觉没有力气,身体好着真好. 这个文章的背景是:领导把项目最开始 ...

  5. Java学习笔记【十二、网络编程】

    原计划的学习结束时间是3月4日,目前看来已经延迟了,距离低标还差一些,多方面原因,也不找借口,利用周末赶赶进度,争取本周末把低标完成吧! 参考: http://www.runoob.com/java/ ...

  6. Java学习笔记——设计模式之二.策略模式

    明确是王道 --Clean Code 先定义策略类 package cn.no2.strategy; public abstract class Strategy { //省略属性 //算法方法 pu ...

  7. 【Java学习笔记之三十二】浅谈Java中throw与throws的用法及异常抛出处理机制剖析

    异常处理机制 异常处理是对可能出现的异常进行处理,以防止程序遇到异常时被卡死,处于一直等待,或死循环. 异常有两个过程,一个是抛出异常:一个是捕捉异常. 抛出异常 抛出异常有三种形式,一是throw, ...

  8. Java学习笔记记录(二)

    1.复合语句 if条件语句 使用场景:boolean类型判断.一个范围的判断.几个常量值的判断 有左大括号就没有分号,有分号就没有左大括号. 如下: public class demo1 { stat ...

  9. Java学习笔记(十二):java编译跨平台运行原理

    class文件由java源代码通过javac编译器编译生成,只能为JVM所识别.

随机推荐

  1. 【VBA】MsgBox用法

    MsgBox用法: Sub subMsgBox() Dim iok As Byte iok = MsgBox("是否XXX", vbYesNoCancel + vbQuestion ...

  2. 『言善信』Fiddler工具 — 15、使用Fiddler抓取HTTPS请求

    目录 1.Fiddler抓取HTTPS过程 2.拓展:SSL/TLS证书握手原理 3.Fiddler抓取HTTPS原理总结 4.Fiddler抓取HTTPS设置 步骤1:配置证书 步骤2:勾选设置 5 ...

  3. 干货 | LuatOS BSP移植教程,简单到复制粘贴!!!

    LuatOS本着自身的开源特性,可以很轻松的嵌入到很多微处理器和微控制器.今天简要讲下如何移植这套系统,上手比较简单,看完基本就会了. 要想做移植,就要先了解需要移植芯片的SDK,LuatOS依赖于F ...

  4. VBS脚本编程(5)——过程与函数

    过程是构成程序的一个模块,往往用来完成一个相对独立的功能.过程可以使程序更清. Sub过程与Function函数的区别: Sub没有返回值,Function有返回值: Sub不能放在表达式中,Func ...

  5. Sublime Text 4 破解笔记

    Sublime Text 4 破解笔记 偶然看到Sublime已经更新到版本4了,多了许多很nice的新特性,例如: 船新 UI 感知上下文的自动补全 支持 TypeScript, JSX 和 TSX ...

  6. hive学习笔记之四:分区表

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  7. ceph-csi源码分析(7)-rbd driver-IdentityServer分析

    更多 ceph-csi 其他源码分析,请查看下面这篇博文:kubernetes ceph-csi分析目录导航 ceph-csi源码分析(7)-rbd driver-IdentityServer分析 当 ...

  8. SAI常用快捷键大全

    一.默认常用工具快捷键如下: N 铅笔 B 喷枪 V 笔 X 前/背景色切换 - 前景色与透明色切换 C 水彩笔 A 选区笔 S 选区擦 D 清空当前图层 F 向下转写 (当前图层内容合并至下层,该层 ...

  9. 重新整理 .net core 实践篇————缓存相关[四十二]

    前言 简单整理一下缓存. 正文 缓存是什么? 缓存是计算结果的"临时"存储和重复使用 缓存本质是用空间换取时间 缓存的场景: 计算结果,如:反射对象缓存 请求结果,如:DNS 缓存 ...

  10. 巧用SpringBoot扩展点EnvironmentPostProcessor

    我们的项目是单体项目,使用的是springboot的框架,随着对接的外部服务越来越多,配置文件越来越臃肿..我们将对接的外部服务的代码单独抽离出来形成service依赖,之后以jar包的形式引入,这时 ...