面向对象进阶

封装Private

不封装程序会出现什么问题?类的成员属性容易被更改,导致输入一些不合逻辑的内容程序也能正常运行。如下面这张图,年龄被修改成负值,这是不符合实际事实的。

面向对象进阶 - 图1

封装的意义:
  • 保护或者防止代码(数据)被我们无意中破坏。
  • 保护成员属性,不要让类以外的程序直接访问和修改。封装原则

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

在开发中,为了避免出现逻辑错误,我们建议对所有属性进行封装,并使用set()和get()方法进行修改和读取操作

(被省略掉的)this关键字

在编写方法时,我们通常希望方法的形参与类的属性名字相同,但是这样子程序会报错。下面给出了我们目标的赋值方式。

面向对象进阶 - 图2

但这样的写法,实际形参只会给自己赋值,而不是给类的属性赋值

面向对象进阶 - 图3

要解决这个问题,我们需要在被赋值的类属性前面加上this. ,==this表示正在被创建/调用的对象。==其实this一直在类属性前面,只是一般情况下程序会把this隐藏起来。

面向对象进阶 - 图4

  • this 既可以调变量,也可以调函数方法。
  • 在无参构造方法中调用this()可以实现无参调用有参构造方法
  • 在一个构造方法中,调用另一个构造方法时,调用的代码 必须写在构造方法的第一行,否则会报错。错误实例如下

面向对象进阶 - 图5

创建getter和setter的快捷键:shift+alt+s

Static

  • static属性的变量存储在方法区。
  • 被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问
  • 可以这样去理解:把静态所修饰的属性看作是类的属性,是通过类去修改的;而非静态所修饰的属性看作对象的属性,是通过对象去修改的。
  • 因为对象是在类创建后才创建的,而static的资源是在类创建==(第一次使用类)==的时候就被加载的,所以静态资源被调用的时机早于非静态资源。
  • 第二次以后使用类都不会加载static的语句了!
  • 在访问时: 静态不能访问非静态 , 非静态可以访问静态 !

面向对象进阶 - 图6

面向对象进阶 - 图7

Static方法

面向对象进阶 - 图8

命名规范:通常由多个单词组成, 所有单词的字母小写, 单词与单词之间使用.隔开 ,一般命名为“com.公司名.项目名.模块名….”。

导包:import 包名.类名;

不用导的包:1.java.lang 2.当前包所含的其他类

权限修饰符

面向对象进阶 - 图9

代码块

构造代码块

作用:在一个类中,我们通常定义多个无参/有参的构造方法,以便重载。但是如果在每一个构造方法里都需要一个固定的操作,我们需要在构造方法中加入相应的代码,有多少个构造方法就需要重复写多少条代码。而构造代码块就是将这个固定的操作放在一个块中,从而不用重复写。

  1. /**
  2. * 构造代码块,随着对象的每次创建,执行一次,且执行在构造方法之前
  3. *
  4. * 区别于构造方法的是:
  5. * 无论用户调用哪一个构造方法来创建对象,构造代码块都必然执行
  6. */
  7. //构造代码块
  8. {
  9. System.out.println("对象创建时执行1");
  10. }

静态代码块

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

  1. /**
  2. * 静态代码块,随着类的加载(第一次使用),静态代码块执行。
  3. * 因为类只加载一次,所以静态代码块只执行一次。
  4. */
  5. //静态代码块
  6. static{
  7. System.out.println("静态代码块执行");
  8. }

面试题:

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

main方法详解

main()方法一直写到了今天:

public static void main(String args[])

  1. 以上的各个参数的含义如下:
  2. · public:表示公共的内容,可以被所有操作所调用
  3. · static:表示方法是静态的,可以由类名称直接调用。java StaticDemo09
  4. · void:表示没有任何的返回值操作
  5. · main:系统规定好的方法名称。如果main写错了或没有,会报错:NoSuchMethodError: main
  6. · String[] args:字符串数组,接收参数的
  1. public class StaticDemo10{
  2. public static void main(String args[]){
  3. for(int i=0;i<args.length;i++){
  4. System.out.println(args[i]) ;
  5. }
  6. }
  7. };

所有的参数在执行类的时候以空格进行分割。

java StaticDemo10 1 2 3 4 5 6 7

但是,如果现在我要输入的是以下几种参数“hello world”、“hello vince”、“hello mjw”

因为以空格分割,所以以上的三组参数会当做六组参数输入,那么此时如果要想完成有空格的内容输入,则参数需 要使用“””括起来。

java StaticDemo10 “hello world” “hello vince” “hello mjw”