- final 修饰类:该类被称为最终类,特点是不能被继承了。
- final 修饰方法:该方法被称为最终方法,特点是不能被重写了。
- final 修饰变量:该变量有且仅能被赋值一次。
- final 修饰基本类型的变量,变量存储的数据不能被改变。
- final 修饰引用类型的变量,变量存储的地址不能被改变,但地址所指向对象的内容是可以被改变的。
- 使用了static final 修饰的成员变量就被称为常量。作用:常用语记录系统的配置信息。
- 单例设计模式
- 作用:确保某个类只能创建一个对象。
- 写法,实现步骤(饿汉式单例):
- 把类的构造器私有。
- 定义一个类变量记住类的一个对象。
- 定义一个方法,返回对象。
package com.itheima.singleinstance;
//设计成单例设计模式(饿汉)
public class A {//2、定义一个静态变量,用于记住本类的一个唯一对象//public static final A a = new A();//用这种就不用写第三步了private static A a = new A();//1、私有化构造器,确保单例类对外不能创建太多对象private A(){}//3、提供一个公开的静态方法,返回这个类的唯一对象public static A getInstance(){return a;}
}
package com.itheima.singleinstance;public class Test {public static void main(String[] args) {A a1 = A.getInstance();//A a2 = A.a;用final就这么定义}
}
- 把类的构造器私有
- 定义一个静态变量用于存储对象
- 提供一个静态方法,保证返回的是同一个对象
package com.itheima.singleinstance;
//懒汉式单例类
public class A {//2、私有化静态变量private static A a;//1、私有化构造器private A(){}//3、提供静态方法返回对象,用的时候才创建对象public static A getInstance(){if(a == null){a = new A();}return a;}
}
package com.itheima.singleinstance;public class Test {public static void main(String[] args) {A a1 = A.getInstance();A a2 = A.getInstance();System.out.println(a1 == a2);// true}
}
- 都是最终类,不可以被继承,枚举类都是继承java.lang.Enum类的。
- 枚举类的第一行只能罗列一些名称,这些名称都是常量,并且每个常量会记住枚举类的一个对象。
- 枚举类的构造器都是私有的,因此,枚举类对外不能创建对象。
package com.itheima.enumdemo;
//枚举类
public enum A {//枚举类的第一行:只能罗列枚举对象的名称,这些名称本质是常量X,Y,Z;
}
package com.itheima.enumdemo;public class Test {public static void main(String[] args) {A a1 = A.X;System.out.println(a1);// XSystem.out.println(a1.name());// XSystem.out.println(a1.ordinal());//索引 输出0}
}
package com.itheima.enumdemo;public class Constant {public static final int UP = 0;public static final int DOWN = 1;public static final int LEFT = 2;public static final int RIGHT = 3;
}
package com.itheima.enumdemo;public enum Direction {UP, DOWN, LEFT, RIGHT;
}
package com.itheima.enumdemo;public class Test {public static void main(String[] args) {//枚举类的应用场景:做信息的分类和标志//需求:模拟上下左右移动//法一:常量做信息标志和分类:但是参数值不受约束(除了0,1,2,3还能输入其他值)。move(Constant.UP);//法二:枚举做信息标志和分类:参数值受枚举类约束(只能输入这几个)。move2(Direction.UP);}public static void move2(Direction direction){switch (direction)//就这几种情况,不需要default判断了{case UP:System.out.println("向上移动");break;case DOWN:System.out.println("向下移动");break;case LEFT:System.out.println("向左移动");break;case RIGHT:System.out.println("向右移动");break;}}public static void move(int direction){switch (direction){case Constant.UP:System.out.println("向上移动");break;case Constant.DOWN:System.out.println("向下移动");break;case Constant.LEFT:System.out.println("向左移动");break;case Constant.RIGHT:System.out.println("向右移动");break;default:System.out.println("无效的移动方向");}}
}
- 抽象类、抽象方法:都是用abstract修饰的;抽象方法只有方法签名,不能写方法体(不写大括号和大括号里的东西)
- 抽象类中可以不写抽象方法,但有抽象方法的类必须是抽象类
- 类有的成员(成员变量,方法,构造器)抽象类都具备
- 抽象类不能创建对象,仅作为一种特殊的父类,让子类继承并实现
- 一个类继承抽象类,必须重写完抽象类的全部抽象方法,否则这个类也必须定义成抽象类
- 父类知道每个子类都要做某个行为,但每个子类要做的情况不一样,父类就定义成抽象方法,交给子类去重写,我们抽出这样的抽象类,就是为了更好的支持多态。
package com.itheima.abstractdemo;public abstract class Animal {public abstract void cry();
}
package com.itheima.abstractdemo;public class Cat extends Animal{@Overridepublic void cry() {System.out.println("小猫喵喵叫");}
}
package com.itheima.abstractdemo;public class Dog extends Animal{@Overridepublic void cry() {System.out.println("汪汪汪");}
}
package com.itheima.abstractdemo;public class Test {public static void main(String[] args) {Animal a1 = new Dog();a1.cry();Animal a2 = new Cat();a2.cry();}
}
- 模板方法设计模式解决了方法中存在重复代码的问题。
- 模版方法设计模式应该怎么写?
- 定义一个抽象类
- 在里面定义2个方法,一个是模板方法:放相同的代码,一个是抽象方法:具体实现交给子类完成
package com.itheima.abstract1;public abstract class People {public final void write(){System.out.println("aaaaaaaaaaaaaaaa");writeMain();System.out.println("cccccccccccccccc");}public abstract void writeMain();
}
package com.itheima.abstract1;public class Teacher extends People{@Overridepublic void writeMain() {System.out.println("老师写代码");}
}
package com.itheima.abstract1;public class Student extends People{@Overridepublic void writeMain() {System.out.println("学生写代码");}
}
package com.itheima.abstract1;public class Test {public static void main(String[] args) {People s1 = new Student();s1.write();System.out.println("==========================");People t1 = new Teacher();t1.write();}
}
/*
输出结果:
aaaaaaaaaaaaaaaa
学生写代码
cccccccccccccccc
==========================
aaaaaaaaaaaaaaaa
老师写代码
cccccccccccccccc*/