。
一、内部类
1.内部类、局部内部类、匿名内部类和静态内部类
1.成员内部类:可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)。在外部类中如果要访问成员内部类的成员,必须先创建一个成员内部类的对象,再通过指向这个对象的引用来访问
2.局部内部类:是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。
3.匿名内部类:多创建接口的实例对象或者抽象类的子类对象,多用于接口回调。匿名内部类在编译的时候由系统自动起名为 Outter$1.class,按照数字序号起名。
4.静态内部类:
1.要创建静态类的对象,并不需要其外围类的对象。
2.静态类的对象中只能访问静态成员和变量
3.普通内部类不能有static数据和字段。
1.概念
将一个类的定义放在另一个类的定义内部,叫内部类。
成员内部类可访问外部类所有的方法和成员变量。
不能有静态的方法和成员变量。
public class Outer {
String name;
class Inner{
String iName;
}
}
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
内部类可以访问外围类的方法和字段,就像自己拥有它们似的,带来许多方便。
所以内部类自动拥有对其外围类所有成员的访问权。
内部类的对象之能在其外围类的对象关联的情况下才能被创建。构建内部类对象时,需要一个指向其外围类对象的引用。
2 .this 和 .new
内部类中获取外部类引用时,可以直接使用.this关键字。
在创建内部类时,可以直接使用外部类的引用和.new关键字 创建内部类对象。
3.内部类-向上转型
public class Outer {
String name;
public class Inner implements Contents{
@Override
public void xxx() {
}
}
}
interface Contents{
void xxx();
}
//main 执行转型操作
Outer outer = new Outer();
Contents inner = outer.new Inner();
4.匿名内部类
没有具体引用名称的内部类,叫内部类。
没有类名,没有class关键字也没有extends和implements等关键字修饰。类的定义和对象的实例化同时进行。
5.静态内部类
普通内部类对象隐藏地保存了一个引用,指向创建它的外围类对象。然而当内部类为静态static时,情况发生了变化。
1.要创建静态类的对象,并不需要其外围类的对象。
2.不能从嵌套类的对象中访问非静态的外围类对象。
3.普通内部类不能有static数据和字段,也不能包含嵌套类。
只能访问外部类的静态成员变量与静态方法。
静态内部类的非静态成员可访问外部类的静态变量,而不可访问外部类的非静态变量。
7.为什么需要内部类
内部类继承自某个类和实现某个接口,内部类的代码操作创建它的外围类的对象。所以可以认为内部类提供了某种进入其外围类的窗口。
外围类实现接口不是总能享用到接口带来的方便,有时候需要用到接口的实现。每个内部类都能独立地继承一个接口的实现,所以无论外围类是否已经继承了某个接口的实现,对于内部类没有影响。
二、关键字
1.static关键字
static的意思是“静态的”,在java里面可用于修饰属性和方法。 定义类的时候,类中都会有相应的属性和方法,然而对这些方法的使用,都是通过创建本类的对象进行调用的,当调用对象的某个方法时,这个方法没有访问到对象的特有数据时,方法创建这个对象有些多余,但是不创建这个对象,方法又调用不了,那这种情况如何解决呢?这是我们就要用到static关键字了。Static是静态修饰符,一般用来修饰类中的成员。
static特点
1.被static修饰的成员变量属于类,不属于这个类的某个对象。也就是说,多个对象在访问或修改static修饰的成员变量时,其中一个对象将static成员变量值进行了修改,其他对象中的static成员变量值跟着改变,即多个对象共享同一个static成员变量。
2.被static修饰的成员可以并且建议通过类名直接访问。
类名.静态成员变量名
类名.静态成员方法名(参数)
对象名.静态成员变量名 ——不建议使用该方式,会出现警告
对象名.静态成员方法名(参数) ——不建议使用该方式,会出现警告
static注意事项
1.static作用于某个字段,一个static字段对每个类来说只有一份存储空间,而非static字段是每个对象有一份存储空间。
2.static作用于方法的重要用法是不需要创建任何对象直接调用该static方法,这对于main()方法很重要。
3.static不能应用于局部变量。
4.Java中禁止使用全局方法,所以引入static方法通过类本身来直接调用。
5.静态内容是优先于对象存在,只能访问静态,不能使用this/super。静态修饰的内容存于静态区。
同一个类中,静态成员只能访问静态成员,不能直接调用非静态的。如果想要使用,要先创建对象。原因:生命周期不同,静态优于非静态存在于内存中,静态存在时,非静态还不存在。
2.final关键字
final意味着”不可改变的”,一般应用于数据、方法和类。
- final数据:当数据是基本类型时,意味着这是一个永不改变的编译时常量,一个在运行时被初始化的值,你不希望它改变。当数据是引用类型时,用static和final修饰表示这是只占据一块不能改变的内存空间。
-
final方法
一般我们使用final方法的目的就是防止子类对该类方法的覆盖或修改。类中的所有private方法都隐式的制定为final的。因为private方法只会在本类显示,即使是子类也不能操作该方法。有时候我们在子类中声明与父类private方法相同名称的方法,这样并不会报错,实际上我们并没有覆盖或者修改父类的private 方法,它只是一个和父类private方法具有相同名称的新方法。
-
//太监类 //这是一个最终的类 无法拥有子类 public final class Eunuch { } class Other extends Eunuch{ //The type Other cannot subclass the final class Eunuch }
-
final类
一般我们使用final类的目的就是说明我们不打算用任何类继承该类,即不希望该类有子类。带有final关键字的类,其内部所有方法和数据都是隐式带有final关键字的,因为没有类可以继承该类,代表着任何外界因素可以改变它的数据。
//太监类 public class Eunuch { public final void speak(){ System.out.println("断子绝孙"); } } //其他类 class Other extends Eunuch{ //Cannot override the final metho from Eunuch @Override public void speak() { System.out.println("呵呵"); } }