观察几个类的设计之后,对面向对象编程思路有了更进一步的理解。
    虽然类由成员变量和方法组成,且成员变量可以理解为对象的属性、方法可以理解为操纵属性的功能组合。但实际编程中不必太拘泥于此设计,类的设计可以理解为:变量+方法
    变量分为:类共享的静态变量、对象独有的成员变量
    变量都是为方法服务,如果某一方法需要一个变量实现功能,那么变量就可以直接写在类变量的位置,对象创建了成员变量就创建了。
    虽然是类中,但完全可以类比成正常面向过程编程的顺序,抛开类的概念,变量就是变量,方法就是方法,只不过面向过程的变量是全局,面向对象的变量有一定限制。

    1. public class TestTurnPrint {
    2. public static void main(String[] args) {
    3. WaitNotify wn= new WaitNotify(1,5);//多个线程共享这一份对象
    4. new Thread(()->{
    5. try {
    6. wn.print("a",1,2);
    7. } catch (InterruptedException e) {
    8. e.printStackTrace();
    9. }
    10. }).start();
    11. new Thread(()->{
    12. try {
    13. wn.print("b",2,3);
    14. } catch (InterruptedException e) {
    15. e.printStackTrace();
    16. }
    17. }).start();
    18. new Thread(()->{
    19. try {
    20. wn.print("c",3,1);
    21. } catch (InterruptedException e) {
    22. e.printStackTrace();
    23. }
    24. }).start();
    25. }
    26. }
    27. /*
    28. 输出内容 等待标记 下一个标记
    29. a 1 2
    30. b 2 3
    31. c 3 1
    32. */
    33. class WaitNotify{
    34. //等待标记
    35. private int flag;
    36. //循环次数
    37. private int loopNumber;
    38. //构造方法
    39. public WaitNotify(int flag,int loopNumber){
    40. this.flag=flag;
    41. this.loopNumber=loopNumber;
    42. }
    43. //核心方法-打印
    44. public void print(String str,int waitFlag,int nextFlag) throws InterruptedException {
    45. for(int i=0;i<loopNumber;i++){
    46. synchronized (this){
    47. while(flag!=waitFlag){
    48. this.wait();
    49. }
    50. System.out.println(str);
    51. flag=nextFlag;
    52. this.notifyAll();
    53. }
    54. }
    55. }
    56. }