1、final final可以修饰变量、方法、类,等等; final修饰的局部变量一旦赋值,就不能再重新赋值了。(只能赋一次值。) final修饰的方法无法被覆盖/重写。 final修饰的类无法被继承。 final修饰的变量如果是一个引用怎么办? 记住一句话:final修饰的变量只能赋一次值;(将内存地址视为值) 。 如:final Person person2 = new Person(30); person2 = new Person(50); //不行 person2.age = 50; System.out.println(person2.age);//50 //这样就可以了,因为这样只是修改了上面对象的age部分,person2存储的内存地址没变 final修饰的如果是实例变量呢?(注意:一般不用final修饰实例变量,不能变那就是常量了) 结论:final修饰的实例变量,系统不会赋默认值,要求程序员必须手动赋值! 这个赋值在变量后面赋值也行,在构造方法里面赋也行。 class User { final int age = 20;//必须手动赋值! } 实例变量什么时候赋值? 构造方法执行时/new的时候。 终极结论: static final联合修饰的变量称为“常量”; 常量名建议全部大写,每个单词之间采用下划线_连接,如: static final String MY_COUNTRY= "中国"; 2、抽象abstract(抽象类、抽象方法) 注意:类到对象是实例化,对象到类是抽象。 什么是抽象类? [修饰符列表] abstract class 类名{ } 类和类之间具有共同特征,将这些共同特征提取出来,形成的就是抽象类。 类本身是不存在的,所以抽象类无法创建对象(无法实例化) 抽象类是无法实例化的,无法创建对象的,所以抽象类就是用来被子类继承的。 抽象类虽然无法实例化,但是抽象类有构造方法,这个构造方法是供子类使用的。 抽象类属于引用数据类型。 抽象类的子类可以是抽象类。 final和abstract不能联合使用,即不能用final修饰抽象类。 什么是抽象方法? 抽象方法表示没有实现的方法,没有方法体的方法,比如: public abstract void doSome();//注意,这里没有大括号。 特点1:有abstract关键字; 特点2:以分号结尾,没有方法体。 抽象类中不一定有抽象方法,但是抽象方法必须出现在抽象类当中。 重要结论: 一个非抽象的类继承了抽象类,必须将抽象类中的抽象方法实现(覆盖,重写)。 3、接口 接口的基础语法: 1、接口也是一种“引用数据类型”,编译之后也是一个class字节码文件; 2、接口是完全抽象的。(抽象类是半抽象),或者也可以说接口是特殊的抽象类; 3、接口怎么定义?语法是什么? [修饰符列表] interface 接口名{} 4、接口支持多继承; 5、接口只包含两部分内容:一部分是常量,一部分是抽象方法。 6、接口中所有的元素都是public修饰的。 7、接口中的抽象方法定义时,public abstract修饰符可以省略; 8、接口中定义常量时,public static final可以省略; interface M{ int i = 100;//public static final可以省略 int sum(int a,int b);//public abstract可以省略 } 9、接口中的方法都是抽象方法,所以不能有方法体; 10、类和类之间叫做继承,类和接口之间叫做实现; 别多想,你仍然可以将“实现”看作“继承”; 继承使用关键字:extends 实现使用关键字:implements 11、当一个非抽象的类实现接口的话,必须将接口中所有的抽象方法全部实现。 12、一个接口可以实现多个接口; 13、类与类只支持单继承,一个类可以实现多个接口: 需要实现所有接口方法; 向下转型后只能调用各自原来就有的方法,如果想调用其他接口中的方法,可以采用接口转型。 接口与接口之间没有继承关系可以进行向下转型,但是注意运行的时候可能会出现classcastexception异常。 最好加instenceof进行判断; X x = new A(); x.m1(); if (x instanceof Y ){ Y y2 = (Y)x; y2.m2(); }//X:接口,Y:实现接口的类 14、继承和接口同时出现的情况 extends关键字在前,implements关键字在后; 15、使用接口,写代码的时候可以使用多态(父类型的引用指向子类型的对象。) 4、面向抽象编程 类型和类型之间的关系 is a 继承关系:cat is an animal has a 关联关系,定义为属性:customer has a list like a 实现关系,类实现接口:cook like a list(映射),司机像导航之类的。 总结: 面向接口编程,可以降低程序的耦合度,提高程序的扩展力,符合OCP开发原则; 接口的使用离不开多态机制(接口+多态才可以达到降低耦合度); 接口可以解耦合,解开的是谁和谁的耦合? 任何一个接口都有调用者和实现者。 接口可以将调用者和实现者解耦合; 调用者面向接口调用,实现者面向接口编写实现。(顾客,厨师,菜单的例子) 5、package、import及访问控制权限 package打包 为什么要使用package? package是Java中的包机制,包机制的作用是为了方便程序的管理; 不同功能的类分别存放在不同的包下。(按照功能划分的,不同的软件包具有不同的功能) package怎么用? package是一个关键字,后面加包名,例如: package com.bjpowernode.javase.chapter17; 注意:package语句只能出现在程序的第一行。 包名的命名规范: 公司域名倒叙 + 项目名 + 模块名 + 功能名 类名变化:类名是:com.bjpowernode.javase.chapter17.HelloWorld; import导包 import什么时候用? A类中使用B类,A类和B类在不同的包下,需要使用import; java.lang.*;这个包下的类不需要使用import导入 import怎么用? import 完整类名; import 包名.*; 访问控制权限: private:私有的,只能在本类中访问; public:公开的,在任何位置都可以访问; “默认”:只能在本类,以及同包下访问; protected:受保护的,表示只能在同包、本类、子类中访问。
Review05 final_抽象与接口_包及访问控制权限
最新推荐文章于 2024-09-25 11:06:23 发布