Java面向对象笔记(二)

来源:互联网 发布:mac sass安装教程 编辑:程序博客网 时间:2024/04/28 15:07

继续继续~(~ ̄▽ ̄)~
Java提供了8种基本数据类型包装类:

  1. byte:Byte
  2. short:Short
  3. int:Integer
  4. long:Long
  5. char:Character
  6. float:Float
  7. double:Double
  8. boolean:Boolean
    这八个包装类除了Character 还可以通过传一个字符串老创建对象。
    还可以实现基本类型变量和字符串之间的转换。把字符串类型的值转换为基本类型的值有两种方式:
    一、利用其提供的parseXxx(String)静态方法(除了Character).
    二、利用包装类提供的Xxx(String)构造器(=new Integer(“hello 小明”))
    把基本数据类型转换为字符串:
    一、String类提供的valueof()方法:String a=String.valueof(“呵呵”);
    二、直接:String=15+”“;
    注意:包装类的实例可以与数值类型的值惊醒比较,这种比较为取出实例中的数进行比较的。但是两个包装类实例比较就不同了,你懂得。
    Integer a=1;Integer b=1; 这俩相等;
    Integer a=128;Integer b=128; 这俩不等;
    这种自动装箱方式,会将两个规定范围内的相同的两个数引用数组中的同一个元素(数组是在Integer源码中),若超出范围,系统总会重新创建一个Integer实例。
    包装类中还有静态方法compare(xxx a,xxx b)来比较两个基本值类型大小。包括boolean true>false
    toString()
    这是Object里的一个实例方法,所以任何类都可以重写此方法,类似的常用的还有equals(Object obj)。这是一个自我描述的方法,Object中的toString是返回该对象的”类名+@+hashCode”值,这个描述的啥我也不懂,所以有必要的话一般就自己重写吧。


    ==与equals方法:
    基本类型的值比较用==判断两个值是否相等,而对于引用类型的比较,==只是比较两个引用是否指向同一个对象。
    注意一个地方:String a=”我是帅哥”与String a=new String(“我是帅哥”)的区别,对于前者那种字符串直接量来说(或者在编译时就能确定的字符串值),JVM虚拟机会将这个“我是帅哥”用常量池来管理;当使用new String(“我是帅哥”)时就会先用常量池先管理“我是帅哥”这个直接量。然后再调用String构造器来创建一个新的String对象,此对象保存在内存中,也就是说new String(“我是帅哥”)总共产生了两个对象。
    常量池:专门用于管理在编译期被确定并保存在已编译的.class文件中的一些数据,它包括关于类、方法、接口中的常量,还包括字符串常量。JVM保证相同的字符串直接量只有一个,不会产生多个副本,如
    String a=”我是帅哥”;
    String b=”我是”+”帅哥”;
    a与b就引用的一个字符串,在编译期就可以确定下来。而new String(“我是帅哥”)就是运行时创建出来的,它保存在运行时内存(堆内存)
    .equals():Object中的此方法与==没区别,所以String重写了此方法,判断所指两个字符串字符序列是否相同。重写equals方法应满足几个条件:1自反性:对任意x,x.equals(x)一定返回true
    2对称性:对任意x与y,如果y.equals(x)返回true,则x.equals(y)也返回true
    3传递性:对任意x,y,z,若x.equals(y)返回true,y.equals(z)返回true,则x.equals(z)则一定返回true。
    4一致性:对任意的x和y,如果对象中用于等价比较的信息没有改变,那么无论调用x.equals(y)多少次,返回结果应该保持一致,要么一致true要么一直false
    5对任何不是null的X,x.equals(null)一定返回false。


    类成员:注意对象根本不拥有类属性,只是目前实例可以调用而已。即使某个实例为null,他也可以照样调用他所属的类的类属性或方法。若null对象调用实例方法和属性会导致空指针错误,这在我的上一篇Java实现员工管理系统中就可能会遇到这种问题,由于对象数组动态初始化,系统默认元素为null。
    单例类:只能创建一个实例。 所以需要private修饰的构造器,public的静态方法创建对象,使用一个静态成员变量保存创建的对象。
    final:可以修饰类,变量,方法。java规定final修饰的成员变量必须显式的指定初始值,指定初始值的地方如下:
    类field:静态初始块或声明该field时,若声明该field时没初始化,则必须在静态初始化快中指定值(下同,不过换成普通初始化块中)。
    局部变量也是必须显示指定初始值。注意。如果final修饰的为引用变量,则final只保证这个引用所指地址不变,但是所指对象会不会变就不一定了。
    宏替换:如果属性为final修饰,并指定初值,且在编译时就能确定下来,那么这个属性就不再是变量而是直接量,也叫宏变量,编译器会把程序中所有用到此变量的地方替换成该变量的值。
    final修饰的方法仅仅是不能重写不代表不能重载,若在此final修饰的方法谴用private修饰,则子类可以写个与父类此方法同名的方法,但这是新方法,并不是重写。
    final修饰的类不能有子类。比如java,lang.Math就是一个final类
    不可变类:对象创建后,该实例的field不能改变。
    如需自定义不可变类遵循如下原则:
    一、使用private和final修饰该类的field
    二、提供带参数的构造器,根据参数初始化类里的field
    三、仅仅为该类的field提供getter方法,即使有setter也改不了,还会报错,因为属性为private。
    四、有必要时重写hashCode和equals方法


    抽象类:
    用abstract修饰,抽象方法也必须用abstract修饰,不能被实例化,抽象类可以包括field,方法,构造器,初始化块,内部类,枚举类。
    抽象类必须含有抽象方法,或是未完全实现父抽象类或接口的方法。抽象方法用abstract修饰,将方法体的花括号去了。
    abstract修饰方法时希望被重写的 所以与final和private不能同时用。不能再抽象方法前用static。利用抽象类和抽象方法可以更好的发挥多态。设计抽象类体现模板设计,父类的抽象方法依赖于一个抽象方法,而抽象方法推迟到子类实现。
    接口:
    更彻底的抽象类,只能含有抽象方法。体现规范。修饰符public或者没有。一个接口可以有多个父接口。但是接口只能继承接口,不能继承类。
    接口里的field必须是常量,系统总会对接口里的field加上static和final修饰符,在接口里定义内部类,接口、枚举类默认采用public static修饰,即使没加,系统也会自动加上。接口继承与类继承不同,接口完全可以支持多继承:extends接口一,接口二。接口不能创建对象,但可以用于声明引用类型变量,必须引用其实现类的对象。
    接口与抽象类的区别:
    一、接口只能包含抽象方法,抽象类可以有普通方法。
    二、接口里不能定义静态方法,抽象类里可以。
    三、接口里只能定义静态常量,不能定义普通常量,抽象类既可以定义普通属性,亦可以定义静态常量。
    四、接口里不含构造器,抽象类里可以包含构造器,抽象类的构造器不用于创建对象,而是让子类调用这些构造器来完成抽象类的初始化操作。
    五、接口里不能包含初始化块,抽象类里可以有。
    六、一个类只能有一个直接父类,抽象类也是;但是接口可以继承多个接口。


    内部类:
    可以提供更好的封装:内部类成员可以直接访问外部类的私有数据,但是外部类不可以访问内部类的实现细节,属性等。匿名内部类跟适合那种用一次就不用的类。一般内部类被称为成员内部类,属于类成员,但是局部内部类和匿名内部类则不是类成员。这样的成员内部类是在外部类的类体里面,与相互独立两个类写在一个java文件不同。成员内部类可以使用任意访问控制符。编译有内部类的外部类会产生至少两个class文件。一个是外部类本身的class文件,还有就是OuterClassInnerClass.classthis.this访访使访使Java使publicstatic使protected使使OuterClass.InnerClassNameOuterInstence.newInnerConstructor();Out.Inin=newOut().newIn();newOuterClass.InnerConstructor()使使访Java.classclass符号后多了个序号。
    匿名内部类:一、必须继承一个父类。二、由于创建匿名内部类时就要创建一个对象,所以不能为抽象类。三,不能定义构造器,只有一个空的无参构造器但是可以吧构造器中要初始化的东西写在初始化块里,但如果继承父类来创建匿名内部类时,匿名内部类可拥有父类同参数列表的构造器。匿名内部类访问外部类的局部变量时,该局部变量必须使用final修饰符。
    枚举类:一个类的对象有限且固定,实现枚举类:private将构造器隐藏
    把这个类可能实现的实例用public static final修饰该类的变量来保存。如果有必要可以提供一些静态方法,使其他程序可以获取对应的实例。用enum关键字代替Class,枚举类继承的是java.lang.enum类而不是Object。用enum定义枚举类默认会使用final修饰,因此此类不能派生子类。构造器private修饰。枚举类的所有实例必须在第一行显示添加,列举这些实例时系统会自动添加public static final.所有枚举类否提供了一个values方法,用于遍历枚举值。 包含抽象方法的枚举类每个枚举值必须实现抽象方法,该枚举类也不必添加abstract。

0 0