形式参数与返回值:
形式参数的类型:1)基本类型:使用时没有什么区别,只要形参是什么类型就给它传什么类型的数据即可;
2)引用类型:String特殊的引用类型,使用时与基本类型一致
(1)具体类:需要创建具体类的对象进行传值;
(2)抽象类:需要创建该抽象类的子类对象(抽象类多态,使用匿名内部类)
(3)接口类:需要创建该接口的子实现类(接口类多态,使用匿名内部类)
返回值的类型:1)基本类型:需要返回什么数据类型就给返回什么数据类型;
2)引用类型:(1)具体类:返回该具体类的对象;
(2)抽象类:返回该抽象类的子类对象;
(3)接口类:返回该接口的子实现类对象;
内部类:在一个类(A)的内部定义另一个类(B),则B就是A的内部类
例:class A {
private int num = 10;
class B {
System.out.println(num);
}
}
内部类的访问特点:1)内部类可以访问外部类的成员,包括私有成员都可以访问;
2)外部类想要访问内部类的成员时,需要创建内部类对象来访问内部类成员;
内部类按所在的位置分类:
1)成员内部类:存在于外部类的成员位置上;
class A {
private int num = 10;
(static) class B {
System.out.println(num);
}
}
外部类访问成员内部类时创建对象的方法:
(1)非静态内部类:外部类名 . 内部类名 对象名 = new 外部类名(). new 内部类名();
例:A.B ab = new A() . new B();
(2) 静态内部类:外部类名 . 内部类名 对象名 = new 外部类名 . 内部类名();
外部类名.内部类名.(内部类)成员变量 / 方法
例: A.B ab = new A.B ();
成员内部类的修饰符:
private 修饰:为了保证数据的安全性,只能通过在外部类的方法里创建内部类的对象进行访问;
static 修饰:方便调用;可以通过 外部类名.内部类名. 成员变量/方法 直接调用
2)局部内部类:存在于方法内的类;可直接访问外部类的成员,包括私有;
例:
class A {
private int num = 10;
public void method(){
final int num2 = 20; //JDK1.8以前必须使用 final 修饰,否则报错;
class B {
System.out.println(num);
System.out.println(num2);
}
}
}
***** 面试题:为什么要用 final 修饰局部变量?
答: 局部内部类想要访问局部变量时,局部变量必须使用 final 修饰;
因为局部变量是随着方法的调用而存在的,随着方法的调用完毕而消失的,
而内部类对象在使用后却不会立即消被GC回收掉,
这时就会出现当方法调用完毕后,当局部内部类还需要访问该局部变量,所以程序就会报错,
所以这时就需要将局部变量变成常驻内存的变量(常量),所以用 final 修饰;
匿名内部类:顾名思义即没有名字的内部类;
匿名内部类存在的前提:必须存在一个类 或者 接口
格式:
new 类名 / 接口名{
重写 类 或 接口中的方法;
。。。
};逗号结尾
*********匿名内部类面试题:
按照要求,补齐代码
interface Inter {
void show();
}
class Outer {
//补齐代码
Outer.method().show();
// 分析 1)Outer.method() 外部类名可直接调用,说明该方法被 static 修饰;
2)Outer.method() 调用 method()后还能调用show()方法,说明返回的是一个对象(接口);
3)返回的是一个接口类型,实际返回的是的该接口的子实现类对象,根据题目要求应该采用匿名内部类来实现;
public static Inter method(){
return new Inter{
@override
public void show(){
System.out.println(" Hello World");
}
}
}
}
class OuterDemo {
public static void main(String[] args) {
Outer.method().show();
}
}
要求在控制台输出”HelloWorld”
**********面试题:
控制台分包输出30,20,10
注意: 内部类与外部类之间没有继承关系!(无法用 super )
外部类访问本类成员变量
方式1: 外部类对象(匿名对象的方式).成员变量名称;
方式2: 外部类的this限定:Outer8.this.num:可以访问外部类的成员变量(推荐使用)
class Outer{
private int num = 10 ;
//成员内部类
class Inner{
//内部类的成员变量
int num = 20 ;
public void show() {
//局部变量
int num = 30 ;
//补全代码
System.out.println(num);
System.out.println(this.num); //访问当前类对象的成员变量
// System.out.println(new Outer8().num);
//外部类限定this
System.out.println(Outer.this.num);
}
}
}
public class OuterTest2 {
public static void main(String[] args) {
//补全代码
//外部类名.内部类名 对象名 = 外部类对象.内部类对象;
Outer.Inner oi = new Outer().new Inner() ;
oi.show();
}
}