第三章 第3节 面向对象进阶

封装意义:

封装的意义在于保护或者防止代码(数据)被我们无意中破坏。

保护成员属性,不类以外的程序直接访问和修改。

原则:隐藏对象的属性和实现细节,仅对外公开访问方法,并且控制访问级别

方法:setter,getter,在其中进行判断,

一般对所有属性进行private封装。

this 关键字:指的是当前对象

this.name = name

this.age = age

更容易见名知意,一 一对应。

在Java基础中,this关键字是一个最重要的概念。使用this关键字可以完成以下的操作:
· 调用类中的属性
· 调用类中的方法或构造方法
· 表示当前对象

如果在一个构造方法中调用了另一个构造方法,一定要写在第一行

static 关键字:

静态修饰的方法,被调用时,有可能对象还未创建

被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访

问。并且不会因为对象的多次创建, 而在内存中建立多份数据.

在访问时: 静态不能访问非静态 , 非静态可以访问静态 !

static 可以用来修饰 这个类都具有同一个值的属性,这样方便直接修改。例如:

你们班级的所有人,都是同一个学校同一个班级,比如说你把默认值设置成“北京小学001班‘,那如果你们班级或者学校改名了,总不能把默认值改了之后,再重新生成你们班所有学生,这时用static修饰这个属性,就可以方便的更改所有人的这个属性。见代码:

  1. public class StudentTest {
  2. public static void main(String[] args) {
  3. Student.company = "xx公司";
  4. Student.subject = "xx业务组";
  5. Student student1 = new Student("小明");
  6. Student student2 = new Student("小王");
  7. Student student3 = new Student("小李");
  8. Student student4 = new Student("老王");
  9. // 输出个人信息
  10. student1.say();
  11. student2.say();
  12. student3.say();
  13. student4.say();
  14. // 修改公司和业务
  15. Student.company = "神马公司";
  16. Student.subject = "神马业务组";
  17. // 输出个人信息
  18. student1.say();
  19. student2.say();
  20. student3.say();
  21. student4.say();
  22. }
  23. }
  24. public class Student {
  25. private String name;
  26. private String sex;
  27. private int age;
  28. private String hobby;
  29. static String company;
  30. static String subject;
  31. // 无参构造方法,初始化为默认值
  32. Student(){
  33. this.name = "无";
  34. this.age = 18;
  35. this.sex = "男";
  36. this.hobby = "无";
  37. }
  38. // 单参数构造方法
  39. Student(String name){
  40. this.name = name;
  41. this.age = 18;
  42. this.sex = "男";
  43. this.hobby = "无";
  44. }
  45. // 描述个人信息
  46. void say(){
  47. System.out.println("----个人信息-----");
  48. System.out.println("姓名:" + name);
  49. System.out.println("年龄:" + age);
  50. System.out.println("性别:" + sex);
  51. System.out.println("爱好:" + hobby);
  52. System.out.println("公司:" + company);
  53. System.out.println("学科:" + subject);
  54. }
  55. }
  56. /*
  57. ----个人信息-----
  58. 姓名:小明
  59. 年龄:18
  60. 性别:男
  61. 爱好:无
  62. 公司:xx公司
  63. 学科:xx业务组
  64. ----个人信息-----
  65. 姓名:小王
  66. 年龄:18
  67. 性别:男
  68. 爱好:无
  69. 公司:xx公司
  70. 学科:xx业务组
  71. ----个人信息-----
  72. 姓名:小李
  73. 年龄:18
  74. 性别:男
  75. 爱好:无
  76. 公司:xx公司
  77. 学科:xx业务组
  78. ----个人信息-----
  79. 姓名:老王
  80. 年龄:18
  81. 性别:男
  82. 爱好:无
  83. 公司:xx公司
  84. 学科:xx业务组
  85. ----个人信息-----
  86. 姓名:小明
  87. 年龄:18
  88. 性别:男
  89. 爱好:无
  90. 公司:神马公司
  91. 学科:神马业务组
  92. ----个人信息-----
  93. 姓名:小王
  94. 年龄:18
  95. 性别:男
  96. 爱好:无
  97. 公司:神马公司
  98. 学科:神马业务组
  99. ----个人信息-----
  100. 姓名:小李
  101. 年龄:18
  102. 性别:男
  103. 爱好:无
  104. 公司:神马公司
  105. 学科:神马业务组
  106. ----个人信息-----
  107. 姓名:老王
  108. 年龄:18
  109. 性别:男
  110. 爱好:无
  111. 公司:神马公司
  112. 学科:神马业务组
  113. */

同时,还适用于每次创建对象时要给它一个递增的编号,那就可以把编号用static修饰。

包:

不导包,可以用类的全名称

有些类不用导包就能用,比如 String等,这些是内置包。

权限修饰符:

常用的就是 public 和private

代码块:

普通代码块:

就是{}括起来的区域。

构造代码块:

在类中的成员代码块, 我们称其为构造代码块, 在每次对象创建时执行, 且执行在构造方法之前。

区别于构造方法的是:

无论用户调用哪一个构造方法来创建对象,构造代码块都必然执行

静态代码块:

在类中使用static修饰的成员代码块, 我们称其为静态代码块, 在类加载时行。 每次程序启动到关闭 ,只会执行一次的代码块。

随着类的加载(第一次使用),静态代码块执行。因为类只加载一次,所以静态代码块只执行一次。

面试题:

构造方法 与 构造代码块 以及 静态代码块的执行顺序:
静态代码块 —> 构造代码块 —> 构造方法

main方法详解:

main()方法一直写到了今天:
public static void main(String args[])
以上的各个参数的含义如下:
· public:表示公共的内容,可以被所有操作所调用
· static:表示方法是静态的,可以由类名称直接调用。java StaticDemo09
· void:表示没有任何的返回值操作
· main:系统规定好的方法名称。如果main写错了或没有,会报错:NoSuchMethodError: main
· String[] args:字符串数组,接收参数的

演示:测试这段代码

  1. public class Test {
  2. public static void main(String[] args) {
  3. for (String arg : args) {
  4. System.out.println(arg);
  5. }
  6. }
  7. }

String[] args 接收命令参数,什么也不输入,就什么也不输出,输入数字什么的,要用空格隔开,接收进来的就是一个字符串数组。

对于本来就有空格的字符串,要用””括起来,才能输出你想要的:

否则,输出的就是按空格分割的: