内部类与泛型
一. 内部类
1. 概念:
嵌套在其他类内部的类。
根据出现的位置和关键字,分为以下四种内部类:
1.1 成员内部类
——用法和成员方法差不多,只不过它是类
(1)private不可以用在外部类的声明,但是可以用在内部类的声明。——成员变量可以是private
(2)内部类与外部类可以互相访问彼此的私有域,
内部类访问外部类的私有域可以直接访问——(成员内部类的内部有隐藏的外部类对象)
外部类访问内部类的私有域必须通过内部类对象访问。
(3)内部类可以变相解决Java单继承局限
package innerclass;
class A {
protected int age = 18;
}
class B {
protected String msg = "Hello bit!";
}
public class Inherit {
public static void main(String[] args) {
Inherit inherit = new Inherit();
inherit.fun();
}
class InnerClassA extends A {
}
class InnerClassB extends B {
}
public void fun(){
InnerClassA a = new InnerClassA();
InnerClassB b = new InnerClassB();
System.out.println(a.age);
System.out.println(b.msg);
}
}
(4) 内部类可以对外部隐藏
问题:成员方法中能否定义static变量?
不能 成员内部类不能拥有静态域
问题:静态域中能否访问外部的static属性?
可以,成员内部类可以访问外部类的静态域。
fun(){}有对象才能调用
static 没对象也能用
1.2 静态内部类
概念:定义在外部类的内部使用static修饰
(1)静态内部类无需外部类对象产生就能使用
在静态内部类的内部不能访问外部类的成员域,可以访问外部类的静态域。
问题:静态内部类能否有自己的成员域?
可以 静态内部类是个类,类可以有成员变量,类可以产生对象,有构造方法,构造方法是成员域的一种。
1.2.1 静态内部类创建语法
在外部类的外部创建静态内部类的语法
1.2.2 成员内部类 VS 静态内部类
成员内部类 | 静态内部类 |
---|---|
必须有外部类对象 | 不依赖外部类对象 |
成员方法 | 静态方法 |
成员内部类能访问外部的静态域,不能拥有静态域。 | 静态内部类能拥有成员域,不能访问外部类的成员域。 |
1.3 方法内部类
定义在方法内部
(1)对外部完全隐藏,因此方法内部类不能有任何访问修饰。
(2)若要使用方法的形参只能用不能改(形参的隐式final声明)
a. 方法内部类没有访问形参时,这个形参可以在方法中任意修改。
b. 方法内部类使用了形参,这个形参必须被声明为final
1.4 静态内部类——Lambda 表达式前身
经常在多线程部分,也是定义在方法中,类都没有名字。
a. 必须继承一个抽象类或者实现一个接口
b. 没有构造方法
2. 内部类与外部类的关系
a. 成员内部类的创建需要依赖外部类的对象。–(成员方法必须通过对象调用)
在没有外部类实例之前无法创建内部类对象。
b. 内部类与外部类相对独立,不是is a 关系 (发动机-汽车关系)
c. 私有属性的互相访问
d. 创建内部类的语法***
- 在外部类内部创建内部类对象
2. 在外部类外部创建内部类对象(内部类不是private)!!!
e. 在内部类的内部使用隐藏的外部类对象(隐藏的this)
二. 包装类
概念:将基本数据类型(8大基本类型)封装到类中
Object----所有类/接口/数组
2.1 对象型包装类:Object直接子类
character(char)、Boolean(boolean)
2.2 数值型包装类:Number(抽象类)子类
Byte、Short、Integer(int)、Long、Float、Double
2.3 装箱与拆箱
装箱——>向上转型Object:将基本类型封装到类中
自动装箱用 valueOf(数值) 方法
Integer i = new Integer(10);
拆箱——> 为了基本类型的算术运算:将包装类的对象还原为基本类型
自动拆箱用 intValue() 方法
2.4 String <-> 包装类的相互转换
2.4.1 包装类 -> String类
调用valueOf()
2.4.2 String类 -> 包装类
包装类.parse数据类型();
public static void main(String[] args) {
Integer a = 50;
String str = String.valueOf(a);//将整型包装类变成String类
int data = Integer.parseInt(str);//还原
}
}
三. 泛型——(守门员–编译期间检查类型是否正确)
定义一个泛型类
public class MyClass<T> {
private T e;
public MyClass(T e) {
this.e = e;
}
public T getE(){
return e;
}
public void setE(T e) {
this.e = e;
}
}
3.1 泛型类
使程序在编译时及时找出错误
3.2 泛型方法
在方法声明上仍然可以使用泛型
<T.> fun方法时是:泛型方法
T :泛型类型
T : 参数是泛型类型
泛型方法始终以自己定义的类型参数为准。