A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 我是楠楠 于 2018-3-8 14:23 编辑

第2章 内部类


1.1 内部类概述
A:什么是内部类
将类写在其他类的内部,可以写在其他类的成员位置和局部位置,这时写在其他类内部的类就称为内部类。其他类也称为外部类。
B:什么时候使用内部类
在描述事物时,若一个事物内部还包含其他可能包含的事物,比如在描述汽车时,汽车中还包含这发动机,这时发动机就可以使用内部类来描述。
[AppleScript] 纯文本查看 复制代码
class 汽车 { //外部类
class 发动机 { //内部类
}
}
1.2 成员内部类
成员内部类,定义在外部类中的成员位置。与类中的成员变量相似,可通过外部类对象进行访问
A:定义格式
[AppleScript] 纯文本查看 复制代码
class 外部类 {
修饰符 class 内部类 {
//其他代码
}
}
B:访问方式
[AppleScript] 纯文本查看 复制代码
外部类名.内部类名 变量名 = new 外部类名().new 内部类名();
1.2.1 案例代码
[AppleScript] 纯文本查看 复制代码
  package com.itheima_01;
 
 
 
/*
 * 成员内部类:
 * 在类的成员位置,和成员变量以及成员方法所在的位置是一样的
 * 在内部类当中,可以直接访问外部类的成员,包括私有成员
 */
public class InnerDemo {
public static void main(String[] args) {
//Outer o = new Outer();
//o.method();
Outer.Inner i = new Outer().new Inner();
i.function();
 
}
}
 
class Outer {
private int num = 10;
public void method() {
Inner i = new Inner();
i.function();
}
class Inner {
public void function() {
System.out.println(num);
}
}
}
成员内部类
  成员内部类可以使用的修饰符:private,public,procted,final,static,abstract
1.2.2 案例代码四
[AppleScript] 纯文本查看 复制代码
package com.itheima_01;[/align]/*
 * 成员内部类的修饰符:
 * 我们可以使用权限修饰符修饰成员内部类,但是如果使用私有来修饰,则无法在其他类中访问
 * 我们可以使用static修饰成员内部类,不用再创建外部类的对象了
 *
 * 我们可以使用abstract,final修饰成员内部类
 */
public class InnerDemo2 {
public static void main(String[] args) {
//Outer2.Inner2 i;
//Outer2.Inner2 i = new Outer2.Inner2();
//i.function();
Outer2.Inner2.function();
}
}
 
class Outer2 {
public void method() {
Inner2 i = new Inner2();
}
static class Inner2 {
public static void function() {
System.out.println("function");
}
}
}
1.3 局部内部类
  局部内部类,定义在外部类方法中的局部位置。与访问方法中的局部变量相似,可通过调用方法进行访问
A:定义格式
[AppleScript] 纯文本查看 复制代码
class 外部类 {
修饰符 返回值类型 方法名(参数) {
class 内部类 {
//其他代码
}
}
}
B:访问方式
[AppleScript] 纯文本查看 复制代码
在外部类方法中,创建内部类对象,进行访问

1.3.1 案例代码五:
[AppleScript] 纯文本查看 复制代码
 package com.itheima_02;[/align]/*
 * 局部内部类
 * 在方法内,出了方法之后就无法使用
 *
 *
 */
public class InnerDemo3 {
public static void main(String[] args) {
Outer o = new Outer();
o.method();
}
}
 
class Outer {
public void method() {
int num = 10;
class Inner {
public void function() {
System.out.println("function");
}
}
Inner i = new Inner();
i.function();
}
public void test() {
//Inner i = new Inner();
//System.out.println(num);
}
}

1.4 匿名内部类
A:作用:匿名内部类是创建某个类型子类对象的快捷方式。
B:格式:
[AppleScript] 纯文本查看 复制代码
new 父类或接口(){
//进行方法重写
};

代码演示
[AppleScript] 纯文本查看 复制代码
//已经存在的父类:
public abstract class Person{
public abstract void eat();
}
//定义并创建该父类的子类对象,并用多态的方式赋值给父类引用变量
Person  p = new Person(){
public void eat() {
System.out.println(“我吃了”);
}
};
//调用eat方法
p.eat();
使用匿名对象的方式,将定义子类与创建子类对象两个步骤由一个格式一次完成,。虽然是两个步骤,但是两个步骤是连在一起完成的。
匿名内部类如果不定义变量引用,则也是匿名对象。代码如下:
[AppleScript] 纯文本查看 复制代码
new Person(){
public void eat() {
System.out.println(“我吃了”);
}
}.eat();

1.4.1 案例代码:
[AppleScript] 纯文本查看 复制代码
package com.itheima_03;
/*
 * 匿名内部类:
 * 可以把匿名内部类看成是一个没有名字的局部内部类
 * 定义在方法当中
 * 必须在定义匿名内部类的时候创建他的对象
 * 格式:
 * new 类/接口(){
 * 如果是创建了继承这个类的子类对象,我们可以重写父类的方法
 * 如果是创建了实现这个接口的子类对象,我们必须要实现该接口的所有方法
 * };
 * 原理:而是创建了继承这个类的子类对象或者是创建了实现这个接口的子类对象
 *
 */
public class InnerDemo4 {
public static void main(String[] args) {
Outer o = new Outer();
o.method();
}
}
 
 
interface Inner {
public void function();
}
 
class Outer {
public void method() {
/*new Inner() {
 
@Override
public void function() {
System.out.println("function");
}
}.function();;*/
Inner i = new Inner() {
 
@Override
public void function() {
System.out.println("function");
}
};
i.function();
i.function();
}
}
 
 

1.4.2 案例代码:
匿名内部类作为参数传递
[AppleScript] 纯文本查看 复制代码
package com.itheima_04;
 
public interface Animal {
public abstract void eat();
}
 
package com.itheima_04;
 
public class Cat implements Animal {
 
@Override
public void eat() {
System.out.println("猫吃鱼");
}
 
}
[AppleScript] 纯文本查看 复制代码
package com.itheima_04;
 
public class Dog implements Animal {
 
@Override
public void eat() {
System.out.println("狗啃骨头");
}
 
}

[AppleScript] 纯文本查看 复制代码
package com.itheima_04;
/*
 * 匿名内部类的应用场景:
 * 作为参数进行传递
 *
 *      
 */
public class InnerDemo5 {
public static void main(String[] args) {
 //method(new Dog());
 //method(new Cat());
method(
new Animal() {
 
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
);
}
public static void method(Animal a) {
a.eat();
}
}
  
更多
第一天
传智播客·黑马程序员郑州校区地址
河南省郑州市 高新区长椿路11号大学科技园(西区)东门8号楼三层
联系电话 0371-56061160/61/62
来校路线  地铁一号线梧桐街站A口出

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马