1.传递与返回值
1.形式参数是基本类型要的是什么?是类名要的是什么?是抽象类名要的是什么?是接口名要的是什么?
基本类型要的是 byte,short,int,long,float,double,boolean, char;类名要的是该类的对象;抽象类名要的是该抽象类对象的子类对象;接口名要的是该接口的子类对象。
2.返回值类型是基本类型返回的是什么?是类名返回的是什么?是抽象类名返回的是什么?是接口名返回的是什么?
基本类型返回的是byte,short,int,long,float,double,boolean, char;类名返回的是该类的对象;抽象类返回的是该抽象类对象的子类对象;接口名返回的是该接口的子类对象。
2.内部类
内部类概述:
把类定义在其他类的内部,这个类就被称为内部类。
举例:
在类A中定义了一个类B,类B就是内部类。
内部类访问特点:
(1)内部类可以直接访问外部类的成员,包括私有。
(2)外部类要访问内部类的成员,必须创建对象。
按照内部类位置分类:
成员位置:在成员位置定义的类,被称为成员内部类。
局部位置:在局部位置定义的类,被称为局部内部类。
匿名内部类:
就是局部内部类的简化写法。
<1>成员内部类
例:
class Outer {
String s = "Outer";
public static void main(String[] args) {
new Outer().new Inner();
}
Outer() {
System.out.println(s);
}
class Inner {
String s = "Inner";
Inner() {
System.out.println(s);
}
}
}
运行结果为:
<2>局部内部类
局部内部类访问局部变量的问题
(1)可以直接访问外部类的成员
(2)可以创建内部类对象,通过对象调用内部类方法,来使用局部内部类功能
(3)局部内部类访问局部变量必须用final修饰
因为局部变量会随着方法的调用完毕而消失,这个时候,局部对象并没有立马从堆内存中消失,还要使用那个变量。为了让数据还能继续被使用,就用fianl修饰,这样,在堆内存里面存储的其实是一个常量值。
JDK1.8之后,final会默认加上,不用手动去加。
例:
class Outer {
final String s1 = "外部类变量";
public void method() {
String s2 = "内部类变量";
class Inner {
final public void innerMethod() {
int x = 20;
System.out.println(s1);
System.out.println(x);
System.out.println(s2);
}
}
Inner inner = new Inner();
inner.innerMethod();
}
public static void main(String[] args) {
new Outer().method();
}
}
运行结果为:
<3>匿名内部类
(1)通过接口的方式创建匿名内部类
例:
interface Inter {
public abstract void show();
}
//在外部类Outer的method()方法中,创建匿名内部类
public class Outer {
interface Inter {
public abstract void show();
}
public void Method() {
new Inter() {
@Override
public void show() {
System.out.println("通过接口的方式创建匿名内部类");
}
}.show();
}
public static void main(String[] args) {
new Outer().Method();
}
}
运行结果为:
(2)通过抽象类的方式创建匿名内部类
例:
abstract class AbstractClass {
public abstract void show();
}
//在外部类Outer的method()方法中,创建匿名内部类
public class Outer {
public void Method() {
new AbstractClass() {
@Override
public void show() {
System.out.println("通过抽象类的方式创建匿名内部类");
}
}.show();
}
public static void main(String[] args) {
new Outer().Method();
}
}
运行结果为: