数据类型转换
例题:请问以下哪个句子编译会出现失败?
short a = 5;
short b = 6;
short c;
c = a + b;
c = 5 + 6;
a += 5;
答:c = a + b 会出现失败,因为short byte char 类型的数据在进行计算时,会默认将计算结果转换为int类型,因此short类型的c不能接收int类型数据.
a += 5 赋值运算符隐含了强制类型转换,相当于a = (int) a + 5;
Scanner
思考:为什么Scanner能够接收System.in
Class Scanner 构造方法如下:
其中public Scanner(InputStream source)能够接收InputStream的对象
Class.System类中包含三个常量
其中public static final InputStream in 属于inputStream类型,因此可以被Scanner的构造方法接收.
方法重载与方法重写
方法重载(Overloading):在同一类中,以统一的方式处理不同类型数据的一种手段。
方法重写(Override):通过继承父类的方法,覆盖或扩充父类的方法。
重载定义:
方法名称相同,对参数类型,参数个数,返回值类型,以及访问修饰符都没有限制
重写定义:
方法名称,参数类型,参数个数,返回值类型,全部相同,并且被重写的方法不能拥有更严格的权限,即(private 不能重写为 public)
static关键字
思考:static关键字修饰的属性能否用private修饰
static修饰的属性可以用private修饰,但修饰后的属性无法通过类名直接从外部访问,因此一般通过getter方法获取属性(因为非静态方法可以调用静态属性)
与final修饰的变量不能改变的特性相比,就算static修饰的属性被private修饰,同样可以通过setter方法改变属性值
但是所有的实例化对象的静态属性都是唯一的
枚举(enum)
枚举定义:用于定义有限个数对象的结构,属于一种多例设计模式,但比多例设计模式更加简单
(多例设计模式在编译时不能知道对象是否存在, 而枚举可以在编译时就知道对象是否存在)
枚举类中定义的构造方法不能采用非私有化定义(多例设计模式及单例设计模式同样)
enum Color{
RED,GREEM,BLUE //属性定义时使用大写字母,相当于多例设计模式中private static final 属性类型 属性名 的格式
}
enum同样属于一种类,因此可以继承接口,可以添加属性,添加方法
enum Color implements IMessage{
//红色为对象创建时,用构造方法赋值属性
RED("红色"),GREEN("绿色")},BLUE("蓝色") //枚举对象要写在首行
private String title; //添加属性
private Color(String title) { //构造方法赋值属性
this.title = title;
}
public String toString() {
return this.title;
}
@Override //重写接口中的抽象方法
public String getMessage() {
return this.title;
}
一般枚举作为另一个类的属性
class Person{
private enum Color;
private String name;
private int age;
}
enum与Enum的区别
1、enum:是从JDK1.5之后提供的一个关键字,用于定义枚举类
2、Enum:是一个抽象类,所有使用enum关键字定义的类都默认继承此类
public abstract class Enum<E extends Enum>extends Object implements Comparable, Serializable
单例设计模式与多例设计模式
单例设计模式:允许存在一个实例化对象
多例设计模式:允许多个实例化对象
二者都不通过外部实例化对象
关键点:构造方法私有化
单例设计模式(不考虑线程安全)分为懒汉式和饿汉式
//饿汉式:直接完成实例化对象,没有线程问题
class Singleton{
private static final Singleton INSTANCE = new Singleton();
private Singleton() {}
public void print() {
System.out.println("实例化对象");
}
//通过静态方法,外部类名获取实例化对象
public static Singleton getInstance() {
return INSTANCE;
}
}
//懒汉式:在第一次使用的时候进行实例化对象处理
class SingletonLazy{
private static SingletonLazy instance;
private SingletonLazy() {}
public static SingletonLazy getInstance() {
if(instance == null) {
instance = new SingletonLazy();
}
return instance;
}
}
多例设计模式
class Color{
private static final Color RED = new Color("红色");
private static final Color GREEN = new Color("绿色");
private static final Color BLUE = new Color("蓝色");
private String title;
private Color(String title) {
this.title = title;
}
//静态方法用来提供实例化对象
public static Color getInstance(String color) {
switch (color) {
case "red":
return RED;
case "green":
return GREEN;
case "blue":
return BLUE;
default:
return null;
}
}
public String toString() {
return this.title;
}
}
与枚举相比,编译时无法判断是否存在相符的实例化对象,可能会返回空
而枚举在编译时就可以判断是否存在相符的实例化对象