eg:
1 public class TestParameter2{ 2 3 /** 4 *定义了形参可变的方法 5 */ 6 public static void test(int a, String... books){ 7 for(String tmp : books){ 8 System.out.println(tmp); 9 } 10 System.out.println(a); 11 } 12 13 public static void main(String[] args){ 14 //掉用testfangfa 15 test(56, "谁的青春不迷茫", "心之所向"); 16 } 17 } 18 19 /*运行结果 : 20 谁的青春不迷茫 21 心之所向 22 56*/ View Code在最后一个形参类型后加 ... ,则表明该形参可以接受多个参数值长度可变形参在一个方法中最多只能有一个,而且只能放在最后 7. Java的函数重载 函数名相同,形参列表不同(至于其他部分,函数返回值、修饰符部分与函数重载无关)不能用函数返回值来区别函数重载不建议重载含有可变形参的函数,这样没有意义而且容易产生歧义
12. Java的单例化类:
1 class Singleton 2 { 3 //使用一个变量来缓存曾经创建的实例 4 private static Singleton instance; 5 6 //将构造器使用private修饰,隐藏该构造器 7 private Singleton(){} 8 9 //提供一个方法,用于返回Singleton实例 10 //该方法可以加入自定义控制,保证只产生一个Singleton对象 11 public static Singleton getInstance(){ 12 13 //如果instance为null则生成一个Singleton对象并储存起来 14 if(instance == null){ 15 instance = new Singleton(); 16 } 17 return instance; 18 } 19 } 20 21 public class TestSingleton{ 22 public static void main(String[] args){ 23 Singleton s1 = Singleton.getInstance(); 24 Singleton s2 = Singleton.getInstance(); 25 26 //本语句会打印出true, 说明s1和s2所指向的是同一个对象,两个引用的值是一样的(即Singleton只实例化了一次) 27 System.out.println(s1 == s1); 28 } 29 }final修饰局部变量: 系统不会对局部变量进行初始化,局部变量必须由程序员显式初始化final修饰的局部变量可以在定义时指定默认值,这样在之后的操作中就不能对该变量进行修改final修饰的局部变量在定义时若没有指定默认值,则在之后的操作中只能对其赋值一次,不能重复赋值final修饰基本类型和引用类型的区别 final修饰基本类型时本能重新赋值,因此不能改变(若在编译时就可以确定具体的值,则可当作常量来处理,要符合常量命名规范=>每个单词字母都要大写,单词之间用下划线分割开。eg. PUBLIC_STATIC_INSTANCE)final修饰引用类型时其保存的地址不能变,即其只能指向唯一的一个对象,但对象的具体内容可以改变final方法 final修饰的方法不可被重写final修饰的private方法在子类中可以出现相同方法名,相同形参列表,相同返回值的函数(因为这样不是重写,private修饰的方法也不会被重写,这样定义只是在子类中多了一个新方法而已)final修饰的方法只是不能被重写而已,并不是不能被重载 Test1: 1 class Person 2 { 3 final public void test(){} 4 } 5 6 class Student extends Person 7 { 8 public void test(){} 9 } 10 11 12 13 public class TestFinal 14 { 15 public static void main(String[] args) 16 { 17 System.out.println("Hello World!"); 18 } 19 } 20 21 22 /* 23 TestFinal.java:9: 错误: Student中的test()无法覆盖Person中的test() 24 public void test(){} 25 ^ 26 被覆盖的方法为final 27 1 个错误 28 请按任意键继续. . . 29 */ Test2: 1 class Person 2 { 3 final public void test(){} 4 //这样编译通过 5 final public void test(String arg){} 6 7 final private void test2(){ System.out.println("Person test2!!");} 8 } 9 10 class Student extends Person 11 { 12 //public void test(){} 13 14 //允许这样定义,这样并不是重写父类的函数 15 public void test2(){ System.out.println("Student test2!!!");} 16 } 17 18 19 20 public class TestFinal 21 { 22 public static void main(String[] args) 23 { 24 Person p = new Student(); 25 p.test2(); 26 } 27 } 28 29 /* 30 TestFinal.java:26: 错误: test2()可以在Person中访问private 31 p.test2(); 32 ^ 33 1 个错误 34 请按任意键继续. . . 35 36 标注:说明执行的还是父类的方法,test2方法并没有被Student类重写,因此没有多态性 37 */
final修饰的类不可以被继承 不可变类: 属性都是由final private 修饰, 只能提供getter方法,而不能提供setter方法提供带参构造器,用于根据传入参数初始化属性的值如果有必要要重写equal和hashCode方法注意:如果某个不可变类的一个属性是可变类,则其getter方法不能直接返回该属性(因为返回该引用之后就能对该引用指向对象的内容进行修改,这样就不能保证这是一个不可变类了),应该new一个新的对象(这个属性的新对象,而不是这个不可变类 的新对象),将这个属性copy一份仔返回缓存实例的不可变类: 1 public class CacheImmutale 2 { 3 private final String name; 4 private static CacheImmutale[] cache = new CacheImmutale[10]; 5 //记录缓存实例在缓存中的位置,cache[pos - 1]是最新缓存的实例 6 private static int pos = 0; 7 8 public CacheImmutale(String name){ 9 this.name = name; 10 } 11 12 public String getName(){ 13 return name; 14 } 15 16 public static CacheImmutale valueOf(String name){ 17 //遍历已缓存对象 18 for(int i = 0; i < 10; i++){ 19 //如果已有相同实例,直接返回该缓存实例 20 if(cache[i] != null && cache[i].getName().equals(name)){ 21 return cache[i]; 22 } 23 } 24 25 //如果缓存池已满 26 if(pos == 10){ 27 //把缓存的第一个对象覆盖,即把刚刚生成的对象放在缓存池最开始的位置 28 cache[0] = new CacheImmutale(name); 29 //把pos设为1 30 pos = 1; 31 return cache[0]; 32 }else{ 33 //把新建的对象缓存起来,pos加一 34 cache[pos++] = new CacheImmutale(name); 35 return cache[pos - 1]; 36 } 37 } 38 39 public boolean equals(Object obj){ 40 if(obj instanceof CacheImmutale){ 41 CacheImmutale ci = (CacheImmutale)obj; 42 if(name.equals(ci.getName())){ 43 return true; 44 } 45 } 46 return false; 47 } 48 49 50 public int hashCode(){ 51 return name.hashCode(); 52 } 53 54 public static void main(String[] args){ 55 CacheImmutale c1 = CacheImmutale.valueOf("hello"); 56 CacheImmutale c2 = CacheImmutale.valueOf("hello"); 57 58 //以下语句将会输出true 59 System.out.println(c1 == c2); 60 61 62 Integer i1 = Integer.valueOf(5); 63 Integer i2 = Integer.valueOf(5); 64 //以下语句将会输出true(八个封装类也是用一样的方式实现的缓存) 65 System.out.println(i1 == i2); 66 } 67 } 八个基本数据类型的封装类通过valueOf的方式创建的实例也是通过类似的方法缓存的 缓存有利有弊,如果这个类对象要被重复创建,则缓存利大于弊
转载于:https://www.cnblogs.com/qjm253/p/5745116.html
相关资源:林信良java学习笔记