Java面向对象(二)

1、基本数据类型的包装类:
     因为8种基本数据类型不是Object的子类,当需要使用基本数据类型的对象时,就要用到它们的包装类
基本数据类型的包装类:
包装类类型 对应的基本数据类型
Integerint
Bytebyte
Shortshort
Longlong
Floatfloat
Doubledouble
Characterchar
Booleanboolean 
在JDK 1.5之后提供自动装箱和自动拆箱的功能,如:
     Integer i = 5;
     int j = i;//直接将Integer对象赋给int基本数据类型
    
     将字符串转化为基本数据类型,使用parseXxx(String s)方法,或其构造器,如:
     int i = Integer.parseInt(s);
     int j = new Integer(s);
     将基本数据类型转化为字符串,使用String.valueOf()方法,或者直接将变量+“”。

包装类对象可以直接和基本数据类型进行比较,如:
     Integer i = new Integer(5);
     int j = 5;
     System.out.print(i==j);//输出true
但两个包装类进行比较只有当他们指向同一个对象时才会返回true
     System.out.print(new Integer(5) == new Integer(5));//输出false
所以一般比较两个包装类的大小使用compare(xxx val1,xxx val2)方法,如:
     Integer.compare(new Integer(5),new Integer(5));//值为true

     String s = “abc” ;和String s = new String(“abc”);的不同:
前者的字符串存放在常量池中,第一次编译就被确定,以后如有引用“abc”字符串直接在常量池中获取。后者在前者的基础上,还在堆内存中生成了一个字符串对象。

2、单例:
当某个类不允许自由地通过构造器来创建实例,而是只希望存在一个实例的时候,需要把这个类写成单例。关键步骤是:
     1.新建一个这个类的类型的类变量:private static Singleton instance;
     2.将该类的构造器使用private隐藏
     3.暴露一个getInstance()方法,在该方法中判断如果instance为null,则通过构造器生成一个这个类的对象给instance,否则直接返回instance。

3、final修饰符:
  • final可以用于修饰类、变量和方法,表示其一旦获得了初始值便不被重新赋值。
  • final修饰的变量必须显式地指定初始值。
  • final修饰引用变量时,只是指向对象的地址不能改变,即一直引用同一个对象,但该对象可能改变。
  • 如果final修饰的变量在初始时就给定了确定的初始值,则这个变量会被替换为宏变量
  • 在处理宏变量时,会直接替换为初始时赋给变量的值。如:
          final int a = 5;// 初始时就给定了确定的初始值,为宏变量
          System.out.println(a);
          System.out.println(5);//二者等价
          final String str = “张三” + String.valueOf(123);//调用了方法,不是宏变量
  • 用final修饰方法可以保证该方法不被子类重写
  • 用final修饰的类没有子类

4、抽象类:
抽象类主要是为了给其子类提供一个模板,避免子类设计的随意性
  • 抽象方法不能有方法体(即大括号{})
  • 使用abstract修饰的类/方法称为抽象类/方法
  • 抽象类不能被实例化
  • 抽象类可以包含普通方法,但只有抽象类才能包含抽象方法
  • 抽象类只能被继承,其子类如果不是抽象类的话,就必须重写父类所有的抽象法方法
  • abstract不能和final、private、static(除了内部类)同时使用
  • 抽象类中的普通方法里可以调用抽象方法

5、接口:
接口中可以定义抽象方法、类方法和默认方法。定义接口的基本语法如下:
[修饰符] interface 接口名 extends  父接口1,父接口2...
{
//静态常量
//抽象方法、类方法和默认方法
}
  • 修饰符可为public或省略,省略时为同一个包下可访问。
  • 接口命名规范和类一样
  • 接口可继承多个接口,但不可继承类
  • 接口里所有成员都是public访问权限(可省略public)
  • 接口中的常量必须使用public static final修饰(可省略public static final)
  • 接口中除了类方法和默认方法以外的方法都是abstract修饰(可省略abstract)
  • 默认方法用default修饰,实现该接口的对象都可以调用。

默认方法是Java8中的新特性, 它是 库/框架设计的程序员的后悔药 。对于以前的遗留代码,大家都不知道有这个新方法,既不会调用,也不会去实现,如同不存在;编写新代码的程序员可以将它视为 保底 的方法体。类型层次中任何符合override规则的方法,优先于默认方法,因为遗留代码可能正好有同样的方法存在。
默认方法,理论上抹杀了Java接口与抽象类的 本质区别——前者是契约的集合,后者是接口与实现的结合体 。当然,语法上两者的差别和以前一样。这就需要程序员来自觉维护两者的本质区别, 把默认方法作为库、框架向前兼容的手段 。(转自yqj2065的博客: http://blog.youkuaiyun.com/yqj2065/article/details/31356609
关于接口的默认方法:
  • 若实例本身的类里有该同名方法,接口的默认方法被忽略。
  • 若接口的子接口重写了父接口的默认方法,则调用子接口的方法。
  • 若接口的多个子接口都重写了父接口的同一个默认方法,则编译错误

6、内部类:
在一个类的内部的类成为内部类。其特点和作用如下:
  • 提供更好的封装,同一个包的其他类无法访问
  • 外部类无法直接访问内部类的变量,需要先实例化内部类对象。但内部类可以访问外部类的变量
  • 相比于外部类,内部类可用private、protected、static修饰符
  • 只有用static修饰的内部类(静态内部类)才能有static修饰的成员变量
  • 调用非静态内部类的方法、构造器、成员变量时,必须要存在一个外部类对象
在外部类以外的类实例化非静态内部类对象如下:
Out.In in = new Out().new In();
等价于:
Out.In In;
Out out = new Out();
in = out.new In();
创建静态内部类的实例不需要其外部类的实例:
Out.StaticIn = new Out.StaticIn();
当程序需要使用内部类时,优先考虑静态内部类

匿名内部类不能是抽象类,不能定义构造器,被匿名内部类访问的局部变量不能二次赋值(Java8后不需要添加final修饰)

7、Lambda表达式:
实例化一个函数式接口(只有一个抽象方法的接口)的时候可以使用Lambda表达式来简化代码
如:
String s = "50";
InterfaceExample ie = new InterfaceExample(s){
    public void test(){
    Integer.parseInt(s);
    }
}
等价于:
InterfaceExample ie = (s)->{Integer.parseInt(s);};
等价于
InterfaceExample ie = Integet::parseInt(s);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值