06接口与内部类
- 格式:doc
- 大小:48.50 KB
- 文档页数:4
Java内部类(转)内部类 ———定义在类的内部的类为什么需要内部类? 典型的情况是,内部类继承⾃某个类或实现某个接⼝,内部类的代码操作创建其的外围类的对象。
所以你可以认为内部类提供了某种进⼊其外围类的窗⼝。
java中的内部类和接⼝加在⼀起,可以实现多继承。
可以使某些编码根简洁。
隐藏你不想让别⼈知道的操作。
使⽤内部类最吸引⼈的原因是: 每个内部类都能独⽴地继承⾃⼀个(接⼝的)实现,所以⽆论外围类是否已经继承了某个(接⼝的)实现,对于内部类都没有影响。
如果没有内部类提供的可以继承多个具体的或抽象的类的能⼒,⼀些设计与编程问题就很难解决。
从这个⾓度看,内部类使得多重继承的解决⽅案变得完整。
接⼝解决了部分问题,⽽内部类有效地实现了“多重继承”。
内部类分为: 成员内部类、静态嵌套类、⽅法内部类、匿名内部类。
特点: ⼀、内部类仍然是⼀个独⽴的类,在编译之后内部类会被编译成独⽴的.class⽂件,但是前⾯冠以外部类的类命和$符号。
⼆、内部类可以直接或利⽤引⽤访问外部类的属性和⽅法,包括私有属性和⽅法(但静态内部类不能访问外部类的⾮静态成员变量和⽅法)。
内部类所访问的外部属性的值由构造时的外部类对象决定。
三、⽽外部类要访问内部类的成员,则只能通过引⽤的⽅式进⾏,可问内部类所有成员 四、访问机制: System.out.println(this.x);或System.out.println(x);//内部类访问内部类的成员变量或成员⽅法可⽤此⽅法。
System.out.println(OuterClass.this.x);//内部类访问外部类的同名变量时可⽤此⽅法,如果没有同名可⽤System.out.println(x); 五、内部类可以使⽤任意的范围限定:public/private/protected class InnerClass,且严格按照这⼏种访问权限来控制内部类能使⽤的范围。
普通类的范围限定只可以是public或者不加。
一、实验目的1. 理解内部类的概念及其在Java编程中的应用。
2. 掌握内部类的定义、使用方法和特点。
3. 通过实例分析,加深对内部类的理解。
二、实验环境1. 操作系统:Windows 102. 开发工具:Eclipse IDE3. 编程语言:Java三、实验内容1. 内部类的定义及特点2. 成员内部类3. 静态内部类4. 局部内部类5. 匿名内部类四、实验步骤1. 创建一个名为“OuterClass”的类,作为外部类。
2. 在“OuterClass”中定义一个成员内部类“InnerClass”。
3. 在“OuterClass”中定义一个静态内部类“StaticInnerClass”。
4. 在“OuterClass”中定义一个局部内部类“LocalInnerClass”。
5. 创建一个匿名内部类的实例,并演示其使用。
五、实验代码```java// 1. 创建外部类OuterClasspublic class OuterClass {// 2. 成员内部类InnerClasspublic class InnerClass {public void display() {System.out.println("这是成员内部类InnerClass的方法");}}// 3. 静态内部类StaticInnerClasspublic static class StaticInnerClass {public void display() {System.out.println("这是静态内部类StaticInnerClass的方法");}}// 4. 局部内部类LocalInnerClasspublic void outerMethod() {class LocalInnerClass {public void display() {System.out.println("这是局部内部类LocalInnerClass的方法");}}LocalInnerClass localInner = new LocalInnerClass();localInner.display();}// 5. 匿名内部类public void anonymousInnerClass() {Runnable runnable = new Runnable() {@Overridepublic void run() {System.out.println("这是匿名内部类的方法");}};new Thread(runnable).start();}public static void main(String[] args) {OuterClass outer = new OuterClass();OuterClass.InnerClass inner = outer.new InnerClass(); InnerClass.display();StaticInnerClass staticInner = new StaticInnerClass(); staticInner.display();outer.outerMethod();outer.anonymousInnerClass();}}```六、实验结果与分析1. 成员内部类:通过定义在类中的内部类,可以访问外部类的成员变量和方法。
面向对象程序设计(C++和Java)教学大纲课程概述在学习了程序设计基础课程(一般是C语言,也可能是Java语言基础)之后,同学们就可以接触面向对象程序设计语言了。
C++和Java是两门优秀的面向对象程序设计语言,它们的语法、理念有相似之处,但也有很多不同。
在学校的传统课程中,往往只学习其中一门语言,或者在不同的学期分别学习两种语言。
如果分别学习,内容就有重复,概念也容易混淆。
本课程将C++和Java放在一起,按照面向对象的程序设计理念,循序渐进讲解这两种语言的特性,希望学习者能够掌握面向对象理念的精髓,并深刻理解这两种语言的不同。
课程大纲01课程简介与预备知识课时1.1 课程简介及C语言内存1.2 静态和动态1.3 安装开发环境1.4 类和对象022 开始写程序课时2.1 第一个C++程序2.2 第一个Java程序2.3 C++新特性2.4 Java新特性03封装-使用类和对象课时3.1 理解“封装”3.2 C++的封装3.3 Java的封装04继承-类的派生课时4.1 理解“继承”4.2 C++的继承4.3 Java的继承05更进一步课时5.1 多态-关于动态联编5.2 抽象类5.3 override和final06多重继承与接口课时6.1 需求6.2 C++的多重继承6.3 Java的接口与匿名内部类07异常课时7.1 异常机制的需求7.2 C++的异常7.3 Java的异常08模板/泛型课时8.1 C++的模板与STL8.2 Java的泛型09其它课时9.1 I/O9.2 GUI预备知识本课程的先修课为:《C语言程序设计》或《Java语言基础》参考资料《程序设计入门——C语言》,中国大学MOOC平台,浙江大学翁恺《零基础学Java语言》,中国大学MOOC平台,浙江大学翁恺。
JAVA篇:修饰符与接⼝、类、⽅法、成员变量、局部变量、⽅法块或许这是⼀个⽐较轻松简单的知识点,因为只是简单地做⼀个总览对⽐⽽已。
这周⽐较忙,祝我⾃⼰好运。
有关接⼝(interface)的修饰符,其实⼀般⽤public,也可以不加修饰词(default),或者是使⽤private修饰的声明在类的内部的内部接⼝。
不存在protected修饰的接⼝。
⽽接⼝内部可以有⽤public static final修饰的静态常量,除此之外只存在public修饰的⽅法(接⼝中⽆修饰词的⽅法也默认是public)了。
⽆论是接⼝还是接⼝中的⽅法的abstract修饰词都是隐含的,不必显式地修饰在接⼝或者⽅法前⾯。
类的访问限制修饰词与接⼝⼀样,但是还可以有⾮访问限制修饰词abstract(抽象类)和final(不可继承的类)。
类的成员变量可以被四种访问修饰词修饰,同时也可以被static(静态变量),final(常量),transtient(有关序列化特殊标识变量,具体还需要进⾏了解), volatie(线程共享变量)。
类⽅法除了访问限制修饰符,还可使⽤static(静态⽅法),final(不可改变的⽅法),abstract(抽象的),native(⾮java实现的),synchronized(线程同步),类构造⽅法只可使⽤访问限制修饰符修饰,局部变量只能使⽤final定义常量,⽅法块可以使⽤static定义静态⽅法块和使⽤synchronized 定义线程同步的⽅法块。
java的接⼝、类1、接⼝(interface) 在java中,接⼝是⼀个抽象类型,是抽象⽅法的集合,接⼝通常以interface来声明,接⼝只能包含抽象⽅法和以static\final修饰的变量,⼀个接⼝可以继承(extends)另⼀个接⼝。
接⼝只包含要实现的⽅法,⽽类描述对象的属性和⽅法,两者实现类似但是概念不同。
java提供了类和接⼝之间的实现机制,接⼝不可被实例化,只能被实现(implements),实现接⼝的类必须实现接⼝中全部的抽象⽅法,否则该类必须使⽤abstract声明为抽象类。
实验一 Java语言概述【实验目的】1.掌握开发Java应用程序的三个步骤:编写源文件、编译源文件和运行应用程序。
2.熟悉Java应用程序的基本结构,并能联合编译应用程序所需要的类。
文件保存要求:在D:盘新建文件夹“学号”,在“D:\ 学号”下新建文件夹“timu1”。
题目1的文件保存在“timu1”中,以下依次类推。
【题目1】1、实验要求:编写一个简单的Java应用程序,该程序在命令行窗口输出两行文字:“你好,很高兴学习Java”和“We are students”。
2、程序模板:请按模板要求,将【代码】替换为Java程序代码。
3、实验后的练习a.编译器怎样提示丢失大括号的错误。
b.编译器怎样提示语句丢失分号的错误。
c.编译器怎样提示将System写成system这一错误。
d.编译器怎样提示将String写成string这一错误。
【题目2】1、实验要求:编写3个源文件:、、,每个源文件只有一个类。
含有应用程序的主类(含有main方法),并使用了Teacher和Student类。
将3个源文件保存到同一目录,D:\timu2,然后编译。
2、程序模板:请按模板要求,将【代码】替换为Java程序代码。
3、实验后的练习a.将编译通过后,不断地修改源文件中的【代码2】。
比如,在命令行窗口输出“我是语文老师”或“我是数学老师”。
要求每次修改源文件后,单独编译,然后直接运行应用程序(不要再编译)。
b.如果需要编译某个目录下的全部Java源文件,如D:\1001目录,可以使用如下命令:D:\1001>javac *.java请练习上述命令。
【题目3】1、实验要求:课本第15页习题2、实验后的练习习题8.(4)实验四类与对象【实验目的】1.掌握使用类来封装对象的属性和行为。
2.掌握对象的组合以及参数传递。
3.掌握类变量与实例变量,以及类方法与实例方法的区别。
文件保存要求:在D:盘新建文件夹“shiyan04”,在“D:\ 20120shiyan04”下新建文件夹“timu1”。
JAVA接⼝:1.接⼝的定义(属性和⽅法)⼀、接⼝的概念:接⼝是⼀种引⽤的数据类型,接⼝只是描述应该具备的⽅法,没有具体的实现,不能实例化。
1. 接⼝的定义:
关键字:interface,不再使⽤class。
接⼝的⽂件后缀名仍为java,编译后的⽂件仍叫class⽂件
与类的定义相同,唯⼀不同的是关键字
public interface MyInterface{
}
⼆、接⼝内成员(属性、⽅法)定义:
1.接⼝内属性的定义:接⼝中不能定义普通的属性
必须定义为常量,普通的类中可以⽤get set进⾏操作,接⼝不可以。
固定写法:public static final 数据类型属性名 = 值;
公共访问权限静态的固定
2. 接⼝内⽅法的定义:
接⼝内的⽅法,必须全部是抽象⽅法,⽅法的定义有固定格式的:
public abstract 返回值类型⽅法名(参数列表);
因为接⼝内⽅法必须要在实现的类中重写,故修饰符只能⽤public必须使⽤abstract,抽象⽅法
接⼝内的⽅法,只能提供公共访问的抽象⽅法。
外部类与内部类的访问外部类与内部类之间的访问内部类相当于外部类的⼀个成员,和其它成员处于同⼀个级别,因此可以在内部类中直接访问外部类的各个成员(包括私有属性)。
需要注意的是在外部类中要想访问内部类的各个成员(这⾥也包括内部类的私有属性)就必须先实例化内部类,然后才能访问。
对于为什么能访问内部类的私有属性,是因为即使内部类的成员是私有的,但是也是在外部类中,和外部类的其它成员是平等的,只不过被内部类囊括是在内部中,因此访问都必须先实例化。
例如:class NodeManager{private Node root; //根节点//public int a = 3; //此处可以直接在内部类中访问,超出外部类要么⾃⼰访问,要么通过内部类的⽅法来访问//管理添加节点public void addNode(String name){if(root!=null){root.add(name);}else{root = new Node(name);}}public void deleteNode(String name){if(root.getName().equals(name)){root = root.next; //此处即使内部类是私有的,在外部类中也可以通过实例化的对象来访问}else{root.delete(name);}}//管理打印节点public void printNode(){if(root != null){System.out.print(root.getName());}root.print();}/* 此⽅法适⽤于在外部类外部实例化外部类让其访问内部类的属性public int getInt(){return b;}*///内部类,每个节点对象class Node{private String name; //节点名称private Node next; //表⽰当前节点的下⼀个节点 //此处的成员属性要么⾃⼰访问,要么通过外部类中实例化内部类对象访问,要么在整个类外部通过⽅法调⽤来访问 //构造⽅法public Node(String name){ = name;}//获得节点名称public String getName(){return name;}//添加节点public void add(String name){if(this.next != null){this.next.add(name);}else{next = new Node(name);}}//删除节点public void delete(String name){if(this.next != null){if(this.next.getName().equals(name)){this.next = this.next.next;}else{this.next.delete(name);}}}//打印所有节点public void print(){if(this.next != null){System.out.print("->"+this.next.getName());this.next.print();}else{System.out.println();}}/*此⽅法可以让在外部类外实例化的内部类对象访问外部类成员属性public int getInt2(){return a;}*/}}但是要是在整个类的外部不管是实例化外部类还是实例化内部类也好,都⽆法访问对⽅的属性或⽅法,只能通过⾃⼰的⽅法去调⽤对⽅的成员。
类和对象.习题1、基本概念题:1.什么叫类?什么叫对象?类是相似对象中共同属性和方法的集合体。
对象是类的实例。
2.对象怎样得到内存空间的?垃圾对象怎样回收的?对象的内存空间是在用户需要时,用new运算符创建的。
对象也有作用范围,我们把超出作用范围的对象(或称不再被使用的对象)称作垃圾对象。
在Java中,收集和释放内存是一个叫做自动垃圾回收线程的责任。
自动垃圾回收线程在系统空闲时自动运行,这个线程监视用户程序中所有对象的有效作用范围,当某个对象超出其作用范围时,该线程就对这样的对象做上垃圾对象标识,并在适当的时候一次性回收这些垃圾对象。
3.什么叫引用类型?对象是引用类型吗?所谓引用类型,是指该类型的标识符表示的是一片内存连续地址的首地址。
对象和数组一样,也是引用类型。
即对象定义后,系统将给对象标识符分配一个内存单元,用于存放实际对象在内存中的存放位置。
4.类的修饰符共有几种?分别是什么?类声明的<修饰符>分为访问控制符和类型说明符两部分,分别用来说明该类的访问权限以及该类是否为抽象类或最终类。
访问控制符:private、public和protected类型说明符:abstract和final5.共有几种形式的变量?这些变量各自的用途是什么?变量可分为:static:指明该成员变量是一个类成员变量final:指明该成员变量是常量transient:指明该成员变量是临时变量。
transient很少使用。
6.成员变量和成员方法的修饰符共有几种?各自的访问权限是什么?有private、public和protected三种private:修饰符表示该成员变量只能被该类本身访问,任何其他类都不能访问该成员变量。
protected:修饰符表示该成员变量除可以被该类本身和同一个包的类访问外,还可以被它的子类(包括同一个包中的子类和不同包中的子类)访问。
public:修饰符表示该成员变量可以被所有类访问。
1.给出如下层次图和程序片段,下列哪个命题是正确的?【选择一项】
Animal
Mammal
Dog Cat Raccoon Elephant
(implements) (implements)
( Washer ) ( Washer )
1. Cat sunflower;
2. Washer wawa;
3. Elephant pogo;
4.
5. sunflower = new Cat();
6. wawa = sunflower;
7. pogo = (Elephant)wawa;
A第6行导致程序编译失败。
B第7行导致程序编译失败。
C编译通过但是第7行会抛出异常。
D D.以上结果均不是。
2.下列那些命题是不正确的?【选择两项】
A JAVA程序通过接口实现多重继承。
B JAVA里面所有的异常、接口或者其他类,都从Object类扩展而来。
C构造方法可以用private修饰,并且可以抛出异常。
D装箱类一共有六个。
3.下列哪些命题为假?【选择三项】
A静态方法只能被类调用,不能被实例调用。
B所有数据类型都可以用==判断恒等。
C equals()方法成立的地方,==也一定成立。
D包含抽象方法的类一定是抽象类。
4.试图编译、运行下列程序,结果是什么?【选择一项】
//Foo.java
interface Foo {
int k = 0;
}
//Test.java
public class Test implements Foo {
public static void main(String[] args) {
int i;
Test test = new Test();
i = test.k;
i = Test.k;
i = Foo.k;
}
}
A编译失败。
B编译成功。
C运行异常。
D以上结果均不是。
5.下列修饰符不能用于顶层类的是哪个【选择一项】。
A public
B private
C abstract
D final
6.哪些命题为真?【选择两项】
A在Java中,implement用于实现接口。
B非抽象类的子类可以声明为abstract。
C超类的所有成员都将由子类继承。
D final类不可以是抽象的。
E如果类中的所有成员都声明为private,则该类不能声明为public。
7.哪些关于接口的命题为真?【选择两项】
A接口允许多重实现接口。
B接口可以被任意数目的其他接口扩展。
C接口可以扩展任意数目的其他接口。
D接口的成员变量从来不会是static。
E接口的方法总会被声明为static。
8.给出下面的程序:
1. interface Base {
2. boolean m1 ();
3. byte m2(short s);
4. }
下面哪两段代码将编译通过? 【选择两项】
A interface Base2 implements Base {}
B abstract class Class2 extends Base {
public boolean m1() { return true; }
}
C abstract class Class2 implements Base { }
D abstract class Class2 implements Base {
public boolean m1() { return (7 > 4); } }
E class Class2 implements Base {
boolean m1() { return false; }
byte m2(short s) { return 42; }
}
9.给出下面的代码:
1. interface Animal{
2. void soundOff();
3. }
4.
5. class Elephant implements Animal{
6. public void soundOff(){
7 . System.out.println(“Trumpet”);
8. }
9. }
10.
11. class Lion implements Animal{
12. public void soundOff(){
13. System.out.println(“Roar”);
14. }
15. }
16.
17. class Alphal{
18. static Animal get(String choice){
19. if (choice.equalsIgnoreCase(“meat eater”)){
20. retum new Lion();
21 }else{
22 retum new Elephant();
23 }
24 }
25}
哪条语句能够正确编译? 【选择一项】
A new Animal().soundOff();
B Elephant e =new Alphal();
C Lion l=Alpha.get(“meat eater”);
D new Alphal().get(“veggie”).soundOff();
10.给出下面的程序:【选择一项】
1.class Foo {
2. class Bar{ }
3.}
4.class Test {
5. public static void main (String [] args) {
6. Foo f = new Foo();
7. //
8. }
9.}
哪一条语句插入第7行能创建一个Bar实例?
A Foo.Bar b = new Foo.Bar();
B Foo.Bar b = f.new Bar();
C Bar b = new f.Bar();
D Bar b = f.new Bar();
E Foo.Bar b = new f.Bar();
11.给出下面的代码:
1. public interface Foo {
2. int k = 4;
3. }
哪三条语句等价于第2行语句? 【选择三项】
A final int k = 4;
B public int k = 4;
C static int k = 4;
D abstract int k = 4;
E volatile int k = 4;
F protected int k = 4;。