《java从入门到精通》个人笔记-第十一章 类的高级特性(重点!内部类!)

第十一章

  1. java类包:一个类包包含了一些类和接口,用于管理程序中的各种类,尤其是同名类,放在不同类包中即可解决编译器不允许存在同名的类文件这个问题。一个完整的类名是包名与类名的组合。语法:package 包名。包的命名规则是全部用小写字母。
    Ps:同一个包中的类相互访问时,可以不指定包名;当在文件第一行非注释代码中用package关键字为类指定包名后,这个类必须指定全名。
    Ps:同一个包中的类不必存放在同一个位置,可以分别放在c盘和d盘,只要将CLASSPATH分别指向这两个位置即可。
    Ps:可能存在包名冲突,所以通常使用创建者的Internet域名的反序,域名是独一无二的。

  2. import关键字
    (1)使用import关键字导入包,可以指定一个使用包中具体的哪个类,如果要使用包中多个类时,可以在包指定后加上*代替类名,这表示可以在程序中使用包中的所有类。
    (2)使用import导入静态成员,语法:import static 静态成员。
    在这里插入图片描述

  3. final变量:用于声明变量,一旦被声明就不可以再改变该变量的值,即为常量。Final还可以修饰对象引用,由于数组也可以被看作一个对象来引用,所以final可以修饰数组
    在这里插入图片描述
    final常量命名规则为全部大写字母,中间用下划线连接。
    Ps:被定义为final的对象引用只能指向惟一对象,但一个对象本身的值是可变的,为了使一个常量真正不可变,通常声明为static final。在java中定义全局变量,通常使用public static final,这样的常量只能在定义时被赋值。
    在这里插入图片描述

  4. final方法:定义为final的方法不能被重写,定义为final的方法的执行效率要高于非final方法。如果一个父类被设置为private,子类无法访问它自然也无法覆盖它,所以一个定义为private的方法隐式被指定为final类型,无需定义完private再定义final。

  5. final类:定义为final的类不能被继承。如果将某个类设置为final形式,则类中的所有方法都被隐式设置为final形式,但是final类中的成员变量可以被定义为final或非final形式。

  6. 内部类:如果在类中再定义一个类,则这个类称为内部类。分为成员内部类、局部内部类以及匿名类。
    成员内部类在内部类中可以随意使用外部类的成员方法以及成员变量,尽管这些类成员被修饰为private,但内部类的成员只有在内部类的范围内是可知的,不能被外部类使用。即外部类不可以直接访问内部类成员变量,但是在外部类中可以使用内部类对象引用调用内部类成员。内部类的实例一定要绑定在外部类的实例上,从外部类中初始化一个内部类对象,内部类对象就会绑定在外部类对象上。
    在这里插入图片描述
    在这里插入图片描述
    Ps:内部类对象会依赖于外部类对象,除非已经存在一个外部类对象,否则类中不会出现内部类对象。
    内部类向上转型为接口:将一个private的内部类向上转型为父类对象或一个接口,程序就可以完全隐藏实现内部类的具体过程。定义一个接口含有方法,通过定义多个内部类,在内部类中实现该接口的方法,就可以达成在一个类中以不同的方式实现接口中同一个方法,而一般的类中是不能多次实现一个接口中同一个方法的,让一个类做出多个不同的响应事件。
    使用this关键字获取内部类与外部类的引用:如果在外部类中定义的成员变量与内部类的成员变量名称相同,可以使用this关键字。
    在这里插入图片描述
    Ps:在内存中所有对象均放置在堆中,方法以及方法中的形参或局部变量放置在栈中。
    局部内部类:在方法中定义内部类,只能访问方法中final类型的局部变量。局部内部类是方法的一部分,而非外部类的一部分,所以方法的外部不能访问该内部类。
    匿名内部类:语法:return new A(){内部类体};A指类名。在方法内部返回一个引用后,在其后插入一个定义内部类的代码,这个类没有名称,被称为匿名内部类,其作用是创建一个实现A接口的匿名类的对象。
    Ps:因为没有名称,匿名内部类使用默认构造方法来生成A对象
    Ps:匿名内部类创建后,会生成“外部类名$序号”为名称的.class文件,序号以1-n排序,分别代表1~n个匿名内部类。
    静态内部类:在内部类前添加修饰符static即为静态内部类。一个静态内部类中可以声明static成员,但不可以使用外部类的非静态成员,在非静态内部类中也不可以声明静态成员
    特点:
    (1) 如果创建静态内部类的对象,不需要其他外部类的对象;
    (2) 不能从静态内部类的对象中访问非静态外部类的对象。
    内部类的继承:在某个类继承内部类时,必须硬性给予这个类一个带参数的构造方法,并且该构造方法的参数为需要继承内部类的外部类引用,同时在构造方法体中使用a.super()语句,这样才能继承提供了必要的对象引用。
    在这里插入图片描述

提出问题:内部类与外部类之间什么情况可以调用?什么情况下不能用?
对于成员内部类来说,内部类是依附外部类而存在的,也就是说要创建成员内部类的对象,前提是创建一个外部类的对象,创建成员内部类的方式如下:new Main().new Inner();如用private修饰成员内部类,,则只能在外部类的内部访问。
对于静态内部类来说,是不需要依赖于外部类的,与静态成员变量类似。
(1)在外部类外部,创建非静态内部类:
语法:外部类.内部类 内部类对象 = new 外部类().new 内部类();
(2)在外部类外部,创建静态内部类:
语法:外部类.内部类 内部类对象 = new 外部类.内部类();
(3)在外部类内部,创建内部类“
语法:就像普通对象一样直接创建:内部类 内部类对象 = new 内部类();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值