自然对齐:sizeof struct, union

【1】以下关于 JVM 的叙述,哪些项正确?

A.JVM 运行于操作系统之上,它依赖于操作系统

B.JVM 运行于操作系统之上,它与操作系统无关

C.JVM 支持 Java 程序运行,它能够直接运行 Java 字节码文件

D.JVM 支持 Java 程序运行,它能够直接运行 Java 源代码文件

扩展名为.java的是源代码文件(文本文件):开发时编写代码的文件

扩展名为.class的是字节码文件(二进制):系统运行时执行的文件

【2】下列选项中正确的表达式是:

A.byte b = 128; 【-128~127 一个字节】

B.boolean n = null; 【null可以给所有的引用数据类型赋值,不能给基本数据类型赋值】

C.double d = 0.313d; 【0.313默认为double类型,可以省略,加上也不是错的】

D. float f = 0.823;【0.823默认为double类型,而double类型在内存中占4个字节,而float类型占2个字节,所以不能直接赋值,float f = 0.823f;表面它是一个float类型的数据才能赋值】

基本数据类型

整数型:byte、short、int、long

小数型:float、double

字符型:char

布尔型:boolean

基本数据类型对应的包装类型,包装类型能够提供作为“类”才具有的一些功能

整数型:Byte、Short、Integer、Long

小数型:Float、Double

字符型:Character

布尔型:Boolean

基本数据类型和引用类型的区别,基本数据类型的值保存在栈内存当中,引用数据类型的值是在堆内存中开辟的一块空间,栈内存中保存的是这块空间的地址

【3】下列标识符哪个是合法的(  )

A.class 【关键字】

B.$abc 【$的存在是为了照顾有PHP开发背景的程序员】

C.1234 【不能以数字开头】

D._name  age 【以_开头是可以的,标识符中间不能有空格】

标识符:我们程序员自己起名字的地方——变量、类、方法、包

规则:可以以字母、数字、下划线、$组成,不能以数字开头

规范:

①变量:驼峰式命名,首字母小写 appleBoy

②类(接口):驼峰式命名,首字母大写 PeopleStudy

③方法:和变量一样

④包:所有字母小写

【4】你想一个类存取同一个包中的另一个类中成员,哪一个存取修饰符限制的最严格?

A.public 【类内部√ 同包√ 子类√ 包外√】

B.private 【类内部√ 同包× 子类× 包外×】

C.protected 【类内部√ 同包√ 子类√ 包外×】

D.transient 【这不是一个权限修饰符,是这里的一个干扰项】

E.不需要任何修饰符 【类内部√ 同包√ 子类× 包外×】

【5】

1. public class Test {

2.  int x= 12;

3.  public void method(int x) {

4.  x+=x;

5.  System.out.println(x);

6.  }

7. }

Given:

34. Test t = new Test();

35. t.method(5);

What is the output from line 5 of the Test class?

A. 5    B. 10   C. 12    D. 17    E. 24

【6】下列选项中的表达式哪个返回true?

A."john" ! = "john"

B."john".equals("john")

C."john" = "john"。

D."john".equals(new Button("john"))

字符串的比较:使用“==”比较是不安全的,“==”双等号比较的内容,对于基本数据类型来说是他们的值,对引用数据类型来说比较的是内存引用地址,总之就是栈内存中的值

比较字符串:要使用equals()方法,比较两个字符串的内容

【7】编译,运行下列代码后的结果是:

public class Test{

public static void main(String args[]){

int age;

age = age+1;

System.out.println(“The age is”+age);

}

}

A. 编译,运行后没有输出

B. 编译,运行后输出:The age is 1

C. 能通过编译,但运行时产生错误

D. 不能通过编译

局部变量要初始化后才能使用,这一点和成员变量不同,成员变量在类加载时就会被初始化。

【8】若在一个for语句中加入break语句,它可以________

A.对for语句执行没有影响

B.中断本次循环,进入下一次循环 continue

C.退出for循环,执行for语句后面的语句

D.以上说法均不对

【9】Given:

55. int []x= {1, 2,3,4, 5};

56. int y[] =x;

57. System.out.println(y[2]);

Which is true?

A. Line 57 will print the value 2.

B. Line 57 will print the value 3.

C. Compilation will fail because of an error in line 55.

D. Compilation will fail because of an error in line 56.

【10】如果编译和运行下面的程序会有什么结果:

public class Q {

public static void main(String argv[]){

int anar[]= new int[5];

System.out.println(anar[0]);

}

}

A. Error: anar 没有被初始化

B. null

C. 0 数组元素创建时,系统会根据其数据类型分配初始值

D. 5

【11】

下面的代码能打印出的结果为:

int i=1;

switch (i) {

case 0:

System.out.println("zero");

break;

case 1:

System.out.println("one");

case 2:

System.out.println("two");

default:

System.out.println("default");

}

A. one B.one, default C.one, two, default D.Default

switch结构进入后,如果没有遇到break,则会一直执行到default,如果任何一个分支都没有进入,则执行default对应的代码

【12】

下面的程序片断中

String a = “ABCD”;

String b = a.toLowerCase();

b.replace(‘a’, ‘d’);

b.replace(‘b’,’c’);

System.out.println(b);

编译运行结果是什么?

A.abcd

B.ABCD

C.dccd

D.dcba

E.编译错误

F.运行时抛出异常

//在Java中,字符串是一个不可改变的字符序列

String a = "ABCD";

//toLowerCase()并没有改变原来的字符串,只是返回一个改变以后的字符串

String b = a.toLowerCase();

//说明a本身并没有改变

System.out.println("a="+a);

//b接受了a改变后的值

System.out.println("b="+b);

b = b.replace(‘a‘, ‘d‘);

b = b.replace(‘b‘, ‘c‘);

//使用b接受replace()方法的返回值

System.out.println("b="+b);

【13】代码:

for (int i =0; i < 4; i +=2) {

System.out.print(i + “”);

}

System.out.println(i);

结果是什么?

A. 0 2 4

B. 0 2 4 5

C. 0 1 2 3 4

D. 编译错误.

E. 运行的时候抛出异常

在Java中,变量的生命周期(作用域范围)是{}之内

【14】下列关于类的继承的描述,正确的有(  )

A. 一个类可以同时继承多个父类【Java是单继承的】

B. 一个类也只能有一个子类【Java中一个类可以有多个子类】

C. 子类能够直接调用父类所有的方法【权限限制】

D. 一个类继承另一个类需要使用 extends 关键字

【15】

11. class Payload {

12. private int weight;

13. public Payload(int wt) { weight = wt; }

13. public void setWeight(int w) { weight = w; }

15. public String toString(){

return Integer.toString(weight);

}

16. }

18. public class TestPayload {

19. static void changePayload(Payload p) {

20. /* insert code here */

21. }

22.

23. public static void main(String[] args) {

24. Payload p = new Payload(10);

25. p.setWeight(1024);

26. changePayload(p);

27. System.out.println(“The value of p is ”+ p);

28. }

29. }

Which statement, placed at line 20, causes(使得) the code to print “The value of p is 420.”?

A. p.setWeight(420);

B. p.changePayload(420);

C. p = new Payload(420);

D. Payload.setWeight(420);

E. p = Payload.setWeight(420);

F. p = new Payload();p.setWeight(420);

【16】

1. abstract class abstractIt {

2. abstract float getFloat ();

3. }

4. public class AbstractTest extends AbstractIt {

5. private float f1= 1.0f;

6. private float getFloat () {return f1;}

7. }

What is the result?

A. Compilation is successful.

B. An error on line 6 causes a runtime failure.

C. An error at line 6 causes compilation to fail.

D. An error at line 2 causes compilation to fail.

五、任务

任务一、单项选择题

【1】在Java中,下列语句不能通过编译的有( B )

A. String s= “join”+ 3;

B. int a= “join”+3;

C. int a= ‘a’+5;

D. float f=5+5.5F;

分析原因:因为int是整数型,不能做字符型相关的加减

【2】以下数据类型中,不是基本数据类型的是(B)

A.byte B.String C.boolean D.char

【3】基本数据类型byte的取值范围是:

A.0 ~ 65, 535

B.(–128) ~ 127

C.(–32,768) ~ 32,767

D.(–256) ~ 255

【4】下面哪行代码会在编译的时候出现错误或警告:

A.float f=1.3f;

B.char c =’a’;

C.byte b = 57;

D.boolean b = null;

E.int i = 10;

分析原因:第四个。因为null可以给所有的引用数据类型赋值,不能给基本数据类型赋值

【5】public static void main方法的参数描述是:

A.String[] args

B.Strings args[]

C.String args

D.String[] args[]

分析原因:(说明你没有选择的选项错在哪里)

此题选A,

B错:因为这是个字符串数据,String后面不能加s,

C错:因为它不符合数据形式

D错:因为不需要两个[],理同C

【6】下面代码b的值是多少?(  )

public class A {

public static void main (String args []) {

float a=3.5;

int b=(int)a+2;

System.out.println(b);

}

}

A.编译错误   B.5.5   C.5    D.6

分析原因:因为3.5是double型数据,不能直接用float修饰

【7】Given:

11. public class Test {

12.  public static void main(String [] args) {

13. int x =5;

14. boolean b1 = true;

15. boolean b2 = false;

16. if((x==4) && !b2)

17. System.out.print(”1 “);

19. System.out.print(”2 “);

20. if ((b2 = true) && b1)

21. System.out.print(”3 “);

22.  }

23. }

What is the result?

A. 2 B. 3 C. 1 2 D. 2 3E. 1 2 3

F. Compilation fails

G. 运行时报错

分析原因:

因为第一个if语句返回的是false,所以if语句下面对应的输出就输出不出来了,接着2输出,然后第二个if语句返回的是true,所以3输出,所以选D;

任务二、编程题

【1】编写程序,打印99乘法表,效果如图所示

public class test {

public static void main(String[] args) {

for (int i=1; i<10;i++) {

for (int j=1; j<=i;j++) {

if (i == j) {

System.out.println(i + "*" + j + "=" + i * j);

} else {

System.out.print(i + "*" + j + "=" + i * j + "   ");

}

}

}

}

}

【2】根据下图实现类。

在 TestCylinder 类中创建 Cylinder 类的对象,利用构造器设置圆柱的底面半径和高,并输出圆柱的表面积和体积。

Circle类:package zuoye;

public class Circle {

private double radius;

public Circle(){}

public Circle(double radius){

this.setRadius(radius);

}

public double getRadius(){

return radius;

}

public void setRadius(double radius){

this.radius=radius;

}

public double findArea(){

double area= 3.14*this.getRadius()*this.getRadius();

return area;

}

}

Cylinder.java

package zuoye;

public class Cylinder extends Circle{

private double length;

public Cylinder(double radius,double length){

setRadius(radius);

this.length=length;

}

public void Cylinder(double length){

this.length=length;

}

public double findArea(){

double  area=(2*3.14*getRadius()*getRadius())+(3.14*2*getRadius()*length);

return area;

}

public double findVolume(){

double Volume = super.findArea()*length;

return Volume;

}

}

TestCylinder.java

package zuoye;

public class TestCylinder {

public static void main(String[] args) {

Cylinder c =new Cylinder(2, 3);

double area = c.findArea();

double volume = c.findVolume();

System.out.println("圆柱的表面积为"+area);

System.out.println("圆柱的体积为"+volume);

}

}

【3】实现单子模式非常重要。

package danzi;

public class single {
	private single(){}

	private static single Instance = new single();
	public static single getInstance(){
		return Instance;
	}
}
package danzi;

public class singleTest {
	public static void main(String[] args) {
		single s1 = single.getInstance();
		single s2 = single.getInstance();
		System.out.println(s1==s2);
	}

}

任务三、简答题

【1】什么是方法的重写?【用程序代码进行测试然后截图附后】

答:重写Override表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现。

重写的要求:

①子类方法对父类方法进行重写,又叫覆盖

②方法名相同

③参数列表相同

④子类方法返回值类型不能比父类方法返回值类型更大

⑤子类方法抛出的编译时异常不能比父类方法范围更大,运行时异常无所谓

⑥子类方法的访问权限不能比父类方法更严格

【2】什么是方法的重载?【用程序代码进行测试然后截图附后】

答:重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。

重载的要求:

①在同一个类中

②相同方法名

③不同参数列表

【3】如何比较两个字符串?为什么要这样?

最好用equals()函数来比较,因为如果单纯用==比较的话,只适用于String s1=”xxx” 和String s2=”xxx”定义的比较,如果是String  t1=new String(“xxx”),这种定义的比较就不可以了,因为前一种类型不管怎么定义,他的地址都是不变的,所以肯定是相等的,但是new String(“xxx”)定义的话就改变了他的地址,所以就不一样了,所以==比较不保险,最好用equals()函数比较。更全面。

自然对齐:sizeof struct, union

时间: 2024-10-29 19:08:15

自然对齐:sizeof struct, union的相关文章

C语言的struct/union字节对齐

C语言的一大优势就是对内存空间的控制,当然,一般情况下对于开发人员来说都是透明的.看一个始终困扰初学者的问题:字节对齐! 先看四个重要的基本概念:1.数据类型自身的对齐值:对于char型数据,其自身对齐值为1,对于short型为2,对于int,float,double类型,其自身对齐值为4,单位字节. 2.结构体或者类的自身对齐值:其成员中自身对齐值最大的那个值. 3.指定对齐值:#pragma pack (value)时的指定对齐值value. 4.数据成员.结构体和类的有效对齐值:自身对齐值

enum,struct,union类型使用和长度

VC,C++ Builder和lcc三个编译器 间枚举类型enum长度的情况. 各种C编译器默认的字节对齐数不一致,要写通用的代码,经常就是使用 #pragma pack(1) ... #pragma pack() 来使编译器以单字节对齐. 今天在bcb5中调用vc6的dll时出现错误,但在VC中调用dll却很正常,说明很有可能是编译器之间的差异造成.仔细debug后发现bcb和vc的枚举类型长度不一样,即便使用了#pragma pack(1)编译开关. 如以下程序: /*-----------

C语言精要总结-内存地址对齐与struct大小判断篇

在笔试时,经常会遇到结构体大小的问题,实际就是在考内存地址对齐.在实际开发中,如果一个结构体会在内存中高频地分配创建,那么掌握内存地址对齐规则,通过简单地自定义对齐方式,或者调整结构体成员的顺序,可以有效地减少内存使用.另外,一些不用边界对齐.可以在任何地址(包括奇数地址)引用任何数据类型的的机器,不在本文讨论范围之内. 什么是地址对齐 计算机读取或者写入存储器地址时,一般以字(因系统而异,32位系统为4个字节)大小(N)的块来执行操作.数据对齐就是将数据存储区的首地址对齐字大小(N)的某个整数

自然对齐和强制对齐

一 自然对齐 各个类型自然对齐,即其起始内存地址必须是其类型本身的整数倍. 对于结构体来说,结构体的起始内存地址,必须是结构体中成员最大长度类型的整数倍. 结构体自然对齐应遵守如下规则 1 数据成员对齐规则 在默认情况下,结构体中各成员变量存放的起始地址相对于结构体的起始地址的偏移量: 应该是sizeof(成员变量类型)或者sizeof(成员变量类型)的倍数. 如果结构体中某个成员变量不是基本类型,比如是子结构体,它的起始地址相对于父结构体起始地址的偏移量: 应该是子结构体中最大的基本类型的整数

error C2227: left of &#39;-&gt;first&#39; must point to class/struct/union

今天调试程序时,遇到这么一个错误: error C2227: left of '->first' must point to class/struct/union #include<iostream> using namespace std; #define ElemType int struct node { struct node *first; struct node *last; int size; }; typedef struct node Node; typedef str

c语言关键字-struct,union,enum及柔性数组

一.struct关键字与柔性数组 c语言中的struct可以看做变量的集合,struct中的每个数据成员都有独立的存储空间 柔性数组:柔性数组在C99中也称之为伸缩型数组,是C99的扩展,简言之就是struct结构里的标识占位符(不占用struct的空间),柔性数组的结构只能在堆上生成. 声明柔性数组的规则 柔性数组成员必须为结构(struct)中的最后一个成员 结构中至少有一个其他成员 柔性数组就像普通数组一样被声明,除了它的方括号内为空 1 struct softarry 2 { 3 int

C++ sizeof(struct) 的注意

今天在测试将C++代码导出的NavMesh二进制文件用一套C#改写的代码导入时,发现导入的数据出现不一致的问题. 分别在C++和C#AddTile的函数内设置断点,观察最后得到的tile有大部分的字段是导入一致的.但是有些字段则出现的一些偏移. 于是猜测应该为C#导入某个结构时出现了位偏移差错,追踪并对比每个字段的导入结果和偏移.最终发现这个结构导入时,出现了偏移变量相差2个单位 在C++处,导入该结构前偏移变量 = 276, 然后导入时: = 276 + sizeof(dtPolyDetail

【基础备忘】求sizeof struct

转自牛客网 一: 1.什么是内存对齐 假设我们同时声明两个变量: char a; short b; 用&(取地址符号)观察变量a, b的地址的话,我们会发现(以16位CPU为例): 如果a的地址是0x0000,那么b的地址将会是0x0002或者是0x0004. 那么就出现这样一个问题:0x0001这个地址没有被使用,那它干什么去了? 答案就是它确实没被使用. 因为CPU每次都是从以2字节(16位CPU)或是4字节(32位CPU)的整数倍的内存地址中读进数据的.如果变量b的地址是0x0001的话,

c语言结构体大小 sizeof(struct A)

1,数据类型自身对齐 数据类型的起始地址为其大小的整数倍 2,结构体的自身对齐 结构体的自身对齐值为其中最大的成员大小 3,指定对齐 可以使用关键词#pragma pack(1) 来指定结构体的对齐值 4,有效对齐值 有效对齐值为自身对齐值与指定对齐值中较小的一个.(即指定对齐值超过自身对齐值无意义) 1 #include<stdio.h> 2 struct { 3 int a; //单个为4 4 char b[3]; // 单个大小为1 因为是数组总和为3 5 double c; //单个为