单例设计模式: (1)设计模式:解决某类问题行之有效的方法,是一种思想,是规律的总结
(2)用来保证某个类在内存中只有一个对象
(3)保证唯一性的思想及步骤:
为了避免其他程序建立该类对象,先禁止其他程序建立该类对象,即将构造函数私有化 为了其他程序访问到该类对象,须在本类中创建一个该类私有对象 为了方便其他程序访问到该类对象,可对外提供一个公共访问方式。
比如API中的Runtime类就是单例设计模式。 单例设计模式的两种方式
A:饿汉式 当类加载的时候,就创建对象。 class Student{
private Student(){}
private static final Student s = new Student();
public static Student getInstance()
{
return s;
}}B:懒汉式 当使用的使用,才去创建对象。class Student{
private Student(){}
private static final Student s = null;
public static Student getInstance()
{
if(s==null)
{
//线程1就进来了,线程2就进来了。
s = new Student();
}
return s;
}}
饿汉式和懒汉式的区别:饿汉式是类一加载进内存就创建好了对象; 懒汉式则是类才加载进内存的时候,对象还没有存在,只有调用了getInstance()方法时,对象才开始创建。 懒汉式是延迟加载,如果多个线程同时操作懒汉式时就有可能出现线程安全问题,解决线程安全问题,可以加同步来解决。但是加了同步之后,每一次都要比较锁,效率就变慢了,所以可以加双重判断来提高程序效率。 注:开发常用饿汉式,因为饿汉式简单安全。懒汉式多线程的时候容易发生问题 Math类的使用(重点) 数学操作类:该类没有构造函数,方法均为静态的 成员变量:E:比任何其他值都更接近e(即自然对数的底数)的double值。 PI:比任何其他值都更接近pi(即圆的周长与直径之比)的double值。 成员方法: static double abs(double a)
返回 double 值的绝对值。返回绝对值
static double ceil(double a) 返回最小的(最接近负无穷大)double 值,该值大于等于参数,并等于某个整数。 static double floor(double a)
返回最大的(最接近正无穷大)double 值,该值小于等于参数,并等于某个整数。 max:返回两个值中较大的那个min:返回两个值中较小的那个static long round(double a) 返回最接近参数的 long。static int round(float a) 返回最接近参数的 int。static double random()返回带正号的 double 值,该值大于等于 0.0 且小于 1.0static double pow(double a, double b)返回第一个参数的第二个参数次幂的值static double sqrt(double a)返回正确舍入的 double 值的正平方根
Random类的使用(重点) 产生随机数的类 构造方法: Random() 创建一个新的随机数生成器。
Random(long seed) 使用单个 long 种子创建一个新的随机数生成器 成员方法: int nextInt() 返回下一个伪随机数,它是此随机数生成器的序列中均匀分布的 int 值
int nextInt(int n) 返回一个伪随机数,它是取自此随机数生成器序列的、在 0(包括)和指定值(不包括)之间均匀分布的 int 值 Scanner类的使用 Scanner(InputStream source) 构造一个新的 Scanner,它生成的值是从指定的输入流扫描的。<br/>
如:Scanner sc = new Scanner(http://System.in);
sc.nextInt();获取整型数据
sc.nextLine();获取字符串数据
继承(重点) 把很多类的相同特征和行为进行抽取,用一个类来描述。让多个类和这个类产生一个关系。
这样的话,多个类就可以省略很多代码。这个关系就是继承。java中用extends关键字表示。 继承的体系结构:多个具体的对象,不断的向上抽取共享的内容,最终形成了一个体系。这个体系叫做继承体系。 继承的特点:java中只能单继承,没有多继承 java可以有多重(层)继承 继承的好处:继承的出现提高了代码的复用性 继承的出现让类与类之间产生了关系,提供了多态的前提。 子父类中的成员关系成员变量:在子类方法中使用一个变量时,首先,在方法的局部变量中找这个变量,有则使用。否则,在本类中找成员变量,有则使用。否则,在父类中找成员变量,有则使用。否则,报错。 成员方法:用子类对象使用一个方法时。首先,在子类中找这个方法,有则使用。否则,在父类中找这个方法,有则使用。否则,报错。 重写和重载的区别? 重载:在同一类中。方法名相同,参数列表不同。重载可以改变返回类型。 重写:在不同类中(子父类中)。方法声明相同(返回类型,方法名,参数列表均相同)。 重写需要注意:子类方法的访问权限要大于等于父类方法的访问权限。 静态只能重写静态。但是这种情况一般不会出现。 构造方法 子类的实例化过程,子类创建对象时,会先去创建父类的对象。默认是去调用父类的无参构造方法。子类构造方法中,第一行默认是super() 为什么子类中第一行会默认有super()?因为他继承父类的成员使用,使用前这些成员必须初始化,而他们是父类的成员,所以,必须通过父类进行初始化。所以,会先创建一个父类的对象。
当父类没有无参构造方法时,必须使用this或者super调用其他的构造方法。 this和super的区别 this:代表本类对象的引用。 super:代表父类的存储空间。final关键字(重点) 最终的意思,可以用于修饰类,方法,变量。 final修饰的类不能被继承。 final修饰的方法不能被重写。 final修饰的变量是一个常量。只能被赋值一次。 内部类只能访问被final修饰的局部变量。抽象类(重点) 多个类有相同的方法声明,但是方法体不一样。这个时候,我们考虑把方法声明进行抽取。让子类继承后,自己去实现方法体。没有方法体的方法,我们需要用抽象标志下。 抽象的关键字是:abstract。 抽象类:该方法称为抽象方法,包含抽象方法的类就是抽象类。 抽象类的特点:抽象类和抽象方法都要用abstract进行修饰 抽象类不能被实例化 抽象类中不一定有抽象方法,但是,有抽象方法的类一定是抽象类。 抽象类中数据的特点抽象类中可以有变量,也可以有常量。 抽象类中可以有抽象方法,也可以有非抽象方法。 抽象类是一个类,所以,它有构造方法。 虽然本身不能实例化。但是可以给子类实例化使用。 抽象类中的问题 A:抽象类中是否有构造方法?能不能被实例化?如果不能,为什么有构造方法?抽象类有构造方法。
抽象类不能被实例化。
抽象类中的构造方法供子类实例化调用。 抽象关键字abstract不可以和哪些关键字共存?private:
私有内容子类继承不到,所以,不能重写。
但是abstract修饰的方法,要求被重写。两者冲突。 final:
final修饰的方法不能被重写。
而abstract修饰的方法,要求被重写。两者冲突。 static:
假如一个抽象方法能通过static修饰,那么这个方法,就可以直接通过类名调用。
而抽象方法是没有方法体的,这样的调用无意义。所以,不能用static修饰。 抽象类中可不可以没有抽象方法?如果可以,这样的类有什么用吗?抽象类可以没有抽象方法。 抽象类中没有抽象方法的作用,只是为了不让别的类建立该抽象类对象。这个在awt中有体现。 接口interface 当一个类中的方法都是抽象的时候,java提供了另一种表示方式,叫接口。 用interface关键字表示。类与接口关系用implements表示。 接口的成员特点 成员变量
是常量,默认修饰 public static final
成员方法
都是抽象的,默认修饰 public abstract
A:类与类的关系
是继承关系。类与类只能单继承,可以多重继承。
B:类和接口的关系<br/>
是实现关系。类可以多实现接口。
类在继承一个类的同时,可以实现多个接口。
C:接口和接口的关系
是继承关系。接口可以多继承接口。
是对外暴露的规则
是功能的扩展
接口的出现降低耦合性。
耦合(类与类之间的关系 )
内聚(类完成功能的能力)
编程规范:低耦合,高内聚。
接口可以多实现。如:CPU和主板、笔记本的USB插口、插座
接口和抽象类的区别抽象类只能被单继承
接口可以多实现,接口的出现避免了多继承的局限性。 抽象类中的数据特点:成员变量:可以是变量,也可以是常量 成员方法:可以是抽象方法,也可以是非抽象方法 构造方法:有构造方法 接口中的数据特点:成员变量:是常量。默认修饰 public static final 成员方法:都是抽象方法。都有默认修饰 public abstract 构造方法:没有构造方法 抽象类中定义的是继承体系中的共性功能。
接口中定义的是继承体系中的扩展功能。 抽象类被继承是”is a”关系:xx是yy的一种,
接口被实现是”like a”关系:xx像yy的一种.