第一篇:第 7 章 面向对象编程[模版]
类和对象
1.简述类和对象之间的关系
对象是类的实例。
2.对象的引用和对象本身分别存在哪块存储区?
对象的引用实在栈中声明一个地址,来引用堆中的对象。3.方法签名由哪些部分组成?
方法签名有对象名与参数列表组成。
4.创建一个Teacher类,要求描述姓名、性别、年龄、薪水,定义一个方法,用于在教师原有薪水的基础上增加5000,再定义一个TeacherTest类,创建一个Teacher对象并初始化对象的各属性值,调用教师增加薪水的方法,并将增加薪水后的教师信息输出。
public class Teacher { private String name;private String xingbie;private int age;private int xinshui;Teacher(){ String name;String xingbie;int age;int xinshui;} public void setXinshui(int xinshui){ this.xinshui=xinshui;} public int getZhangxinshui(){ return xinshui+5000;} public void setName(String name){ this.name=name;} public String getName(){ return name;} public void setXingbie(String xingbie){ this.xingbie=xingbie;} public String getXingbie(){ return xingbie;} public void setAge(int age){ this.age=age;} public int getAge(){ return age;} } ======= import java.util.Scanner;public class TeacherDema { public static void main(String[] args){ Teacher TeacherTest=new Teacher();Scanner a=new Scanner(System.in);System.out.println(“请输入姓名:”);String b=a.next();TeacherTest.setName(b);System.out.println(“请输入年龄:”);int c=a.nextInt();TeacherTest.setAge(c);System.out.println(“请输入性别:”);String d=a.next();TeacherTest.setXingbie(d);System.out.println(“请输入你的当月工资:”);
int e=a.nextInt();TeacherTest.setXinshui(e);System.out.println(“姓名:” + TeacherTest.getName()+ “n年龄:” + TeacherTest.getAge()+ “n性别:” + TeacherTest.getXingbie()+ “n您的当月工资:” + e + “n加薪后的薪水为:” + TeacherTest.getZhangxinshui());} }
5.小红养了两只猫,一只叫小黑,今年2岁,黑色,另一只叫小白,今年5岁,白色。请编写一个程序,要求当用户输入小猫的名字时,就显示猫的名字、年龄和颜色。如果用户输入的小猫名字错误,则显示“小红没有养这只猫”。
public class Car { private String name;private int age;private String color;Car(){} public void setName(String name){ this.name = name;}
public String getName(){ return name;}
public void setAge(int age){ this.age = age;}
public int getAge(){ return age;}
public void setColor(String color){ this.color = color;} public String getColor(){ return color;} } ======== public class CarDemo { public static void main(String[] args){ Scanner scanner=new Scanner(System.in);Car a=new Car();Car c=new Car();a.setName(“小黑”);a.setAge(2);a.setColor(“黑色”);c.setName(“小白”);c.setAge(5);c.setColor(“白色”);System.out.println(“请输入小猫的名字:”);String k=scanner.next();if(k.equals(“小黑”)){ System.out.println(“name:” + a.getName()+“ age:”+a.getAge()+“ color:”+a.getColor());}else if(k.equals(“小白”)){ System.out.println(“name:” + c.getName()+ “ age:” + c.getAge()+ “ color:” + c.getColor());}else{ System.out.println(“小红没有养这只猫!”);} } }
字符串
1.String str = new String(“abc”),这段代码一共生成了几个String对象?为什么? 2.给定“stuId,name,age”格式的学生信息,解析并创建学生对象 3.输入自己的身份证号码,并由此号码输出自己的生日,年月日
4.给定一个字符串数组,按照字典顺序进行从小到大的排序(排序算法自己写)
{ “asda”, “ret”, “vsa”, “asdf”, “vdft”, “qwr” } 5.统计一个子串在指定字符串中出现的次数(6个)(回家作业)
“javasdfjavawerjavavsswetjavadfgdfgjavadfgdfbtujava ” 6.取出两个字符串中最大相同的子串 7.模拟一个与trim()功能一致的方法
方法
1.定义求圆的面积的方法,并调用该方法求出圆的面积 2.定义一个方法,要求在控制台上画出一个指定长宽的矩形 3.定义求k!的方法,并调用该方法求出10!并输出
4.定义求k!的方法,并调用该方法求出1!+3!+5!+...+19!之和并输出 5.定义求k!的方法,并调用该方法求出C(m,n)= m!/(n!*(m-n)!)并输出 6.定义求两个数中最大数的方法,并调用该方法求出三个数中最大的数 7.定义求三个数中最大数的方法,并调用该方法求出三个数中最大的数 8.编写判定闰年的方法,并调用此方法判定某一年是否是闰年。9.编写判定闰年的方法,并调用此方法求出公元1年到公元1000年之间的所有闰年。10.编写一个将实数四舍五入到小数点后第n位的函数,并调用此函数将一个实数舍入到小数点后第2位(是指内部精度而非输出精度)。
封装、继承
1.编写一个类Student,代表学员,要求:
1)具有属性:姓名、年龄、性别、专业
2)具有方法:自我介绍,负责输出该学员的姓名、年龄、性别以及专业 3)具有两个带参数的构造方法:
第一个构造方法中,设置学员的性别为男,专业为Android,其余属性的值由参数给定;第二个构造方法中,所有属性都由参数给定
编写测试类StudentTest进行测试,分别以两种方式对两个Student对象进行初始化,并分别调用他们的自我介绍方法,看看输出结果是否正确。2.需求
1)定义一个(Person)类,包含属性:姓名,年龄,性别;写好相关的方法,能够构造的时候初始化或者后续修改属性值。
2)定义一个Employee类继承于Person类,包含新的属性:职位;写好相关的方法,能够构造的时候初始化或者后续修改属性值,重写equals方法,规则:当两个对象的姓名,年龄,性别,职位都相等时返回true,否则返回false。
3)写一个测试类进行相关测试(要求可以打印对象的信息,能够比较对象是否“相等”)。效果:
3.假设现在需要对员工进行建模,员工包含3个属性:工号、姓名、工资。经理也是员工,除了含有员工的属性外,另外还有一个奖金属性。请使用继承的思想设计出员工类和经理类。要求类中提供必要的方法进行属性访问。
4.用面向对象编程的思想,设计一个猜拳游戏,完成人机猜拳互动游戏的开发。
功能:
1)选取对战角色 2)猜拳 3)记录分数
效果图:
提示:
先思考这个程序中一共涉及到多少个类,需要创建多少个对象。
5.为某音像店开发一个迷你DVD管理器,实现DVD碟片的管理,包括如下功能:新增DVD、查看DVD、删除DVD、借出DVD、归还DVD。(后台使用数组来存放DVD对象。默认最多存放100个)设计: 1)DVD类(属性:id ,name ,lendCount ,lendDate ,status)(默认每张DVD都是唯一的)lendCount字段每借一次加1 2)DVDDB类(提供一个动态数组来保存多张DVD)3)DVDManager类(提供操纵功能),添加DVD、查看DVD、删除DVD、借出DVD、归还DVD、DVD排行榜(按借出次数降序排序),退出系统 效果图:
多态
1.张三可以开关家里的任何电器,比如电灯、电视、电扇等。使用继承和多态来实现开关电器的方法。
2.学校中心配备一台打印机(可以是黑白打印机,也可以是彩色打印机)。中心可以通过打印机打印学员的个人信息(张三和李四等)。通过继承和多态来设计这个程序,使程序具有更好的扩展性和维护性。
3.模拟一个军队作战,军队里面有各种兵,骑兵,步兵等等。每种兵的攻击敌人方式不一样。建立各种各样的兵,至少3种,然后建立一个军官,军官也会上场去攻击敌人,但是军官还有一种行为,就是发号,军官发号了,无论什么兵都去战场攻击敌人,也可以指定哪种兵去攻击敌人。最后程序运行效果就是一个军官开始发号,然后所有被指定的士兵包括军官都去打仗,显示每个人攻击敌人的方式。4.用Java程序完成以下场景:
有一个主人(Master类),他养了两只宠物(Pet类),一只宠物是狗(Dog类),名字叫“旺财”,另一只宠物是猫(Cat类),名字叫“小花”,现在有两种食物(Food类),分别是骨头(Bone)和鱼(Fish)。主人分别给两只宠物喂食物,两只宠物厌食,狗只吃骨头(如果主人为够吃别的食物,就显示“狗不吃某某食物”);猫只吃鱼(如果主人为猫吃别的食物,就显示“猫不吃某某食物”)提示: 1)程序结构如下
2)main方法代码如下
3)程序运行结果如下
抽象类和接口
1.通过抽象类定义车类的模版,定义一个抽象方法run(),然后通过抽象的车类来派生拖拉机(Tractor)、卡车(Truck)、小轿车(Saloon),并且有各自的run()方法实现。2.编写一个程序,要求: 1)定义一个Student类(属性:学号、名字、成绩),通过实现comparable接口让它具有比较大小的能力(通过成绩来比较)
2)定义一个Student数组stus,生成5个Student对象,存入stus中
3)定义一个StudentTest类,通过调用Arrays工具类中的sort方法来对stus中的元素进行排序。3.编写一个程序,模拟以下场景:
现有一块电脑主板,其主板本身已经集成了网卡和声卡功能,但是为了满足市场的需求,主板上提供了3个PCI接口,提供给用户后期扩展功能使用。用户可以在PCI接口上插上各种PCI设备,例如可以支持千M网速的独立网卡、HIFI音质的独立声卡、检测专用的检测卡等。
4.使用策略模式的设计方式来实现对数组的排序,提供两种具体的实施策略,冒泡排序法和选择排序法。
5.使用策略模式的设计方式来实现两个数的操作获得相应的结果。提供四种具体的实施策略,加、减、乘、除操作。6.需求:
1)定义点类(二维,即包含x,y坐标)Point 2)定义一个图形类Figure(抽象类):包含抽象方法画图(onDraw)3)定义一个三角形继承于图形类, 属性:三个点
方法:设置点,获取点等相关方法以及重写的画图方法
PS:画图方法中要求打印出 画出的是一个什么图形和各个点坐标 4)定义一个圆形类,和三角形要求一致 5)定义一个画家类Painter 方法:画画:可以画出一个图形
6)写一个测试类,测试画家画画,画一个三角形,一个圆形
第二篇:面向对象编程的总结
面向对象编程的总结(理解与看法)面向对象程序设计(Object Oriented Programming,OOP,面向对象程序设计)是一种计算机编程架构。OOP 的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。
OOP 达到了软件工程的三个主要目标:重用性、灵活性和扩展性。为了实现整体运算,每个对象都能够接收信息、处理数据和向其它对象发送信息。
面向对象有三大特性,分别是:封装、继承、多态。封装是隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,以特定的访问权限来使用类的成员。任何类都可以从另外一个类继承,即这个类拥有它所继承类的所有成员。被继承的类称为父类或基类。C# 只支持单继承,不支持多重继承,即在C# 中一次只允许继承一个类,不能同时继承多个类。在C# 中,接口允许多继承,可以通过继承多个接口来实现类似于C++中的多重继承。
多态是同一个类在不同场合下表现出不同的行为特征。
使用抽象方法与虚方法都可以实现多态性。抽象方法是一个未实现的方法,使用abstract关键字修饰,含有抽象方法的类必然是抽象类。抽象方法要在其子方法中通过override关键字重写。
简单工厂模式用于在调用者不知道对象属于哪个自雷的情况下,创建不同的对象。
第三篇:Java面向对象编程习题总结
第一章
面向对象开发方法概述
1.面向对象的软件开发有哪些优点?
1)
把软件系统看成是各种对象的集合,这更接近人类的自然思维方式。
2)
软件需求的变动性往往是功能的变动,而功能的执行者——对象,一般不会有多大的变化,比结构化更稳定。
3)
对象包括属性和行为,对象把数据及方法的具体实现方式一起封装起来,使得方法与之相关的数据不再分析,提高了每个子系统的相对对立性,从而提高软件的可维护性。
4)
支持封装,抽象,继承和多态。提高了软件的可重用性,可维护性和可扩展性。
2.在软件系统中,为什么说一个孤立的不对外提供任何服务的对象是没有意义的?
1)
每个对象都具有特定的功能,相对于其他对象而言,它的功能就是为其他对象提供的服务。
2)
从使用者角度出发,整个软件系统就是一个服务的提供者。
3)
在系统内部,每个子系统也都是服务的提供者,它们其他子系统提供服务。
4)
因此说一个孤立的部队为提供任何服务的系统是美欧任何意义的。
3.列举一些现实生活中的例子,来说明什么是依赖关系、什么是聚集关系,以及什么是关联关系。
1)
关联关系:关联是指类之间的特定对应关系,可以分为单向关联和双向关联,也可以分为一对一关联、一对多关联以及多对多关联。A关联B,是指Class A与Class B之间存在特定的对应关系。举例如学生和老师,订单和客户。
2)
依赖关系:类之间的调用关系。A依赖B,Class A访问Class B提供的服务。如Panel与Shape的关系。
3)
聚集关系:是整体与部分之间的关系
4.列举一些显示生活中的例子,来说明什么是封装,什么是接口。
1)
接口:对象中所有向使用者公开的方法的声明构成了对象的接口。
2)
封装:隐藏对象的属性和实现细节,仅仅对外公开接口。
3)
接口的优点:a.提高系统之间松散耦合b.提高了系统的可扩展性。
4)
封装的有点:
a.便于使用者正确、方便地理解和使用系统,防止使用者错误修改系统的属性。
b.有助于建立各个系统之间的松耦合关系,提高系统的独立性。
c.提高软件的可重用性,没个系统都是一个相对独立的整体,可以在多种环境中得到重用。
d.降低构建大型系统的风险,即使整个系统不成功,个别的独立子系统有可能依然有价值。
5.抽象的最主要特征是什么?
抽象是指从特定角度出发,从已经存在的一些事物中抽取我们所关注的特性,形成一个新的事物的思维过程。
6.在建立对象模型时,要经历哪些抽象思维过程?
1)
从问题领域的事物到软件模型中对象的抽象。
2)
从对象到类的抽象。
3)
从子类到父类的抽象
7.类就是程序员自定义的类型。这种说法是否正确?
不正确,类是一组具有相同属性和行为的对象的抽象。类及类的关系构成了对象模型的主要内容。开发人员需要根据先识别对象,然后再进行分类(创建任意的数据模型)的思路来建立对象模型。
8.小王本来体重70kg,经过减肥,体重降到45kg,试从这个问题领域中识别对象、类、属性、状态和状态的变化。
1)
类:人。
2)
对象:小王。
3)
属性:体重。
4)
状态:70kg。
5)
状态的变化:小王的减肥行为导致体重下降。
9.在UML图中哪些框图描述了系统的动态结构,哪些框图描述了系统的静态结构?
1)
用例图、类框图、组件图、部署图构成了系统的静态模型。
2)
状态转换图、时序图、协作图则构成了系统的动态模型。
第二章
第一个Java应用
1.把一个类放在包里有什么用?
答:把类分包的作用:
(1)
能够区分名字相同的类
(2)
有助于实施访问权限控制
(3)
有助于划分和组织Java应用中的各个类
2.JavaDoc文档是不是为软件的终端用户提供的使用指南?
答:不是的,JavaDoc文档是供Java开发人员阅读的,他们通过JavaDoc文档来了解其他开发人员开发的类的用法。Java开发人员应该养成经常阅读JavaDoc文档的良好习惯。
3.对于com.abc.dollapp.AppMain类,使用以下命令进行编译,编译出来的.class文件位于什么目录下?
java –d C:classes –sourcepath C:src C:srccomabcdollappAppMain.java
答:将会存放在C:classescomabcdollapp下。
4.对于以上编译出来的AppMain类,以下哪个java命令能正确运行它?
(a)
java C:classescomabcdollappAppMain.class
(b)
java –classpath C:classes AppMain
(c)
java –classpath C:classescomabcdollapp AppMain
(d)
java –classpath C:classes com.abc.dollapp.AppMain
答:(b)
5.以下哪些main()方法的声明能够作为程序的入口方法?
(a)
public static void main()
(b)
public static void main(String[] string)
(c)
public static void main(String args)
(d)
static public int main(String[] args)
(e)
static void main(String[] args)
答:(b),主函数必须以public static void形式存在,参数必须为String数组形式。
6.假定以下程序代码都分别放在MyClass.java文件中,哪些程序代码能够编译通过?
(a)
import java.awt.*;package Mypackage;
class MyClass{};
(b)
package MyPackage;
import java.awt.*;
class MyClass{};
(c)
/*This is comment*/
package MyPackage;
import java.awt.*;
public class MyClass{};
答:(c),程序顺序必须按照import, package, class走,源文件必须以public类型的类命名。
7.对于以下Myprog类,运行命令”java Myprog good morning”,将会得到打印结果?
public class Myprog {
public static void main(String argv[])
{
System.out.println(argv[2]);
} }
答:打印结果为空。argv[0] = “good”, argv[1] = “morning”。
8.下面哪些是Java的关键字?
(a)
default
(b)
NULL
(c)
String
(d)
throws
(e)
long
(f)
true
答:(a),(d),(e),(f),java中所有的关键字都是小写。
9.当AppMain类的main()方法创建了5个Doll对象时,运行时数据区的数据如何分布的?参考2.4节的图2-13,画出此时运行时数据区的状态图。
运行时数据区(内存)
Java栈区
执行main()方法的主线程的方法调用栈
局部变量beibei
局部变量jingjing
局部变量huanhuan
局部变量yingying
局部变量nini
堆区
Doll实例
name:贝贝
Doll实例
name:晶晶
Doll实例
name:欢欢
Doll实例
name:迎迎
Doll实例
name:妮妮
方法区
Doll类型信息
AppMain类型信息
(包含main()方法信息)
10.下面哪些是合法的Java标识符?
(a)
#_pound
(b)
_underscore
(c)
5Interstate
(d)
Interstate5
(e)
_5_
(f)
class
答:(b),(d),(e)标识符命名规则如下:
(1)
标识符首字母必须为字母、下划线“_”、美元“$”、人民币“¥”(2)
标识符由数字、大写字母、小写字母、下划线以及美元等组成
(3)
不能把关键字和保留字作为标识符
(4)
标识符没有长度的限制
(5)
标识符是大小写敏感的第三章
数据类型和变量
1.对于以下程序,运行“java Abs”,将得到什么打印结果?
public class Abs
{
static int a = 0x11;
//十六进制
static int b = 0011;
//八进制
static int c = 'u0011';
//十六进制数据的Unicode字符编码
static int d = 011;
//八进制
/**
* @param args
*/
public static void main(String[] args)
{
System.out.println(“a=”+a);
System.out.println(“b=”+b);
System.out.println(“c=”+c);
System.out.println(“d=”+d);
} }
答:输出如下
a=17 b=9 c=17 d=9
2.以下哪段代码能正确编译通过?
(a)
char a = „a‟;
char b = 1;
char c = 08;
(b)
int a = „a‟;
(c)
long a =‟u00FF‟;
(d)
char a = „u0FF‟;
(e)
char d = “d”;
答:(b)、(c)能通过编译。(a)中“char c=08”将int赋值给char需要部分强制转换,“char c=8”就正确;(d)中unicode编码错误,java采用的是UCS-2编码,共16位;(e)字符赋值是使用单引号,字符串String赋值时才使用双引号。
3.下面哪些代码能编译通过?
(a)
short myshort=99S;
(b)
String name = „Excellent tutorial Mr Green‟;(c)
char c = 17c;
(d)
int z = 015;
答:(d)可以编译通过。(a)中char赋值给short需要强制转换;(b)中String类型赋值用双引号;(c)中int赋值给char需要部分强制转换。
4.字符“A”的Unicode字符编码为65.下面哪些代码正确定义了一个代表字符“A”的变量?
(a)
Char ch=65;
(b)
Char ch=‟65‟;
(c)
Char ch =‟u0041‟;
(d)
Char ch=‟A‟;
(e)
Char ch =”A”
答:(c)、(d)可以得到”A”。(b)的输出为5,其他无法编译通过。
5.以下代码共创建了几个对象?
String s1=new String(“hello”);
String s2=new String(“hello”);
String s3=s1;
String s4=s2;
答:共创建了2个对象。栈区4个局部变量分别引用了堆区的2个实例,而2个实例又引用了工作区的同一个类。
6.以下代码能否编译通过?假如能编译通过,运行时将得到什么打印结果?
class Test {
static int myArg = 1;
public static void main(String[] args)
{
Int myArg;
System.out.println(myArg);
} }
答:无法编译通过,因为局部变量myArg声明之后Java虚拟机就不会自动给它初始化为默认值,若在使用前未被初始化,编译会报错。
7.对于以下程序,运行“java Mystery Mighty Mouse”,将得到什么打印结果?
public class Mystery
{
public static void main(String[] args)
{
Changer c = new Changer();
c.method(args);
System.out.println(args[0]+“ ”+args[1]);
}
static class Changer
{
void method(String[] s)
{
String temp = s[0];
s[0] = s[1];
s[1] = temp;
}
} }
答:打印结果为“Mighty Mystery”
8.对于以下程序,运行“java Pass”,将得到什么打印结果?
public class Pass
{
static int j = 20;
public static void main(String[] args)
{
int i=10;
Pass p = new Pass();
p.amethod(i);
System.out.println(“i=”+i);
System.out.println(“j=”+j);
}
public void amethod(int x)
{
x*=2;
j*=2;
} }
答:打印结果是
i=10 j=40
其中“int x”是传参,作用域仅在amethod之中。
第四章 操作符
1.以下哪些程序代码能够编译通过?
(a)
int i=0;if(i){
System.out.println(“hello”);}
(b)
boolean b1=true;
boolean b2=true;
if(b1==b2){
System.out.println(“So true”);}
(c)
int i=1;
int j=2;
if(i==1||j==i){
System.out.println(“ok”);}
(d)
int i=1;
int j=2;
if(i==1&|j==i){
System.out.println(“ok”);}
答:(b)、(c)能编译通过。(a)中int不能作为boolean出现,(d)中不能出现&|该操作符。
2.运行以下程序,将得到什么打印结果?
System.out.println(-1>>>1);
System.out.println(-1>>1);
System.out.println(2>>1);
System.out.println(1<<<1);
答:>>>是逻辑右移位操作符,也称不带符号右移位操作符,在移位的过程中二进制数开头填0;>>是右移位操作符,也称带符号右移位操作符,舍弃末尾,在开头填符号位;<<<操作符不存在;
11111111 11111111 11111111 11111111
-1>>>1
01111111 11111111 11111111 11111111
11111111 11111111 11111111 11111111
-1>>1
11111111 11111111 11111111 11111111
00000000 00000000 00000000 00000010
2>>1
00000000 00000000 00000000 00000001
2147483647-1 1
3.以下temp变量最终取值是什么?
long temp =(int)3.9;
temp %= 2;
答:取值为1。
4.以下代码能否编译通过?假如能编译通过,运行时将得到什么打印结果?
if(5 & 7 > 0 && 5 | 2)System.out.println(“true”);
答:int型不能作为boolean型出现。
5.以下代码能否编译通过?假如编译通过,运行时将得到什么打印结果?
int output=10;
boolean b1 = false;
if((b1==true)&&((output+=10)==20)){
System.out.println(“We are equal”+output);} else {
System.out.println(“Not equal!”+output);}
答:Not equal!10
6.以下代码能否编译通过?假如能编译通过,运行时将得到什么打印结果?
int output=10;
boolean b1 = false;
if((b1==true)&((output+=10)==20)){
System.out.println(“We are equal”+output);} else {
System.out.println(“Not equal!”+output);}
答:Not equal!20
7.对于以下声明:
String s1=new String(“Hello”);
String s2=new String(“there”);
String s3=new String();
下面哪些是合法的操作?
(a)
s3=s1+s2;
(b)
s3=s1-s2;
(c)
s3=s1&s2;
(d)
s3=s1&&s2;
答:(a)是合法操作。除了“+”能用于字符串的连接以外,其他操作符(如“-”、“&”、“&&”等)都不支持String类型的操作元。
第五章
流程控制
1.运行以下代码,将得到什么打印结果?
int i = 3;
int j = 0;
double k = 3.2;
if(i < k)
if(i == j)
System.out.println(i);
else
System.out.println(j);
else
System.out.println(k);
答:0
2.以下代码能否编译通过?假如能编译通过,运行时将得到什么打印结果?
int i = 4;
switch(i){
default:
System.out.println(“default”);
case 0:
System.out.println(“zero”);
break;
case 1:
System.out.println(“one”);
case 2:
System.out.println(“two”);}
答:可以编译通过,打印结果是:
default
zero
分析:default可以放在任何位置上,一旦符合一个case即从头执行到尾,不再判断case。
3.以下哪些是合法的
(a)
int i;for(i=5, int j=10;i<10;j--){}
(b)
int i,j;for(i=0, j=10;i<10, j>0;i++, j--){}
(c)
int i,k;for(i=0, k=9;(i<10 && k>0);i++, k--){}
(d)
int i,j;for(i=0;j=10;i<10;i++,j--){} 答:(a)for语句中int定义要放在开头。编译不通过。
(b)循环判断语句不可以用逗号连接。编译不通过。
(c)合法。
(d)分号只能有2个。
4.运行以下代码,将得到什么打印结果?
int i = 1;
switch(i){
default:
System.out.println(“default”);
case 0:
System.out.println(“zero”);
break;
case 1:
System.out.println(“one”);
case 2:
System.out.println(“two”);}
答:分析同1,运行结果如下:
one
two
5.以下哪些代码合法?
(a)
float x=1;
switch(x){
case 1;
System.out.println(“Got a 1”);
}
(b)
long x=1;
switch(x){
case 1;
System.out.println(“Got a 1”);
}
(c)
byte x=1;
switch(x){
case 1/1;
System.out.println(“Got a 1”);
}
(d)
int x=1;
int c=1;
switch(c){
case x;
System.out.println(“Got a 1”);}
(e)
short x=1;
switch(x){
case 3.2/2;
System.out.println(“Got a 1”);
}
(f)
short x=1;
switch(x){
case 1,2,3;
System.out.println(“Got a 1”);
}
答:只有(c)是合法的。
6.以下代码能否编译通过?假如能编译通过,运行时将得到什么打印结果?
for(int a=0, b=0;a<2;b=++a, System.out.println(“b=”+b)){
System.out.println(“a=”+a);}
答:可以通过编译,打印结果:
a=0 b=1 a=1 b=2
7.以下代码能否编译通过?假如能编译通过,运行时将得到什么打印结果?
int x=0;one:
while(x<10)
{
two:
System.out.println(++x);
if(x>3)
break two;
}
答:不能通过编译。
第四篇:面向对象编程类间关系
面向对象的类间关系(关联关系,聚合关系,组合关系)
很多的人都在说聚合和组合关系的区分方法,大部分人都在引用has a和contains a的区别。
我觉得这种说法实在是抄的没意义。接下来,我将用我的理解来解释这几个比较难以区分的关系该怎么判断。
第一、从属关系
关联关系的两个对象几乎没有从属关系。
例如:一个苹果和一碗水。我们不能说一个苹果里有一碗水,也不能说一碗水里有一个苹果。但是在某些特殊情况下,两者是存在关系的。例如,我们可以用水来洗苹果。
Water.wash(Apple)。这就属于关联关系。从代码的角度来说。Apple类不负责创建Water类,但是Apple类可以保存一个Water的指针,在需要的时候调用。
聚合关系和组合关系
这两者都是带有从属关系的,组合要比聚合的关系更加的紧密。
第二、生命周期
关联关系和聚合关系的生命周期没有要求。
组合关系的生命周期是一致的。曾经有这样一个例子经常被提及——Human类和Brain类。很多人认为,生命周期一致,就是大脑死了,人就死了。多么明显的生命周期一致!我觉得这个例子实在是很无聊。仅仅是拿生物的特性作为潜在条件。Human类和Arm类就不是组合关系了呗?因为没有胳膊,人也能活!
个人认为,组合关系就是缺少了部分类,整体类是否完整。换句话说,需要在整体类的构造函数中创建,在整体类的析构函数中销毁。这样的类,属于组合关系。
聚合关系的例子:Company类和Employee类。在Company的构造函数中,没有必要创建Employee类。在Company的使用过程中,可以AddEmployee,可以RemoveEmployee。这样的两个类,就是聚合关系。
组合关系的例子:Computer类和CPU类。在Computer的构造函数中,需要将CPU一起创建出来,否则Computer无法运行。在Computer的使用过程中,不能AddCPU,RemoveCPU(此处不讨论给硬件升级,降级的情况)。这样的两个类,就是组合关系。
当然,一般情况下,不会要求准确的区分到底是组合关系,还是聚合关系。因为组合关系就是关系紧密的聚合关系。现实生活中也没有绝对的所谓的“组合关系”。比如说在未来给一个人移植大脑,难道不可行么?没有大脑的人一定就会死么?总会有各种可能性来破“组合关系”。
如果你有什么想法和看法想跟我交流,可以给我的邮箱发送邮件。
baidu_hmrs@163.com
第五篇:C语言面向对象编程学习笔记
C语言面向对象编程笔记
1、在底层驱动函数前加static标识符的作用:
a:加了static后表示该函数失去了全局可见性,只在该函数所在的文件作用域内可见 b:当函数声明为static以后,编译器在该目标编译单元内只含有该函数的入口地址,没有函数名,其它编译单元便不能通过该函数名来调用该函数,这也是对1的解析与说明
2、底层驱动的封装模板
通常将存储类,显示类,AD-DA类的外设驱动函数封装为以下几个函数: Void Open(void);
此函数用于开启外设,通常函数体中包涵IO和外设的初始化 Void Close(void)此函数用于关闭外设,特别是一些在休眠下功耗很大的外设,可用mos管控制其Vcc的通断,以此达到降低系统功耗的目的
Void Read(unsigned int address,unsigned char *data[],unsigned int count)
此函数用于读取数据,参数分别为:address,地址,*data[],存放数据的数组,count,要读取的字节数
Void Write(unsigned int address,unsigned char *data[],unsigned int count)此函数用于写数据,参数功能与读函数中相似。
Void control(unsigned char cmd,unsigned char data)此函数用于控制外设的工作状态,如休眠,低功耗等等
3、命名规则
A、宏定义全部用大写
如:#define OLED_CS PBout(12)B、驱动函数名称大小写,并且动词放置在末尾如
static long _OLED_Close(void)C、结构体的名称,结构体名大写,变量名小写,“驱动”的首字母大写
如:struct OLED_DEVICE oledDevice;
4、关于外设的数据手册
外设的数据手册应该去芯片的官网下载最新版本,特别注意芯片的是否有功耗控制方面的内容,