面向对象进阶
封装Private
不封装程序会出现什么问题?类的成员属性容易被更改,导致输入一些不合逻辑的内容程序也能正常运行。如下面这张图,年龄被修改成负值,这是不符合实际事实的。
封装的意义:
- 保护或者防止代码(数据)被我们无意中破坏。
- 保护成员属性,不要让类以外的程序直接访问和修改。封装原则
隐藏对象的属性和实现细节,只对外公开访问方法,并且控制访问级别。
在开发中,为了避免出现逻辑错误,我们建议对所有属性进行封装,并使用set()和get()方法进行修改和读取操作
(被省略掉的)this关键字
在编写方法时,我们通常希望方法的形参与类的属性名字相同,但是这样子程序会报错。下面给出了我们目标的赋值方式。
但这样的写法,实际形参只会给自己赋值,而不是给类的属性赋值
要解决这个问题,我们需要在被赋值的类属性前面加上this. ,==this表示正在被创建/调用的对象。==其实this一直在类属性前面,只是一般情况下程序会把this隐藏起来。
- this 既可以调变量,也可以调函数方法。
- 在无参构造方法中调用this()可以实现无参调用有参构造方法
- 在一个构造方法中,调用另一个构造方法时,调用的代码 必须写在构造方法的第一行,否则会报错。错误实例如下
创建getter和setter的快捷键:shift+alt+s
Static
- static属性的变量存储在方法区。
- 被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问
- 可以这样去理解:把静态所修饰的属性看作是类的属性,是通过类去修改的;而非静态所修饰的属性看作对象的属性,是通过对象去修改的。
- 因为对象是在类创建后才创建的,而static的资源是在类创建==(第一次使用类)==的时候就被加载的,所以静态资源被调用的时机早于非静态资源。
- 第二次以后使用类都不会加载static的语句了!
- 在访问时: 静态不能访问非静态 , 非静态可以访问静态 !
Static方法
包
命名规范:通常由多个单词组成, 所有单词的字母小写, 单词与单词之间使用.隔开 ,一般命名为“com.公司名.项目名.模块名….”。
导包:import 包名.类名;
不用导的包:1.java.lang 2.当前包所含的其他类
权限修饰符
代码块
构造代码块
作用:在一个类中,我们通常定义多个无参/有参的构造方法,以便重载。但是如果在每一个构造方法里都需要一个固定的操作,我们需要在构造方法中加入相应的代码,有多少个构造方法就需要重复写多少条代码。而构造代码块就是将这个固定的操作放在一个块中,从而不用重复写。
/**
* 构造代码块,随着对象的每次创建,执行一次,且执行在构造方法之前
*
* 区别于构造方法的是:
* 无论用户调用哪一个构造方法来创建对象,构造代码块都必然执行
*/
//构造代码块
{
System.out.println("对象创建时执行1");
}
静态代码块
在类中使用static修饰的成员代码块, 我们称其为静态代码块, 在类加载时执行。 每次程序启动到关闭 ,只会执行一次的代码块。
/**
* 静态代码块,随着类的加载(第一次使用),静态代码块执行。
* 因为类只加载一次,所以静态代码块只执行一次。
*/
//静态代码块
static{
System.out.println("静态代码块执行");
}
面试题:
构造方法 与 构造代码块 以及 静态代码块的执行顺序: 静态代码块 —> 构造代码块 —> 构造方法
main方法详解
main()方法一直写到了今天:
public static void main(String args[])
以上的各个参数的含义如下:
· public:表示公共的内容,可以被所有操作所调用
· static:表示方法是静态的,可以由类名称直接调用。java StaticDemo09
· void:表示没有任何的返回值操作
· main:系统规定好的方法名称。如果main写错了或没有,会报错:NoSuchMethodError: main
· String[] args:字符串数组,接收参数的
public class StaticDemo10{
public static void main(String args[]){
for(int i=0;i<args.length;i++){
System.out.println(args[i]) ;
}
}
};
所有的参数在执行类的时候以空格进行分割。
java StaticDemo10 1 2 3 4 5 6 7
但是,如果现在我要输入的是以下几种参数“hello world”、“hello vince”、“hello mjw”
因为以空格分割,所以以上的三组参数会当做六组参数输入,那么此时如果要想完成有空格的内容输入,则参数需 要使用“””括起来。
java StaticDemo10 “hello world” “hello vince” “hello mjw”