- 字段不存在覆盖这个概念,只有方法才有覆盖。如果子类父类具有相同的字段,那么这种现象称之为隐藏,且输出结果不同。
1 class SuperClass{ 2 public String name="Super Name"; 3 public void doWork(){ 4 System.out.println("Super Do Work"); 5 } 6 } 7 class SubClass extends SuperClass{ 8 public String name="Sub Name"; 9 public void doWork(){ 10 System.out.println("Sub Do Work"); 11 } 12 } 13 public class J3_OOP { 14 public static void main(String[] args) { 15 SuperClass clz=new SubClass(); 16 clz.doWork(); 17 System.out.println(clz.name);//Super Name 18 } 19 }
子类父类具有相同字段时,无论什么修饰符,都会在各自的内存空间中存储数据。
上述例子中,第十五行初始化实例的时候,clz是指向SuperClass的,所以调用name的时候,用的是父类的name.
- 代码块变量
- 用{}表示代码块的范围,其作用域就在{}里面。
- 代码块分三种形式:局部代码块(直接定义在方法内部),构造代码块(直接定义在类中),静态代码块(static修饰,主方法执行前,执行静态代码块,且只执行一次,因为静态成员随着字节码的加载而加载,因为main方法需要JVM调用,所以是在静态代码块加载之后)
1 class DemoBlock{ 2 { 3 System.out.println("构造代码块"); 4 } 5 DemoBlock(){ 6 System.out.println("构造器"); 7 } 8 static { 9 System.out.println("静态代码块"); 10 } 11 } 12 //main 方法中 13 new DemoBlock();//静态代码块 构造代码块 构造器 14 new DemoBlock();//构造代码块 构造器
3. 静态代码块用于初始化操作,加载配置文件和资源。比如,初始化这个类,那么通过提前加载进JVM,可以节省时间,调用也方便。
4. 有一个关于初始化加载顺序的面试题:参见http://www.cnblogs.com/JonathanC/p/8330411.html。记住static修饰的初始化,在static代码块进行;非static修饰的,在构造器内进行。
- Final修饰符。因为继承会破坏封装,所以使用final修饰,是最终的,不可修改的。但是final不能修饰构造方法,因为构造方法是不被继承的,所以肯定是最终的。
- final修饰的类,不能有子类
- final修饰的方法,不能被子类覆盖。例如,父类具有统一的算法框架,此时可用final修饰。
- final修饰的变量,只能赋值一次。final是唯一可以修饰局部变量的修饰符。需要显示的给定初始值。
常量的命名规范:final修饰的常量,全部大写。
当final修饰基本类型变量:数据的值不能变,不能用"=”重载
当final修饰引用类型变量:数据的内存地址不能变。但是值可以变。如:
1 class person{ 2 public String name="AAA"; 3 } 4 5 //main方法中 6 7 final person A=new person(); 8 person.name="BBB"//没问题,可以修改堆中的name 9 A=new person()//有问题,会改变A的引用地址。
- 单例设计模式:
- 一个类在堆内存里面,只有一个对象。所有指向该类型实例对象的引用,都指向同一个内存空间。
- 创建步骤为:首先,在该类中,创建出一个对象。第二,私有化自身的构造器,防止外界通过构造器创建新的对象。第三,暴露一个静态公共的方法用于获取自身对象。
1 class ArrayUtil{ 2 private static ArrayUtil ulti=new ArrayUtil();//initialize a private instance 可以再加个final,因为util不会再变了。 3 private ArrayUtil() { 4 5 }//avoid being called by others 6 public static ArrayUtil getUlti() { 7 return ulti; 8 }//expose this method to get ulti 9 10 public void sort(String[] arr) { 11 System.out.println("sorting"); 12 }//method 13 }
- 工具类:表明存放了一系列方法的类,开发中只需要一份即可
- 第一类:如果工具类内的方法,没用static修饰,说明可以通过类的对象来调用。此时为单例设计。
- 第二类,如果工具类内的方法,用static修饰,说明使用类名即可调用,此时工具类的构造器需要私有化(因为底层每次调用的时候,会多创建一个对象,占用内存)。
- 基本类型的包装类
- 比基本类型具有更强大的功能,通过创建对象,包装基本类型的同时,还具有对象的特性。
- 主要有八大类型:Byte, Short, Integer, Long, Float, Character, Double, Boolean。
1 //装箱操作 2 Integer num1=new Integer(19);//覆盖了Object中的toString方法,所以打印出来的是值。 3 //拆箱操作 4 int num2=num1.intValue(); 5 System.out.println(num1==num2);//true 6 //自动装箱 7 Integer a=10; 8 //自动拆箱 9 int b=a;//语法糖,底层还是手动转换的。 10 System.out.println(b);
3. Object可以接受一切数据类型
1 //object可以接受一切数据类型值 2 Object obj=100; 3 Object[] arr= {100,"AAA",10.2,true}; 4 System.out.println(arr[2]);
浙公网安备 33010602011771号