一、内部类
内部类包含:(1)成员内部类 (2)静态内部类 (3)局部内部类 (4)匿名内部类
什么是内部类?
1、编译之后可以生成独立的字节码文件。
2、内部类可以直接访问外部类成员,而不破坏封装。
3、可为外部类提供必要的内部功能组件。
1、成员内部类
(1)在类的内部定义的类。与实例变量和实例方法同级别。
(2)外部类一个实例部分,创建内部类对象时,必须依赖外部类对象。
Outet out = new Outer();
Outer.Inner in= out.new Inner( );
(3)当外部类属性和内部类属性重名时,优先访问内部类属性。
(4)成员内部类不能定义静态成员。
//成员内部类的基本格式 就是
class Outside{
private String name = "张三";
private int age=15;
//成员内部类
class Inside{
private String phone = "123";
private int age;
public void show() {
//使用内部类属性
System.out.println(phone);
//使用外部类属性
System.out.println(name);
//访问同名属性格式,外部类名.this.属性名
System.out.println(Outside.this.age);
}
}
}
2、静态内部类
(1)不需要依赖外部对象,可以直接创建和通过类名访问。
(因为static的全局性)可以声明静态成员。
sInside is = new Inside();
(2)只能访问外部类的静态成员(实例成员需要实例化外部类对象)。
Outer.Inner in = new Outer.Inner( );
3、局部内部类
(1)定义在外部类方法中,作用范围和创建对象范围仅限于当前方法。
(2)局部内部类访问外部类当前方法中的局部变量的时候,因为无法保障变量生命周期,所以,变量必须修饰为Final。
(3)限制类的使用范围。
class Outer4{
private String name= "刘德华";
private int age =35;
public void show(final int i) {
// TODO Auto-generated method stub
String address = "深圳";
//这里address 默认为final 属性
class Inner{
private String phone ="8888888";
private String email = "liudehua@qq.com";
public void show2() {
//访问外部类的属性
System.out.println(Outer4.this.name);
//访问内部类的属性收
System.out.println(Outer4.this.age);
System.out.println(this.phone);
System.out.println(this.email);
}
}
Inner inner = new Inner();
inner.show2();
}
}
4、匿名内部类
(1)没有类名的局部内部类。
(2)必须继承一个父类或者实现一个接口。
(3)定义类,实现类、创建对象的语法合并。只能创建一个该类的对象。
优点:减少代码量。
缺点:可读性较差。
public interface Usb {
//服务
void service();
}
//使用匿名内部类优化(相当于创建了一个局部内部类)
Usb usb=new Usb() {
@Override
public void service() {
System.out.println("连接电脑成功了....");s
}
};
二、Object类
所有类的直接或间接父类。Object类中所有的方法,其他类都可以使用。
Get class():返回引用中存储的实际数据类型,一般用来比较两个引用中存储的对象类型是否一致。
Class class1=s1.getClass();
Class class2=s2.getClass();
if(class1==class2) {
System.out.println("s1和s2属于同一个类型");
}else {
System.out.println("s1和s2不属于同一个类型");
}
hashcode()方法:返回该对象的十进制哈希码值。哈希算法根据对象的地址或字符串和数据计算出来的int类型的数值。哈希码的数值并不唯一,只能保证同一返回相同的哈希码,尽量保证不同对象返回不同哈希码(因为取值高位原则)。
toString()方法:返回该对象的字符串表示。在许多方法中可以重写
toString()方法,以保证测试结果。
euqals( )方法:Object类中比较的是地址的值。在String 字符串中比较
的是值,因为String实现了重写。
重写equals( )方法,实现值比较的步骤。
@Override
public boolean equals(Object obj) {
//1判断两个对象是否是同一个引用
if(this==obj) {
return true;
}
//2判断obj是否null
if(obj==null) {
return false;
}
//3判断是否是同一个类型
//intanceof 判断对象是否是某种类型
if(obj instanceof Student) {
//4强制类型转换
Student s=(Student)obj;
//5比较熟悉
if(this.name.equals(s.getName())
&&this.age==s.getAge()) {
return true;
}
}
return false;
}
三、包装类
概念:基本数据类型对应的引用数据类型。默认值都是null。
类型转换方法:(1)parseXXX (2)Integer . valueof()。
整数缓冲区,已经创建了-128~127的256个数值。超过这个范围的每声明一次就重新开辟空间。
Integer i1 = 1;
Integer i2 = 1;
Integer i3 = 200;
Integer i4 = 200;
System.out.println(i1 = i2);//true
System.out.println(i3 = i4);//false
所有包装类中的比对也是用equals来比对。
包装类的数值比对,有一方是基础数据类型,另一方的包装类会进行自动拆箱转为基础数据类型进行比对
四、String类
String,是一个常量值,创建之后就不可以进行改变。一些基本的常用方法如下:
//根据下标获取字符
public char charAt(int Index)
//判断当前字符是否包含str
public boolean contains(String str)
//将字符串转换成数组
public char[] toCharArray()
//判断首次出现str的位置,存在返回下标志,不存在返回-1
public int indexOf(String str)
//去掉字符串前后空格,中间的去不掉
public String trim()
//根据str拆分字符串,返回的是数组类型
public String[] split()
可变字符串
概念:可在内存中创建可变的缓存空间,存储频繁改变的字符串。
若字符串不需要频繁变动,还是建议使用Striing存储。
StringBuilder和StingBuffer的区别
区别1:线程安全
StringBuilder线程是不安全的,在所有公开方法中没有加同步锁,
StringBuffer是线程安全的,在所有公开方法中都使用了同步锁。
区别2:缓冲区
Buffer每次获取字符串都会使用缓冲区的toStringCache来构造一个字符串。
Builder每次都复制一次字符数组,再构造一个字符串。
BigDecimal
在应用中需要准确的数值计算方式,使用BigDecimal.
创建方式:BigDecimal bd = new BigDecimal(" 1.0 ");
加:bd1.add(bd2);
减:bd1.subtract(bd2);
乘:bd1.multipy(bd2);
除:bd1.deivide(bd2);