内部类:
* 什么是内部类: 就是在一个类的里面,在定义一个类
* 一般用来描述事物之间的所属关系, 比如: 汽车事物里面需要描述发动机,可以使用内部类.
* 比如: 怀宝宝的动物
*
* 成员变量: 定义在类的里面,方法的外面
* 局部变量: 定义在方法的里面
*
* 内部类的分类:
* 成员内部类: 定义在内的里面,方法的外面
* 局部内部类(匿名内部类): 方法的里面
*
* 成员内部类的定义:
* public class 外部类{
* // 成员变量
*
* // 内部类
* public class 内部类{
* // 内部类的成员变量和成员方法
* }
* }
*
* 举个例子:
* 描述一个身体里面有一个心脏类;
*
* 内部类的特点:
* 1. 在内部类中(里面)可以访问,外部类的任意内容
* 2. 如何创建一个内部类对象呢?
* 格式: 外部类名.内部类名 变量名 = new 外部类名().new 内部类名();
* 3. 在外部类中,不能访问内部类的任何内容.
public class Demo01InnerClass {
public static void main(String[] args) {
//Heart h = new Heart();
//创建一个内部类对象: 外部类名.内部类名 变量名 = new 外部类名().new 内部类名();
Body.Heart bh = new Body().new Heart();
bh.show();
//System.out.println(bh.life);
}
}
package package10InnerClass;
public class Body {
// 成员变量
private boolean life = true;
// 成员内部内部类
public class Heart{
// 内部类的成员变量
int blood = 60;
// 内部类的成员方法
public void show(){
System.out.println("生命状态:"+life + ", 血量:"+blood);
}
}
public void method(){
//System.out.println(blood);
// 如果想要访问内部类的内容,需要创建对象
System.out.println(new Body().new Heart().blood);
System.out.println(/*new Body().*/new Heart().blood);
}
}
* 如何在内部类中,出现了和外部类同名的成员变量该如何去访问?
* 格式: 外部类名.this.成员变量
public class Demo01InnerClassNotice {
public static void main(String[] args) {
new Outer().new Inner().method();
}
}
package package11InnerClass;
public class Outer {
private int num = 10;
/*
* Inner类和Outer类并不是继承关系
*/
public class Inner{
private int num = 20;
public void method(){
int num = 30;
System.out.println("局部变量 = " + num);// 30
System.out.println("本类变量 = " + this.num);//20 使用this区分
/*
* 在内部类中访问外部类的格式: 外部类名.this.成员变量
*/
System.out.println("外部变量 =" + Outer.this.num);// 10
}
}
}
匿名内部类:
* 内部类分成两种:
* 成员内部类:
* 局部内部类: 定义在方法里面
*
* 匿名内部类的格式:
* 接口/抽象类 变量名 = new 接口/抽象类(){
* // 重写抽象方法
* };
*
* 格式解释:
* 1. 等号的右边大括号{}, 表示定义了一个匿名的内部类.
* 2. 等号右边的new 接口(), 表示创建了匿名内部类的一个对象
* 3. 等号左边,使用接口去接收了,匿名内部类的对象;// 多态
*
* 作用:
* 没有学习匿名内部类之前,如果要想使用接口或者抽象类,必须创建实现类,或者子类,才能使用
* 有了匿名内部类之后,可以简化了.
public class Demo01NoNameInnerClass {
public static void main(String[] args) {
//method(new Cat());
// 创建匿名内部类对象, 使用对象名接收
Animal ani = new Animal(){
// 重写抽象方法
public void eat(){
System.out.println("小狗吃骨头");
}
};
method(ani);
// 创建匿名内部类的匿名对象,调用方法
new Animal(){
public void eat(){
System.out.println("小猪吃白菜");
}
}.eat();
System.out.println("==================");
}
public static void method(Animal ani){
ani.eat();
}
}
package package12NoNameInnerClass;
//动物接口
public interface Animal {
public abstract void eat();
}
package package12NoNameInnerClass;
//猫类实现动物接口
public class Cat implements Animal{
public void eat(){
System.out.println("猫吃鱼");
}
}
例题:
package cn.itcast.fudao03;
/*
* 某市举办一场运动会,只要是会跑的都可以参加.
要求: 使用到接口,接口作为参数,匿名内部类.
提示: 把跑功能抽取到接口中 ,在测试类中提供参加运动会的静态方法
*/
public class Test01 {
public static void main(String[] args) {
new Sport() {
@Override
public void run() {
System.out.println("参加运动会,奔跑吧小鸡儿飞");
}
}.run();;
}
public static void enterSport(Sport s){
s.run();
}
}
package cn.itcast.fudao03;
public interface Sport {
public abstract void run();
}
* 类作为方法的参数和返回值:
* 不管是JDK提供的类,还是自定义的类,都可以作为方法的参数和返回值
* 抽象可不可以作为方法的参数和返回值呢? 可以
* 接口能不能作为方法的参数和返回值? 可以
如:
package package13ClassAsParaReturn;
//抽象动物类
public abstract class Animal {
public abstract void eat();
}
package package13ClassAsParaReturn;
//人类
public class Person {
String name;
int age;
public void eat(){
System.out.println("吃饭了....");
}
}
package package13ClassAsParaReturn;
//吸烟接口
public interface SmokerInter {
public abstract void smoke();
public abstract void tangtou();
}
package package13ClassAsParaReturn;
/*
* 类作为方法的参数和返回值:
* 不管是JDK提供的类,还是自定义的类,都可以作为方法的参数和返回值
*/
public class Demo01ClassASParaReturn {
public static void main(String[] args) {
// Object obj = null;
// ((String)obj).length();
// String作为方法的参数
String str = new String("hello");
methodString(str);
// String作为方法的返回值
System.out.println(methodString2());
char[] array = methodString2().toCharArray();// 链式编程, 条件: 需要方法有返回值
// person类作为方法的参数
methodPerson(new Person());
// Person类作为方法的返回值
if(methodPerson() instanceof Person){
Person p = (Person)methodPerson();
p.eat();
}
}
/*
* JDK提供的类,作为方法的参数和返回值
*/
public static void methodString(Object obj){// 多态的格式
if(obj instanceof String){
String str = (String)obj;
System.out.println(str.length());
}
}
public static String methodString2(){
return new String("helloworld");
}
/*
* 自定义的Person类作为方法的参数和返回值
*/
public static void methodPerson(Person p ){
System.out.println(p.name);
System.out.println(p.age);
System.out.println(p);// 地址值: 包名 + @ + 地址值
}
public static Object methodPerson(){
return new Person();
}
}
/*
* 抽象可不可以作为方法的参数和返回值呢? 可以
*/
package package13ClassAsParaReturn;
/*
* 抽象可不可以作为方法的参数和返回值呢? 可以
*/
public class Demo02AbstractClass {
public static void main(String[] args) {
// 调用方法,传递有名字的对象
Animal ani = new Animal(){
// 重写抽象方法
public void eat(){
System.out.println("1: 小猫吃鱼");
}
};
method1(ani);
// 调用方法,传递匿名内部类的匿名对象
method1(new Animal(){
//重写抽象方法
public void eat(){
System.out.println("2: 小狗吃骨头");
}
});
System.out.println("=============");
// 抽象类作为方法返回值
Animal ani2 = method3();
ani2.eat();
method3().eat();
}
/*
* 抽象类作为方法的参数
*/
/*
* 抽象类作为方法的参数
*/
public static void method1(Animal ani){
ani.eat();
}
/*
* 抽象类作为方法的返回值
*/
/*
* 抽象类作为方法的返回值
*/
public static Animal method3(){
/*
Animal ani = new Animal(){
// 方法重写
public void eat(){
System.out.println("3.小猪吃白菜");
}
};
return ani;
*/
// 返回匿名内部类的匿名对象
return new Animal(){
// 方法重写
public void eat(){
System.out.println("3.小猪吃白菜");
}
};
}
}
/*
* 接口能不能作为方法的参数和返回值? 可以
*/
package package13ClassAsParaReturn;
/*
* 接口能不能作为方法的参数和返回值? 可以
*/
public class Demo03InterfaceAsParaReturn {
public static void main(String[] args) {
// 1. 接口作为方法的参数传递
SmokerInter si = new SmokerInter(){
// 重写抽象方法
public void smoke(){
System.out.println("抽游泳烟");
}
public void tangtou(){
System.out.println("烫头称为红色");
}
};
method1(si);
method1(new SmokerInter(){
// 重写抽象方法
public void smoke(){
System.out.println("2抽游泳烟");
}
public void tangtou(){
System.out.println("2烫头称为红色");
}
});
System.out.println("=============");
// 接口作为方法的返回值传递
SmokerInter si2 = method2();
si2.smoke();
si2.tangtou();
}
/*
* 接口作为方法的参数传递
*/
/*
* 接口作为方法的参数传递
*/
public static void method1(SmokerInter si){
si.smoke();
si.tangtou();
}
/*
* 接口作为方法的返回值
*/
/*
* 接口作为方法的返回值
*/
public static SmokerInter method2(){
return new SmokerInter(){
public void smoke(){
System.out.println("smoke === smoke");
}
public void tangtou(){
System.out.println("tangtou === tangtou");
}
};
}
}