内部类
形式参数和返回值
形式参数问题
* 基本数据类型(不做研究,比较简单)
* 引用类型
* (具体)类 :需要该具体类对象
* 抽象类的情况:形参是一个抽象类,那么实际需要该抽象类子类对象 (抽象类多态)
*
*
* 多态: Fu f = new Zi() ;
*
* abstract class Fu类:抽象类
* Fu f = new Zi() ;抽象类多态
方法的形式参数
* 接口类型:需要该接口的子实现类的对象
方法返回值的情况:
* 1)返回基本类型 :比较简单 (返回什么基本类型数据,用什么基本类型接收)
* String(特殊的引用类型)
* 2)引用类型:
* (具体)类:需要返回的是该具体类 具体对象(或者匿名对象)
* 抽象类:需要返回的是该抽象类的子类对象
方法的返回值
*
* 接口类型:返回值是一个接口类型,返回的时候,需要该接口的子实现类对象
object
Object:代表所有的根类,任何类都继承自Object类
*
* public int hashCode()返回该对象的哈希码值(和集合hashtable :哈希表)
* 每一个对象的哈希码值都不一样, 哈希码值不是实际意义上的地址值,可以理解为地址值
*
*
* public final Class<?> getClass()返回此 Object 的运行时类。 (Java原理:运行的xx.class文件:字节码文件)
*
* Class:表示的字节码文件对象--->通过字节码文件对象使用反射的方式去加载当前字节码文件中的成员变量/成员方法/构造方法
* 返回的 Class 对象是由所表示类的 static synchronized 方法锁定的对象。
*
*
* 在Class类:
* public String getName() :以 String 的形式返回此 Class 对象所表示的实体(接口,类,数组...)名称
内部类
内部类:
* 在一个类中,在定义另一个类
* 举例:
* 在类B中定义类A,类A就是类B的内部类
*
* 特点:
* 内部类他都可以去访问外部类的成员,包括私有
* 外部类的成员访问内部类的成员? 需要创建内部类对象,由内部类对象访问内部的成员
//外部类
class Outer{
private int num =100 ;
//Inner就是Outer的内部类
class Inner{
//内部类的成员方法
public void show() {
System.out.println(num);
}
}
//外部类的成员方法
public void method() {
// show() ;
//创建Inner类的对象
Inner i = new Inner() ;
i.show();
}
}
内部类分类:
* 1)成员内部类
* 位置:在外部类的成员位置
* 2)局部内部类:
* 位置:在方法中定义的类
class Outer2{
//Outer2的成员位置
//成员内部类
/*class Inner2{
public void method() {
}
}*/
//外部类的成员方法
public void function() {
//定义一个类 :局部位置
//局部内部类
class Inner2{
public void method() {
}
}
}
}
外部类如何访问成员内部类的成员方法?
外部类名.内部类名 对象名 = 外部类对象.内部类对象 ;
成员内部类的修饰符:
* 被private修饰,为了保证数据的安全性.
* static修饰: 称为静态成员内部类 ,只是为了方便调用
局部内部类:
* 局部内部类里面的成员方法直接可以访问外部类的成员,包括私有
* 面试题?
* 局部内部类访问局部变量呢? 如果jdk版本是1.8以下
* 局部内部类访问局部变量的,该变量必须被final修饰
* 为什么必须被final修饰?
* 局部变量它随着方法调用而存在的,随着方法的调用完毕而消失
* 就是因为现在有一个局部内部类,在外部类的成员方法中在使用内部类对象(对象的创建完毕,不会立即被垃圾回收器回收掉),使用内部类对象还在调用内部类
* 的成员方法,就需要去访问局部变量,这个变量需要常驻内存(常量),它必须被final修饰!
class Outer5{
//私有的成员变量
private int num = 100 ;
//外部类的成员方法
public void method() {
//局部变量
final int num2 = 50 ;
//局部内部类Inner5
class Inner5{
//局部内部类的成员方法
public void show() {
System.out.println(num);
System.out.println(num2); //本身应该报错:原因现在jdk版本是1.8以上的
}
}
//创建对象去访问:在外部类的成员方法中创建内部类对象,对象名.局部内部类的成员方法
Inner5 inner = new Inner5() ;
inner.show();
}
}
//测试
public class OuterDemo5 {
public static void main(String[] args) {
//创建外部类对象
Outer5 o = new Outer5() ;
o.method();
}
}
匿名内部类
* :它是内部类的简化版
*
* 前提:存在一个类或者接口(接口用多)
* 类:可以具体类/抽象类
* 格式:
* new 类名/接口名(){
* 重写/实现一些方法()..
* } ;
interface Inner6{
public abstract void show1() ;
public abstract void show2() ;
}
//外部类
class Outer6{
//有一个成员方法
public void method() {
//当接口中只有一个方法的时候的调用
/*new Inner6() {
@Override
public void show1() {
System.out.println("show1 Inner6...");
}
}.show1();*/
//当接口中有多个方法的时候的调用
/*new Inner6() {
@Override
public void show1() {
System.out.println("show1 Inner6...");
}
@Override
public void show2() {
System.out.println("show2 Inner6...");
}
}.show1();
new Inner6() {
@Override
public void show1() {
System.out.println("show1 Inner6...");
}
@Override
public void show2() {
System.out.println("show2 Inner6...");
}
}.show2();*/
//当接口中有多个方法调用的时候,写法非常麻烦,改进
//接口中,接口的内部类的方式
Inner6 i = new Inner6() {
@Override
public void show1() {
System.out.println("show1 Inner6...");
}
@Override
public void show2() {
System.out.println("show2 Inner6...");
}
};
i.show1();
i.show2();
}
}
//测试类
public class OuterDemo6 {
public static void main(String[] args) {
Outer6 o = new Outer6() ;
o.method();
}
}