深圳品牌网站设计推广,wordpress 移动导航菜单,网站建设属开票核定税种,工程建设造价信息网站一.认识final1.含义final关键字是最终的意思#xff0c;可以修饰#xff1a;类#xff0c;方法#xff0c;变量修饰类#xff1a;该类被称为最终类#xff0c;特点是不能被继承修饰方法#xff1a;该方法被称为最终方法#xff0c;特点是不能被重写了修饰变量#xff…一.认识final1.含义final关键字是最终的意思可以修饰类方法变量修饰类该类被称为最终类特点是不能被继承修饰方法该方法被称为最终方法特点是不能被重写了修饰变量该变量有且仅能被赋值一次final修饰静态变量这个变量今后被称为常量可以记住一个固定值并且程序中不能修改了通常这个值作为系统的配置信息作为共享值所有人都可以用常量的名称建议全部大写多个单词用下划线进行连接注final修饰实例变量一般情况下没有意义2.final修饰变量的注意final修饰基本类型的变量变量存储的数据不能被改变final修饰引用类型的变量变量存储的地址不能被改变但地址所指向的对象的内容是可以被改变
final int[] arr {11,22,33,44};
//arr new int[]{33,44,55}; //第二次赋值报错
arr[2]90;//不报错可以修改
二.常量1.含义使用了static final修饰的成员变量就被称为常量作用常用于记录系统的配置信息注命名规范建议使用大写英文字母多个单词使用下划线连接起来2.优点代码可读性更好可维护性更好程序编译后常量会被“宏全部替换”出现常量的地方全部会被替换成其记住的字面量这样可以保证使用常量和直接用字面量的性能是一样的三.单例类设计模式注这个属于系统架构师层面的技术1.什么是设计模式一个问题通常有n种解法其中肯定有一种解法是最优的这个最优的解法被人总结出来了就称之为设计模式2.关于设计模式主要学什么解决什么问题确保某个类只能创建一个对象怎么写3.单例设计模式作用确保某个类只能创建一个对象写法步骤把类的构造器私有确保单例类对外不能创建太多对象单例才有可能性定义一个静态变量用于基本本类的一个唯一对象提供一个静态方法用于返回对象
//单例类
public class A{//2.定义一个类变量记住类的一个变量private static A a new A();//1.私有构造器private(){}//3.定义一个类方法返回对象public static A getobject(){return a;}
}
public static A a new A();//这两句其实是相同的意思上面的 A就是跟下面的 int一样代表数据类型//new A()代表的是对象public static int a1 20;4.饿汉式单例的特点在获取类的对象时对象已经创建好了5.单例有啥应用场景有啥好处任务管理器对象、获取运行时对象避免浪费内存及无效资源浪费6.懒汉式单例类真正要用对象时才开始创建对象写法把类的构造器私有定义一个静态变量用于存储对象提供一个静态方法保证返回的是同一个对象
public class B{//2.定于一个类变量用于存储对象private static B b;//null//1.单例必须私有构造器private B(){}//3.提供一个类方法返回类的的一个对象public static B getobject(){if(b null){b new B();}return b;}
}四.枚举类1.枚举类的写法
修饰符enum枚举类名{名称1名称2....;其他成员...
}public enum A{X,Y,Z;...
}2.枚举类的特点枚举类中的第一行只能写枚举类的对象名称且要用逗号隔开这些名词本质是常量每个变量都记住了枚举类的一个对象枚举都是最终类不可以被继承枚举类都是继承java.lang.Enum类的枚举类的构造器都是私有的写不写都只能时私有的因此枚举类对外不能创建对象编译器为枚举类新增了几个方法枚举是一种特殊类
public static A[] values();//将所有枚举的对象放到数组中public static A valueOf(java.lang.String);
//通过枚举对象的名字去定位某个枚举对象a1.name()可以拿枚举对象 的名称
a1.ordinal()可以拿枚举对象 的索引
3.枚举类的常见应用场景枚举类很适合做信息分类和标志
package com.itheima;public class Test {public static void main(String[] args) {//目标掌握枚举类的应用场景信息的分类和标志//需求模拟上下左右移动图片move(Direction.UP);}public static void move(Direction direction){switch (direction){case UP://可直接写UP因为枚举类中定义的常量值都是UPDirection可以省略System.out.println(向上移动);break;case Down:System.out.println(向下移动);break;case Left:System.out.println(向左移动);break;case Right:System.out.println(向右移动);break;default:System.out.println(无效指令);}}
}package com.itheima;public enum Direction {UP,Down,Left,Right;}
五.抽象类1.含义在Java中有一个关键字叫abstract抽象用这个可以修饰类、成员方法abstract修饰类这个类就是抽象类abstract修饰方法这个方法就是抽象方法2.语法
修饰符 abstract class 类名{修饰符 abstract 返回值类型 方法名称形参列表;
}public abstract class A{//抽象方法必须abstract修饰只有方法签名不能有方法体,意味着不能有大括号public abstract void test();
}3.抽象类的注意事项、特点抽象类中不一定要有抽象方法有抽象方法的类必须是抽象类类有的成员成员变量、方法、构造器、抽象类都可以有抽象类最主要的特点是抽象类不能创建对象仅作为一种特殊的父类让子类继承并实现一个类继承抽象类必须重写玩抽象类的全部抽象方法否则这个类也必须定义成抽象类注在实际开发中会全部重写抽象方法而不是再定义成抽象类这样就可以自己创建对象方法Alt键回车即可全部重写4.使用抽象类的优点非必须父类知道每个子类都要做某个行为但每个子类都要做到情况不一样。父类就定义成抽象方法交给子类去重写实现我们设计这样的抽象类就是为了更好的支持多态注以后要做关于面向对象的设计时如果所有子类都要做出功能每个子类的功能又各不相同即可把这个父类定义成抽象类和抽象方法5.抽象类使用场景之一模板方法设计模式提供给一个方法作为某类功能的模板模板方法封装了每个实现步骤但允许子类提供特定步骤的实现模板方法设计模式提高代码的复用、并简化子类设计写法1.定义一个抽象类2.在里面定义两个方法一个是模板方法把共同的实现步骤放里面去一个是抽象方法不确定的实现步骤交给具体的子类来完成注建议使用final关键字修饰模板方法控制方法不被重写六.接口1.含义Java提供了一个关键字interface定义出接口
public interface 接口名{//成员变量常量//成员方法抽象方法
}在JDK 8 之前接口中只能定义常量和抽象方法。在接口中定义常量可以省略public static final 不写默认自动添加抽象方法同理。作用接口是用来被类实现的实现接口的类称为实现类一个类可以同时实现多个接口。
修饰符 class 实现类类名 implements 接口1接口2接口3....{//实现类实现多个接口必须重写完全部接口的全部抽象方法否则实现需要定义成抽象类
}2.注意接口不能创建对象。3.接口的优点弥补了类单继承的不足一个类同时可以实现多个接口使类的角色更多功能更强大。让程序可以面向接口编程这样程序员就可以灵活方便的切换各种业务实现更有利于程序的解耦合。 4.接口案例学生信息系统
package com.iteheima.interface1;public interface ClassDataInter {void printAllStudentInfos();void printAverageScore();
}
ClassDateinter.java
package com.iteheima.interface1;public class Text {//把这个可以看作A公司提供的模板其他两个实现类功能由另外公司完成这就是协作开发public static void main(String[] args) {//目标完成接口的小案例//1.定义学生类创建学生对象封装数据才能交给别人进行调用//2.准备学生数据人为制造数据Student[] allstudents new Student[10];//创建数组allstudents并设计容量为10allstudents[0] new Student(小王,男,90.5);allstudents[1] new Student(小张,女,80.5);allstudents[2] new Student(小李,男,70.5);allstudents[3] new Student(小赵,女,60.5);allstudents[4] new Student(小孙,男,50.5);allstudents[5] new Student(小周,女,40.5);allstudents[6] new Student(小吴,男,30.5);allstudents[7] new Student(小郑,女,20.5);allstudents[8] new Student(小王,男,10.5);allstudents[9] new Student(小王,女,90.5);//3.提供两套业务实现方案支持灵活切换解耦合//——定义一个接口规范思想必须完成打印全班学生信息打印平均分//——定义第一套实现类实现接口完成打印全班学生信息实现打印平均分//——定义第二套实现类实现接口实现打印学生信息男女人数实现打印平均分去掉最高分和最低分ClassDataInter cdi new ClassDataInterImpl1(allstudents);//接口创建对象不能用new而是用实现类//上面这里就已经实现了解耦如果要换实现类只要换一个实现类接口调用方法不变cdi.printAllStudentInfos();cdi.printAverageScore();Text.java
package com.iteheima.interface1;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;Data//构建get和set方法
NoArgsConstructor//无参构造器
AllArgsConstructor//有参构造器
class Student {//创建学生类封装数据private String name;private char sex;private double score;
}
Student.java
package com.iteheima.interface1;public class ClassDataInterImpl1 implements ClassDataInter{//类名[] 变量名声明数组变量private Student[] students;//创建数组记住下面送进来的全部学生信息public ClassDataInterImpl1(Student[] students) {//用有参构造器接收学生信息this.students students;//将外部传入的数组赋给成员变量students}Overridepublic void printAllStudentInfos() {System.out.println(所有学生的信息为);for (int i 0; i students.length; i) {Student student students[i];System.out.println(student.getName() student.getSex() student.getScore());}}Overridepublic void printAverageScore() {double sum 0;for (int i 0; i students.length; i) {Student student students[i];sum student.getScore();}System.out.println(平均分是 sum / students.length);}
}ClassDateInterImpl1.java
package com.iteheima.interface1;
//——定义第二套实现类实现接口实现打印学生信息男女人数实现打印平均分去掉最高分和最低分
public class ClassDataInterImpl2 implements ClassDataInter{private Student[] students;public ClassDataInterImpl2(Student[] students) {this.students students;}Overridepublic void printAllStudentInfos() {int maleCount 0;//男生人数for (int i 0; i students.length; i) {Student student students[i];if (student.getSex() 男) {maleCount;}System.out.println(student.getName() student.getSex() student.getScore());System.out.println(男性学生数量为 maleCount);System.out.println(女性学生数量为 (students.length - maleCount));}}Overridepublic void printAverageScore() {System.out.println(平均分如下);Student s1 students[0];//这边summaxmin不能直接设计成0万一值为0那么后面求平均数就会出错double sum s1.getScore();double max s1.getScore();double min s1.getScore();for (int i 0; i students.length; i) {Student student students[i];sum student.getScore();if (student.getScore() max) {max student.getScore();} else if (student.getScore() min) {min student.getScore();}}System.out.println(最高分是 max);System.out.println(最低分是 min);System.out.println(平均分是 (sum-min-max) / (students.length-2));}
}
ClassDateInterImpl2.java5.JDK开始接口新增的三种方法
package com.iteheima.interface1.interface4;public interface A {//1.默认方法普通实例方法必须加default关键字修饰//默认会用public修饰//使用接口的实现类的对象来进行调用default void go(){System.out.println(go方法执行);run();}//2.私有方法必须加private关键字修饰//使用接口中的其他实例方法来进行调用private void run(){System.out.println(run方法执行);}//3.静态方法必须加static关键字修饰//只能使用当前接口名来调用static void show(){System.out.println(show方法执行);}}
A.java
package com.iteheima.interface1.interface4;public class Text {//目标搞清楚接口新增的三种方法并理解其好处public static void main(String[] args) {AImpl a new AImpl();//创建对象a.go();//用实现类来进行调用}
}
//创建实现类AImpl
class AImpl implements A{}Text.java好处增强了接口的能力便于项目的扩展和维护why新增的这些方法可以直接在接口中定义好具体的方法新增功能时可以不用重新写方法6.接口的注意事项接口与接口可以多继承一个接口可以同时继承多个接口一个接口继承多个接口如果多个接口中存在方法签名冲突则此时不支持多继承也不支持多实现一个类继承了父类又同时实现了接口如果父类中和接口有同名的默认方法实现类会优先用父类的一个类实现了多个接口如果多个接口中存在同名的默认方法可以不冲突这个类重写该方法即可七.接口和抽象类的区别对比1.相同点多是抽象形式都可以由抽象方法都不能创建对象都是派生子类形式抽象类是被子类继承使用接口是被实现类实现一个类继承抽象类或者实现接口都必须重写抽象方法否则自己成为抽象类都能支持的多态都能实现解耦合2.不同点抽象类中可以定义类的全部普通成员接口只能定义常量抽象方法JDK8新增的三种方法抽象类只能被类单继承接口可以被类多实现一个类继承抽象类就不能再继承其他类一个类实现了接口还可以继承其他类或者其他接口抽象类体现模板思想更利于做父类提高代码的复用性最佳实践接口更适合做功能的解耦合解耦合性更强更灵活最佳实践