数据结构1———内部类与泛型

一. 内部类

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. 创建内部类的语法***

  1. 在外部类内部创建内部类对象
    在这里插入图片描述
    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 : 参数是泛型类型
泛型方法始终以自己定义的类型参数为准。

猜你喜欢

转载自blog.csdn.net/biteqq/article/details/123825447