Java程序设计—面向对象0122

Posted on 2018-01-23 23:46  Jonathan_C  阅读(146)  评论(0)    收藏  举报
  • 字段不存在覆盖这个概念,只有方法才有覆盖。如果子类父类具有相同的字段,那么这种现象称之为隐藏,且输出结果不同。
 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.

  • 代码块变量
  1. 用{}表示代码块的范围,其作用域就在{}里面。
  2. 代码块分三种形式:局部代码块(直接定义在方法内部),构造代码块(直接定义在类中),静态代码块(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不能修饰构造方法,因为构造方法是不被继承的,所以肯定是最终的。
  1. final修饰的类,不能有子类
  2. final修饰的方法,不能被子类覆盖。例如,父类具有统一的算法框架,此时可用final修饰。
  3. 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. 一个类在堆内存里面,只有一个对象。所有指向该类型实例对象的引用,都指向同一个内存空间。
  2. 创建步骤为:首先,在该类中,创建出一个对象。第二,私有化自身的构造器,防止外界通过构造器创建新的对象。第三,暴露一个静态公共的方法用于获取自身对象。
 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 }
  • 工具类:表明存放了一系列方法的类,开发中只需要一份即可
  1. 第一类:如果工具类内的方法,没用static修饰,说明可以通过类的对象来调用。此时为单例设计。
  2. 第二类,如果工具类内的方法,用static修饰,说明使用类名即可调用,此时工具类的构造器需要私有化(因为底层每次调用的时候,会多创建一个对象,占用内存)。
  • 基本类型的包装类
  1. 比基本类型具有更强大的功能,通过创建对象,包装基本类型的同时,还具有对象的特性。
  2. 主要有八大类型: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]);