Day9
今天了解可变长度参数,命令行参数,static关键字,访问控制修饰符,this,构造方法等。
1.可变长度参数
Java从JDK1.5以后,允许定义形参长度可变的参数从而允许为方法指定数量不确定的形参。如果在定义方法时在最后一个形参类型后增加3个点即(…);则表明该形参可以接受多个参数值,多个参数值会被当做数组传入。
使用场景:参数数量不确定(批量操作)
声明语法:type… args
可变长度参数最能出现在参数列表的最后,只能有一个。
示例:
//未知数量数求和
int add(int... nums) {
if (nums == null) {
return 0;
}
int total = 0;
for (int num : nums) {
total += num;
}
return total;
}
测试:
public class DemoTest {
public static void main(String[] args) {
Demo demo = new Demo();
System.out.println(demo.add(null));
System.out.println(demo.add());
System.out.println(demo.add(1,2,3));
int[] nums = { 1, 2, 3 };
System.out.println(demo.add(nums));
System.out.println(demo.add(new int[] { 1, 2, 3, 4 }));
}
}
结果为:
main的参数可以改为可变长度语法:
我们可以将public static void main(String[] args)改为public static void main(String… args),也能正常编译
2.命令行参数(了解即可)
从命令行传入给main方法的参数
形式1:java XXXX arg1 arg2 … argn。
形式2:从IDE 中Programe Arguments输入。
3.static关键字
在《Java编程思想》P86页有这样一段话: “static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。”
简而言之,一句话来描述就是: 方便在没有创建对象的情况下来进行调用(方法/变量)。 很显然,被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。 static可以用来修饰类的成员方法、类的成员变量,另外可以编写static代码块来优化程序性能。
使用场景和作用
1.修饰属性,该属性属于类(不是实例),访问时直接使用类.静态属性名,适合保存系统全局数据。
static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。
static成员变量的初始化顺序按照定义的顺序进行初始化。
2.修饰方法:直接使用类.方法()
在static环境不能直接使用非静态方法或属性,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。
静态一般是适用于实现公共功能,这种类称为工具类(XxxxUtils)
如果该方法不用访问非静态属性或方法,可以使用static
3.静态导入:在import后使用static导入其他类的静态成员
4.静态代码块:
static关键字还有一个比较关键的作用就是用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。 为什么说static块可以用来优化程序性能,是因为它的特性:只会在类加载的时候执行一次。
很多时候会将一些只需要进行一次的初始化操作都放在static代码块中进行。
5.静态类:修饰内部类。普通类是不允许声明为静态的,只有内部类才可以。被static修饰的内部类可以直接作为一个普通类来使用,而不需先实例一个外部类。
4.访问控制修饰符
在 Java 语言中提供了多个访问控制修饰符。
访问控制修饰符实际上可以理解为一种许可。
信息隐藏是 OOP 最重要的功能之一,也是使用访问修饰符的原因。在编写程序时,有些核心数据往往不希望被用户调用,需要控制这些数据的访问。
对类成员访问的限制是面向对象程序设计的一个基础,这有利于防止对象的误用。只允许通过一系列定义完善的方法来访问私有数据,就可以(通过执行范围检查)防止数据赋予不正当的值。例如,类以外的代码不可能直接向一个私有成员赋值。同时,还可以精确地控制如何以及何时使用对象中的数据。
当正确实现对类成员的方法控制后,类就可以创建一个可用的“黑箱”,其内部动作不会被打开而任意篡改。
访问控制符是一组限定类、属性或方法是否可以被程序里的其他部分访问和调用的修饰符。类的访问控制符只能是空或者 public,方法和属性的访问控制符有 4 个,分别是 public、 private、protected 和 default,其中default 是一种没有定义专门的访问控制符的默认情况。访问控制修饰符的权限如下:
作用:对代码里的属性或方法进行封装,体现出安全性
public
可以修饰类,属性,方法,作用是在系统的任何代码中都可以访问到
protected
用保护访问控制符 protected 修饰的类成员可以被三种类所访问:该类自身、与它在同一个包中的其他类以及在其他包中的该类的子类。使用 protected 修饰符的主要作用,是允许其他包中它的子类来访问父类的特定属性和方法,否则可以使用默认访问控制符。
默认(default)
指的是一种场景,既类中成员没有被访问修饰符修饰,所以属于(default)的情况,效果是该类只能被同一个包中的类访问和引用,而不能被其他包中的类使用,即使其他包中有该类的子类。这种访问特性又称为包访问性(package private)。
private
修饰类(只能是内部类),属性,方法 只能在本类中访问。因此,private 修饰符具有最高的保护级别。
使用场景:
类:绝大部分类都是public修饰的,在一个Java文件中最多只能有一个public类,而且文件名与该类的类名一致。
方法:尽可能把访问范围变小,实际开发中大部分还是public
属性:绝大部分是private
5.this:
在运行时表示当前实例,写代码时可以使用this访问本类的属性或方法
用在普通方法和构造方法中
普通方法和构造方法中:使用this.field/method 本类中的属性或方法
构造方法: this(…),表示调用其他形式的构造方法,而且这句话必须出现在第一行.
注:不能用于static环境.
6.构造方法(重点)
语法:方法名与类名一致,没有返回值类型
特点:
如果类中没有显式的构造方法,编译器会自动提供一个。(无参,访问控制修饰符与类一样)
如果自己提供了一个显式的构造方法,编译器不会自动提供默认的构造方法。
作用:分配内存空间,对属性进行初始化(效果与set方法一样)
调用:使用new关键字调用构造方法最常见