Java:final和内部类

对象的上下转型

向上转型

父类 对象名 = 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啦~老师很幽默(而且超喜欢赵丽颖)
大二下也开始啦,虽然并没有上课的气氛
新学期冲冲冲!!(๑•̀ㅂ•́)و✧

猜你喜欢

转载自blog.csdn.net/Rachel_IS/article/details/104490929
今日推荐