对象的上下转型
向上转型:
父类 对象名 = new 子类();
向上转型一定是安全的(小范围->大范围)
向下转型:
还原向上转型(类似强制转换)(只能还原成原本的子类对象)
子类 对象名 = (子类)原本父类对象;
(还原为其他子类对象不会报错,但是运行时会有类转换异常)
instanceof:
知道一个父类引用的是哪个子类(安全地向下转型)
对象 instanceof 类型;//得到一个布尔值
final关键字
代表最终的、不可改变的
类
public final class{};
//当前类不能有任何子类,也不能进行覆盖重写
方法
public class 父类{
public final 返回类型 方法名(参数){};
}//子类中不能对此方法进行覆盖重写
类和方法的final和abstract关键字不能同时使用(矛盾)
局部变量
final 数据类型 变量名 = 初始值;
//此变量只能赋值一次,一次赋值,终身赋值
对于引用类型来说,意味着地址值不可变
对于类对象,不能再次new(成员变量可变)
成员变量
public class 类名{
public final 成员变量 = 初始值;}
//必须手动赋初始值,否则默认的0将被用作final值
构造函数也必须赋初始值,Setter函数将报错
权限修饰符
public > protected > (default) > private
public | protected | (default) | private | |
---|---|---|---|---|
同一个类(本身) | ☑️ | ☑️ | ☑️ | ☑️ |
同一个包(邻居) | ☑️ | ☑️ | ☑️ | ❌ |
不同包子类(派生) | ☑️ | ☑️ | ❌ | ❌ |
不同包非子类(陌生) | ☑️ | ❌ | ❌ | ❌ |
内部类
一个类内部包含另一个类
成员内部类:定义在类内部
修饰符 class 类名{
修饰符 class 类名;}
内用外随意访问,外用内需要借助内部对象
(1.在成员方法中创建内部类对象)
(2.外部类.内部类 对象名 = new 外部类(). new 内部类();
)
内部类的成员变量与外部类的成员变量重名:
内部类中调用:外部类名称.this.外部类成员变量;
为外部类赋内部类的值时,需要先创建内部类的对象
局部内部类:定义在成员方法内部
修饰符 class 类名{
修饰符 返回值类型 方法名(参数){
class 局部内部类名{}
}}
只能在方法中创建对象并使用
局部内部类如果想要访问所在方法的局部变量,那么这个变量必须是有效final的(可以不写final,但是不能改变值)(局部变量在栈中,类对象在堆中,需要保证复制过的数据不变)
定义类时的权限修饰符规则:
外部类:public/(default)
成员内部类:public/protected/(default)/private
局部内部类:不能写,只能在方法内使用(不是defualt)
匿名内部类(属于局部内部类)
省略了类名称
接口的实现类或父类的子类只需要使用唯一一次
接口 对象名 = new 接口(){
//覆盖重写所有抽象方法};
匿名内部类的对象创建后只能使用一次(多次使用定义实现类)
匿名内部类+匿名对象
new 接口(){
//覆盖重写所有抽象方法}.调用方法;
匿名对象只能调用一次方法
ArrayList & List
List是一个接口,而ArrayList是List接口的一个实现类
ArrayList实现动态数组
终于学完Java啦~老师很幽默(而且超喜欢赵丽颖)
大二下也开始啦,虽然并没有上课的气氛
新学期冲冲冲!!(๑•̀ㅂ•́)و✧