java之面向对象下

来源:互联网 发布:淘宝快递包邮的秘密 编辑:程序博客网 时间:2024/06/06 06:36

jdk1.5实现了装箱和拆箱的功能,装箱允许把基本类型值直接赋给对应的包装类引用变量,拆箱允许把包装类对象赋值给对应的基本类型变量。

包装类可以实现基本类型变量和字符串之间的转换。把字符串类型的值转换成基本类型的值有两种方式:
1、利用包装类的parseXXX(String s)静态方法
2、利用包装类提供的Xxx(String s)构造器
String类则提供多个重载的valueOf()方法,用于将基本类型变量转换成字符串

包装类的实例变量实际上是引用类型
new Integer(2)==new Integer(2); false
但是可以直接将包装类的实例与数值类型的值进行比较。

系统将-128到127之间的整数自动装箱成Integer实例,并放入一个名为Cache的数组中缓存起来。如果把-128到127的整数自动装箱成一个Integer实例时,实际上直接指向Cache数组对应的数组元素
new Integer(6)>5.6;
Integer ina=2;
Integer inb=2;
System.out.println(ina==inb);//true
Integer ina=128;
Integer inb=128;
System.out.println(ina==inb);//false

重写equals方法时,if(obj!=null&&obj.getClass()==Test.getClass){},这里不要用instanceof,因为这里应该是同类,而不是同类或其子类。

final修饰的变量不可被改变,一旦获得了初始值,该final变量的值不能被重新赋值。
final修饰的成员变量必须由程序员现时的指定初始值。 final修饰的类变量要么在定义该类变量时指定初始值,要么在静态初始化块中指定初始值(不能再普通初始化块中)。final修饰的成员变量要么在定义该实例变量时指定初始值,要么在普通初始化块或构造器中指定初始值。

final修饰基本类型变量时,不能对基本类型变量重新赋值,因此基本类型变量不能改变。但对于引用类型变量来说,它只保证引用类型变量引用的地址不变,一直引用一个对象,但是对象完全可以发生改变。

当java程序直接使用形如”hello”的字符串直接量(包括可以在翻译时就计算出来的字符串值)时,JVM会使用常量池管理这些字符串;当使用new String(“hello”)时,JVM会使用常量池来管理”hello”字符串,然后再用构造其在堆中创建新的String对象,也就是说产生了2个对象

对于一个final变量来说,不它是类变量、实例变量还是局部变量,只要满足三个条件,这个final变量就不再是一个变量,而是相当于一个直接量,即定义宏变量,编译器会把程序中所有用到该变量的地方直接替换成该变量的值:
1、使用final修饰符修饰。
2、在定义final变量时指定了初始值。
3、该初始值在编译时就可以确定下来。
final int a=5;
System.out.println(a);
对于这个程序来说,a根本不存在,执行System.out.println(a);时转换成执行System.out.println(5);

String s1="疯狂java";String s2="疯狂"+"java";System.out.println(s1==s2);//trueString str1="疯狂";String str2="java";String str3=str1+str2;//str1,str2只是普通变量,无法在编译时确定str3的值System.out.println(s1==str2);//falsefinal String str11="疯狂";final String str12="java";String str13=str11+str12;System.out.println(s1==str13);//true,str13指向的是字符串池中缓存的"疯狂java"

final方法不能被重写,可以被重载。

抽象类
抽象类可以没有抽象方法,有抽象方法的只能被定义成抽象类。抽象类不能被实例化,无法用new关键字来调用抽象类的构造器创建抽象类的实例。抽象类的构造器主要用来被其子类调用的

子类必须实现抽象类的所有方法。

abstract修饰方法表示方法必须被重写,abstract修饰类表示类必须被继承,所以abstract和final不能同时使用。
static修饰是一个方法时,表明方法属于类本身,可以通过类来调用该方法,到那时如果定义成抽象方法,将导致通过这个类来调用方法时出现错误(调用一个没有方法体的方法),所以abstract和static不能同时使用。
abstract和private也不能同时使用。

接口
接口类将抽象进行的更彻底,里面的所有方法都是抽象方法。
接口里包含成员变量(只能是类变量)、方法(只能是抽象实例方法,类方法,或者默认方法)、内部类(包括内部接口、枚举)定义。
接口里的成员总是使用public static final修饰符。而且,接口成员没有构造器和初始化块,只能定义时指定默认值。
接口里的方法总是使用public abstract修饰符。普通方法不能有方法体,类方法和默认方法必须有方法体。

接口的用途:
1、定义变量,可用于进行强制类型转换。
2、调用接口中定义的常量。
3、被其他类实现。

接口可以多继承,用逗号隔开即可。
一个类可以继承一个类,实现多个接口,class A extends B implements C,implements D{}

接口体现的是一种规范,对于接口的实现者而言,接口规定了实现者必须向外提供哪些服务,对于调用者而言,接口规定了调用者可以调用哪些服务,以及如何调用这些服务。
抽象类体现的是一种模板式设计。
接口不能提供方法实现,抽象类可以包括普通方法。
接口里只有类变量,抽象类可以定义普通成员变量。
接口里不含构造器,抽象类可以包含构造器,但不适用于创建对象,而是让其子类调用这些构造器完成属于抽象类的初始化操作。
接口不包含初始化块,抽象类包含初始化块。
一个类只能继承一个抽象类,但是可以实现多个接口。

内部类
外部类比内部类多三个修饰符:private,protected,static
外部类上一级程序单元是包,它只有2个作用域,包访问权限和公开访问权限,但是内部类作为外部类的成员,可以使用任意访问符。

非静态内部类
非静态内部类不能定义静态成员。
成员内部类的class文件形式:OuterClass$InnerClass。
非静态内部类实例必须寄生在外部类实例里,并且非静态内部类对象里保留了它所寄生的外部类的引用。所以非静态内部类可以直接调用外部类的private成员。
但是外部类不能调用非静态内部类private成员。只能显示创建非静态内部类对象来访问其实例成员。如果存在一个非静态内部类对象,则一定存在一个被他寄生的外部类对象。但是外部对象存在的话它不一定寄生了非静态内不能对象。

非静态内部类方法访问变量的顺序是:该名字局部变量、该名字内部类成员变量、该名字外部类成员变量。
this.成员名访问内部类成员、外部类类名.this.成员名访问外部内成员。

静态内部类
静态内部类是寄生在外部类本身,而不是外部类的实例种。当静态内部类对象存在时,不一定存在它寄生的外部类实例,静态内部类只有外部类的类引用。
静态内部类可以包括静态成员和非静态成员。
静态内部类不能访问外部类的实例成员,只能访问外部类的类成员。

外部类以外的地方定义非静态内部类
Out.In in =new Out().new In();
外部类以外的地方定义静态内部类
StaticOut.StaticIn in =new Out().StaticIn();

0 0
原创粉丝点击