JavaSE复习——技术篇

针对此次的java期末考试写几篇文,作为自己复习资料。

入门篇——定义概念

基础篇——基础知识

技术篇——对知识的深入理解


3.	Java的参数传递方式有两种,地址传递和值传递,其中__复合数据__类型作为参数时为地址传递。

Java的简单数据类型


数据类型

数据类型就是对内存位置的抽象表达。程序员可以利用多种数据类型:某些由编程语言定义,某些由外部库定义,还有些则由程序员来定义。很多编程语言都依赖于特定的计算机类型和对数据类型属性的具体编译实现,比如word和integer数据类型的大小等。另一方面,Java的虚拟机负责定义其内置数据类型的各方面内容。这就意味着不管Java虚拟机(JVM)运行在何等低级的操作系统之上,数据类型的属性都是完全一样的。


简单数据类型


           简单数据类型是不能再简化的、内置的数据类型,由编程语言定义,表示真实的数字、字符和整数。更大、更复杂的数据类型可以采用简单数据类型的组合来定义。在大多数情况下,简单数据类型都具有其硬件等价物。比方说,int简单类型有时存放在32位硬件寄存器内。Java提供了几类简单数据类型表示数字和字符。
           简单数据类型通常划分为以下几种类别:实数、整数、字符和布尔值。这些类别中又包含了多种简单类型。比如说,Java定义了两种简单类型:float和 double,它们都属于实数类别,另外4种简单类型:byte、short、int和long则都属于整数类别。此外还有一种简单类型char则归于字符类型。布尔值类别只有一种简单类型:boolean。表A详细列出了Java的简单数据类型.

Java简单数据类型表


 简单类型 大小 范围/精度 
 float 4 字节 32位IEEE 754单精度 
 double 8 字节 64位IEEE 754双精度 
 byte 1字节 -128到127 
 short 2 字节 -32,768到32,767 
 int 4 字节 -2,147,483,648到2,147,483,647 
 long 8 字节 -9,223,372,036,854,775,808到9,223,372,036, 854,775,807 
 char 2 字节 整个Unicode字符集 
 boolean 1 位 True或者false 


        Java中的所有数字变量都是有符号的,Java不允许数据类型之间随意的转换。只有数字变量之间可以进行类型转换。比如,boolean就不能转换为其他数据类型,而且其他数据类型也不能转换为boolean。
因为Java的简单数据类型都经过准确定义,而且直接内存访问也是不允许的,所以在Java语言中取消了sizeof运算符。
Java的简单数据类型并不是对象。为了采用面向对象方式对待Java简单数据类型,你需要首先用类封装它们。


封装类


          Java 还提供了Byte、Short、Boolean、Character、Integer、Double、Float和Long等内置的封装类。这些封装(wrapper)类提供了很直观的实用方法。比如,Byte、Float, Integer、Long和Double类都具有doubleValue()方法,通过它可以把存储在类的实例中的值转换为Double类型。还有,所有的封装类都提供了静态的valueOf(String s)方法把给定的String转换为对应的简单类型。清单A的代码演示了这些封装类的一些用法。


简单数据类型初始化


在 Java语言中,简单数据类型作为类的成员变量声明时自动初始化为默认值,除非显式地声明。简单数据类型为某一方法声明局部变量时不会自动地初始化而且会导致编译器扔出类似以下的错误消息“Variable x may not have been initialized.(x变量没有初始化)”表B定义了Java简单数据类型的默认值。
表B Java简单数据类型的默认值
类型
默认值
boolean:false

Byte: 0

short:0

int:0

Long:0

Char:′u0000′

Float:0.0

double:0.0


Java简单数据类型的默认初始值


     清单B 中的代码显示所有的Java简单数据类型都用做了Initialization类的成员变量。该例还显示Initialization类的构造器中局部声明了一个int变量。在不修改以上代码的情况下,编译器会在对以上代码进行编译的时候扔出错误。
一旦引发问题的代码行(那些引用未初始化变量导致错误发生的代码)被删除或者注释掉。程序成功编译和执行之后就会显示以下的结果:
byte: 0
short: 0
int: 0
long: 0
float: 0.0
double: 0.0
char: 0
boolean: false
    我们还可以显式地初始化成员变量为其他值,如以下代码所示:
byte b = 5;
short s = 123;
int i = 1234;
long l = 12345;
float f = 123.45f;
double d = 12345.678;
char c = ′A′;
boolean z = true;


小结

       Java定义了全套简单数据类型。此外,Java取消了其他变成语言中的硬件和编译器依附,允许程序员把注意力转移到其他问题上来。在下一篇文章里,我们将继续讨论某些经常用到的、Java定义的复杂数据类型,同时了解下如何利用它们来处理典型的编程问题。


Java的复杂数据类型


索引


      同简单数据类型的定义一样,Java虚拟机(JVM)还定义了索引(reference)这种数据类型。索引类型可以“引用”变量,由于Java没有明确地定义指针类型,所以索引类型可以被认为就是指向实际值或者指向变量所代表的实际值的指针。一个对象可以被多于一个以上的索引所“指”。JVM从不直接对对象寻址而是操作对象的索引。
索引类型分成三种,它们是:类(class)、接口(interface)和数组(array)。索引类型可以引用动态创建的类实例、普通实例和数组。索引还可以包含特殊的值,这就是null 索引。null 索引在运行时上并没有对应的类型,但它可以被转换为任何类型。索引类型的默认值就是null。



     类(Class)指的是定义方法和数据的数据类型。从内部来看,JVM通常把class类型对象实现为指向方法和数据的一套指针。定义class类型的变量只能引用类的实例或者null ,如以下代码所示:
MyObject anObject = new MyObject(); // 合法
MyObject anotherObject = null; // 合法
MyObject stillAnotherObject = 0; // 非法


接口


      接口(interface)好比一种模版,这种模版定义了对象必须实现的方法,其目的就是让这些方法可以作为接口实例被引用。接口不能被实例化。类可以实现多个接口并且通过这些实现的接口被索引。接口变量只能索引实现该接口的类的实例。比方说,假设我们定义了一个接口,名字是Comparable ,同时还定义了一个类SortItem,这个类实现了接口Comparable,那么我们可以编写以下的定义代码:
Comparable c = new SortItem();
假如Comparable 接口定义了一个方法: public void compare(Comparable item), 那么SortItem 类就必须提供compare 方法的实现,如以下代码所示:
public class SortItem implements Comparable
{
public void compare(Comparable item)
    {
         ...method implementation here
}

}


数组


 Java数组(array)是动态创建的索引对象,这一点和类非常相似,此外,同类一样,数组只能索引数组的实例或者null ,如以下代码所示:
    int[] myIntArray = new int[5];
    int[] anotherIntArray = null;
 数组是Object类的继承,这样,Object类的所有方法都可以被数组调用。数组对象由元素组成。元素的数目也可以为0,在这种情况下称做数组为空。所有的数组都是从0开始对元素编号的,这意味着数组内的第1个元素的索引编号是数字0。所有对数组元素的访问都会在运行时上接受检查,如果试图使用编号小于 0或者大于数组长度来索引元素就会产生ArrayIndexOutOfBoundsException异常并被扔出。
数组的元素按整型值索引,如以下代码所示:
    int[] myIntArray = { 9, 5, 6 };
    int int1 = myIntArray[0];
    int int2 = myIntArray[1];
    int int3 = myIntArray[2];
数组对象的长度是不变的。为了改变数组变量的长度,你必须创建另一个数组并赋给变量,如以下代码所示:
    int[] myIntArray = { 9, 5, 6 };
    System.out.println("myIntArray length = " +myIntArray.length); // 输出结果是3
    myIntArray = new int[] { 3, 6, 4, 2, 8 };
    System.out.println("myIntArray length = " +myIntArray.length); // 输出结果是5

文章出处:飞诺网(www.diybl.com):http://www.diybl.com/course/4_webprogram/jsp/jsp_js/20090304/157777.html

其中复杂数据类型作为参数时利用的是  地址传递

1、基本类型作为参数传递时,是传递值的拷贝,无论你怎么改变这个拷贝,原值是不会改变的
2、对象作为参数传递时,是把对象在内存中的地址拷贝了一份传给了参数。

参考文章:

https://www.cnblogs.com/hpyg/p/8005599.html

4.阅读程序段,回答问题:
public class ClassA{
  public void method1(int i){}
  public void method2(int i){}
  public static void method3(int i){}
  public static void method4(int i){}
}
public class  ClassB extends ClassA{
  public static void method1(int i){}
  public void method2(int i){}
  public void method3(int i){}
  public static void method4(int i){}
}
ClassB中(method1、method2、method3、method4)四个方法,方法 
  _method2_______覆盖了父类方法;方法___method4_____ 隐藏了父类方法。

参考文章:

https://www.cnblogs.com/shakinghead/p/7445831.html

子类继承父类后,父类的属性和静态方法并没有被子类抹去,通过相应的引用可以访问的到。但是在子类中不能显示地看到,这种情况就称为隐藏

子类继承父类后,父类的非静态方法被子类重写后覆盖上去,通过相应的引用也访问不到了(除非创建父类的对象来调用)。这种情况称为覆盖

总结一下,就是,子类继承父类后:

父类的成员变量只会被隐藏,而且支持交叉隐藏(比如静态变量被非静态变量隐藏)。父类的静态方法只会被静态方法隐藏,不支持交叉隐藏。父类的非静态方法会被覆盖,但是不能交叉覆盖。

17、给定下列表达式
  Integer I= new Integer(42);
  Long  L= new Long(42);
  Double D= new Double(42.0);
则下列表达式输出为true的是__D___
(A) (I==L)  (B)  (I==D)   (C) (D==L)   (D)  (I.equals (D))

这道题就是错题,直接上一道完整的正确的题。

之前的说法

 ABC不同类型使用 == 编译出错

DEF中包装类使用equals会先判断是否instance,不是的话直接返回false

   (用instanceof判断传入的对象和this是不是一个类的对象)

详解:

 均非包装类的测试

猜你喜欢

转载自blog.csdn.net/qq_41782582/article/details/85070475