只能创建一个实例,将构造器访问权限设置为private.
1.饿汉式
class Sing{
private Sing(){
}
private static Sing s1 = new Sing();
public static Sing getSing(){
return s1;
}
}
2.懒汉式
class Order {
private Order() {
}
private static Order s1 = null;
public static Order getOrder() {
if (s1 == null)
s1 = new Order();
return s1;
}
}
3.区分饿汉式与懒汉式
饿汉式:
好处:饿汉式是线程安全的
缺点:对象加载时间过长
懒汉式:
优点:延迟对象的创建
缺点:懒汉式是线程不安全的.-->多线程内容时修改.
Person类为抽象类,并且里面有抽象方法
Person p = new Person(){ //创建了一个匿名子类的对象,也是一个多态的使用,为了节省代码
@Override
public void eat(){
sout("--匿名子类")
}
}
9.接口(interface)
为了从几个类中派生出一个子类,继承它们所有的属性和方法,但是,Java不支持多继承的。有了接口就可以实现多重继承的效果。
1.接口使用interface来定义,
2.Java中接口和类是并列的结构
3.
3.1JDK7及以前:
接口中只能够定义全局常量和抽象方法
全局常量:public static final,书写时可以省略不写。
抽象方法 public abstract的
interface Flyable{
public static final int MAX_SPEED = 7900;
MIN_SPEED = 1;//省略了,但还是有
public abstract void fly();
void stop();
}
3.2JDK8:还可以定义静态方法和默认方法
4.接口口不能定义构造器,不能实例化。
5.通过让类实现接口(implements)
interface person{
public static final int NUM = 10;
public abstract void fly();
}
//类实现
class Plane implements Person{
public void fly(){
sout("a")
}
}
5.2接口的作用就是在开发中都是面向接口编程
6.创建接口的匿名实现类的匿名对象
interface Person{
void eat();
}
System.out.println(new Person(){//实现
@Override
public void eat(){
System.out.println("---");
}
});
10.接口的应用:代理模式
通过代理类来调用被代理类来实现功能.
interface NetWork{
public void browse();
}
class Server implements NetWork{//被代理类
@Override
public void browse(){
sout("开始上网");
}
}
class ProxyServer implements NetWork{//代理类
private Server serv;
public ProxyServer(Server serv){
this.serv = serv;
}
@Override
public void browse(){
this.check();
serv.browse();
}
public void check(){
sout("检查工作完成")
}
}
public class Test{ //测试
psvm(String[] args){
Server serv = new Server();
new ProxyServer(serv).browse();
}
}
11.接口面试题
1.这道题可以输出嘛?如果可以则输出什么,如果不可以则需要改什么地方可以输出1或2?
interface A{
int x = 1;
}
class B{
int x = 2;
}
class C extends B implements A{
public void pX(){
sout(x); //出错,因为x并不确定,需要指定x是谁的x
可以改为:sout(super.x);也可以改为sout(A.x);//因为接口中的属性默认为全局常量,可以通过A.x得到
}
psvm(String[] args){
new C().pX();
}
}
2.这道题哪些地方出错?
interface Playable{
void play();
}
interface Bounceable{
void play();
}
interface Rollable extends Playable,Rollable{
Ball ball = new Ball("Pingpang")
}
class Ball implements Rollable{
private Sring name;
public String name(){
retuen name;
}
public Ball(String name){
this.name = name;
}
public void play(){//这里错误,不知道自己调的哪个play
ball = new Ball("Football");//这里错误,因为接口中的属性为全局常量,b
sout(ball.getName())
}
}
12.JDK8接口的的新特性
1.除了定义全局常量和抽象方法之外,还可以定义静态方法,默认方法.
public interface Compare{
public static void method1(){
sout("北京");//接口中定义的静态方法,只能通过接口来调用
}
public default void method2(){
sout("上海");
}
}
1.接口中定义的静态方法,只能通过接口来调用.
2.通过实现类的对象,可以调用接口的默认方法
3.如果实现类重写了接口的默认方法,则调用的是重写后的方法.
class Person{
public void eat(){...}
}
interface P{
default void eat(){...}
}
class Stu extends Person implements P{
Stu s1 = new Stu();
s1.eat();//调用的是父类的方法
}
4.上述如果子类(实现类)继承的父类和实现的接口中,声明了同名同参数的默认方法,子类在没有重写此方法的情况下,默认调用父类的方法.
5.如何实现了多个接口,且多个接口中有同名同参数的默认方法那么在实现类没有重写此方法的情况下,报错,-->接口冲突
解决办法必须在实现类中重写此方法.
class Stu implements P,P2{
Stu s1 = new Stu();
s1.eat();//报错,因为它不知道调用哪个
}
6.如果你在实现类中重写了默认方法,那怎么再调用接口中的默认方法呢?
可以通过:=>接口.super.默认方法();的形式去调用接口中的默认方法
13.类的内部成员五:内部类
1.Java中允许将一个类A声明在另一个类B中,则类A就是内部类.B为外部类.
2.内部类的分类:
成员内部类VS局部内部类(方法,代码块,构造器)
public class Test{
public void eat(){
class B{}
}
{
class B{}
}
public Test(){
class B{}
}
//成员
static class B{ //静态的
}
class B{
public void eat(){
Test.this.eat();//调用外部类的成员
}
}
}
1.成员内部类:
一方面:作为外部类的成员:
> 调用外部类的结构
> 可以被static 修饰
> 可以被4种不同的权限修饰
另一方面:作为一个类:
> 类内部定义属性,方法,构造器
> 可以被final修饰,表示不可以被继承了,反之可以被继承
> 可以被abstract修饰
2.注意:
如何实例化成员内部类的对象?
public class P{
class A{}
static B{}
psvm(){
P.B b = new P.b();//静态内部类的实例化
P.A a = P.new A();//非静态的内部类的实例化
}
}
如何在成员内部类种区分调用外部类的结构
使用外部类.this.xxx来调用
开发中局部内部类的使用
public Comparable getCom(){
class Comparable{
@Override
public void eat(){...}
}
return new Comparable();
方式二:
return new Comparable(){
@Override
public void eat(){...}
}
}