static、final修饰符、内部类、super

static

static修饰符能和属性,方法,内部类一起用,表示静态的,类中的静态变量和静态方法能直接和类名一起使用,不需要新建类对象,static修饰的变量也叫类变量

一个类中,一个static变量只会有一个内存空间,虽然有多个实例,但所有实例中的这个static变量会共享同一个内存空间

static变量在类装载的时候就会被初始化,只要类被装载,不管是否调用了static变量,都会被初始化

一个类的静态方法只能访问静态属性

一个类的静态方法不能直接调用非静态方法

如访问控制权限允许,static属性和方法可以使用类名加“.”的方式调用,也可以使用实例加“.”的方式调用

静态方法中不存在当前对象,不能使用this,super

静态方法不能被非静态方法覆盖

构造方法不允许申明为static

  静态初始器是一个存在与类中方法外面的静态块,仅仅在类装载的时候执行一次,通常用来初始化静态的类属性。

 

final

在java声明类,属性和方法时,可以使用关键字final来修饰,final所标记的成分具有终章的特征

final标记的类不能被继承

final标记的方法不能被子类重写

final标记的成员变量或局部变量即成为常量,只能赋值一次

final标记的成员变量必须在声明的同时赋值,如果在声明的时候没有赋值,那么只有一次赋值的机会,而且只能在构造方法中显示赋值,然后才能使用

final标记的局部变量,可以先声明不赋值,然后再进行一次性赋值

final一般用于标记那些通用性的功能、实现方式或者取值不能随意改变的成分,以避免被误用

如果将引用类型(任何类的类型)的变量标记为final,改变量不能指向任何其他对象,但可以改变对象的内容,因为只有引用本身是final的

 

内部类

在一个类(或方法,语句块)的内部定义一个类,后者称为内部类(嵌套类)

特点

内部类可以体现逻辑上的从属关系,同时对于其他类可以控制内部类对外不可见

外部类的成员变量的作用域是整个外部类,包括内部类,但外部类不能访问内部类的private成员

逻辑上相关的类可以在一起,可以有效的实现信息隐藏

内部类可以直接访问外部类的成员,可以用此实现多继承

编译后,内部类也被编译成单独的类,名称为outclass$inclass的形式

种类

类级:成员式,有static修饰

对象级:成员式,普通,没有static修饰

本地内部级:局部式

匿名级:局部式

成员式内部类的基本规则

可以有各种修饰符,4种权限(private、public、abstract、default),static,final,abstract定义

有static限定,就为类级,没有就为对象级

类级可以通过外部类直接访问,对象级需要先生成外部的对象,才能访问

内部类不能同名

非静态内部类不能声明任何静态成员,内部类之间可以互相调用

成员式内部类的访问

内部类访问外层类对象的成员时,语法为:外层类名.this.属性

使用内部类时,由外部类对象加“.new”操作符调用内部类的构造方法,创建内部类的对象

在另一个外部类中使用非静态内部类中定义的方法时,要先创建外部类的对象,再创建与外部类相关的内部类的对象,再调用内部类的方法

 static内部类相当于其外部类的static成分,它的对象与外部类对象间不存在依赖关系,因此可以直接创建
  由于内部类可以直接访问其外部类的成分,因此,当内部类与其外部类中存在同名属性或方法时,也将导致命名冲突。所以,在多层调用时要指明

 

本地类是定义在代码块中的类,只在定义它们的代码块中可见,本地类有以下几个重要特性:

 仅在定义了它们的代码块中可见

本地类不可以是static,里面也不能定义static成员

本地类不可以用public、private、protected修饰,只能使用缺省(默认)

本地类可以是abstract

可以使用定义它们的代码块中的任何本地final变量(注:本地类(也可以是局部内部类/匿名内部类等等)使用外部类的变量,原意是希 望这个变量在本地类中的对象和在外部类中的这个变量对象是一致的,但如果这个变量不是final定义,它有可能在外部被修改,从而导致内外部类的变量对象 状态不一致,因此,这类变量必须在外部类中加final前缀定义)

 

匿名内部类是本地内部类的一种形式,没有类名的内部类,具体的类实现会写在这个内部类里面

规则

匿名类没有构造方法

匿名类不能定义静态成员

匿名类不能用四种权限、static,final,abstract修饰

只可以创建一个匿名类实例

 

super

它是一个指代变量,用于在子类中指代父类对象

使用范围:

只能用于子类的构造函数和实例方法中,不能用于子类的类(静态)方法中,super指代的是一个父类的对象,他需要在运行时被创建,而静态方法是类方法,是类的一部分,当类加载时,方法已经存在,但这时父类对象还没有被初始化

在java中super有两种使用场景

1.在子类中调用父类的方法或属性

子类中调用父类的方法和属性,子类中有与父类相同的属性和方法,这时调用父类的方法和属性,必须使用super关键字,因为子类和父类中的属性和方法同名,则父类中的方法和属性会被覆盖或隐藏。super可以指代父类中的类属性和类方法,类方法和属性可以直接调用,所以不建议使用super

2.在子类中指代父类构造器

在java中,子类是父类的派生类,它的实例化依赖于父类的实例化,所以它的任何一个构造函数都要初始化父类,java就是super关键字调用父类构造方法。

在java定义中,如果开发者没有显示的定义构造方函数,那么java会隐式的为该类定义一个无参的构造函数,如果开发者定义了一个构造函数,无论是否有参,java不会为该类隐式的创建构造函数

在子类的构造函数中,如果我们没有显示调用super来初始化父类,那么java会隐式的调用super,来调用父类无参的构造函数并把它放在构造函数的第一行。

java只会隐式的调用无参的构造函数,如果父类没有无参的构造函数,那么子类中就必须显示的调用super关键字来调用已有的有参的构造函数来初始化父类

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值