GVKun编程网logo

接口和类的'instanceof'运算符的行为不同(接口和类的用法)

15

在本文中,我们将详细介绍接口和类的'instanceof'运算符的行为不同的各个方面,并为您提供关于接口和类的用法的相关解答,同时,我们也将为您带来关于C中sizeof运算符的行为、intypeofi

在本文中,我们将详细介绍接口和类的'instanceof'运算符的行为不同的各个方面,并为您提供关于接口和类的用法的相关解答,同时,我们也将为您带来关于C中sizeof运算符的行为、in typeof instanceof ===这些运算符有什么作用、instanceof 是 Java 的一个二元操作符(运算符)、instanceof 运算符简介的有用知识。

本文目录一览:

接口和类的'instanceof'运算符的行为不同(接口和类的用法)

接口和类的'instanceof'运算符的行为不同(接口和类的用法)

我想知道有关instanceofJava 中运算符的以下行为。

interface C {}class B {}public class A {    public static void main(String args[]) {        B obj = new B();        System.out.println(obj instanceof A);      //Gives compiler error        System.out.println(obj instanceof C);      //Gives false as output    }}

为什么会这样呢?interface C和之间没有关系class B,但是它给出false,而如果obj instanceof A给出编译器错误?

答案1

小编典典

由于Java没有多类继承,因此在编译过程中绝对知道obj类型的对象B不能是的子类型A。另一方面,它可能是interface的子类型C,例如在这种情况下:

interface C {}class B {}class D extends B implements C {}public class A {    public static void main(String args[]) {        B obj = new D();        System.out.println(obj instanceof C);      //compiles and gives true as output      }}

因此,仅查看obj instanceof C表达式编译器无法预先知道它是对还是错,但是查看obj instanceofA它知道这始终是假的,因此毫无意义,可帮助您防止错误。如果您仍然希望在程序中进行无意义的检查,则可以在上添加显式强制转换Object

System.out.println(((Object)obj) instanceof A);      //compiles fine

C中sizeof运算符的行为

C中sizeof运算符的行为

我的代码变得异常,如下所示
#include<stdio.h>
struct a
{
    int x;
    char y;
};
int main()
{   
   struct a str;
   str.x=2;
   str.y='s';
   printf("%d %d %d",sizeof(int),sizeof(char),sizeof(str));
   getch();
   return 0;
}

对于这段代码,我得到了输出:

4 1 8

据我所知,该结构包含一个大小为4的整数变量和一个大小为1的char变量,因此结构a的大小应为5.但是结构的大小为8.
我正在使用visual C编译器.
为什么会这样?

解决方法

它被称为 Structure Padding

具有以4字节字对齐开始的数据结构(在具有4字节总线和处理器的cpu上)在围绕存储器以及RAM和cpu之间移动数据时效率更高.

您通常可以使用编译器选项和/或编译指示关闭它,这样做的具体细节取决于您的特定编译器.

希望这可以帮助.

in typeof instanceof ===这些运算符有什么作用

in typeof instanceof ===这些运算符有什么作用

这里是修真院前端小课堂,每篇分享文从

【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】

八个方面深度解析前端知识/技能,本篇分享的是:

【return的用法是什么?若在for循环中,还会执行下一次循环吗?】

1.背景介绍

在JavaScript中,有很多常见的运算符和关键字,这次我们来看看其中的 in,typeof,instanceof,还有===,分别是干什么的,有什么用,和什么情况下可能会用到 。

2.知识剖析

2.1、in 运算符

clipboard.png

clipboard.png

IN运算符判断数组

clipboard.png

for in组合遍历大法

2.2、typeof运算符

clipboard.png

可调出console进行demo

2.3、instanceof 运算符

clipboard.png

instansceof最直接的用法

值得一提的是,instanceof 并不能检测 以string或者number为数据类型的值的对象,

关于 对 instanceof 的深入理解,你可能还需要一些 构造函数 和 原型链 的相关知识来支撑。

2.4、=== 运算符

clipboard.png

3.常见问题

JS运算符 == 和 === 之间有什么不一样?

4.解决方案

clipboard.png

==&===原理

5.编码实战

点击这里

6.拓展思考

大家都知道js中可以使用 typeof 来判断 变量 的 基本类型,如:

console.log(typeof ''111'');                // "string"

console.log(typeof 22);                  // "number"

console.log(typeof a);                    // "undefined"

console.log(typeof undefined);      // "undefined"

console.log(typeof []);                    // "object"

但是这个方法不适用于来判断数组,console.log(typeof []);    // "object"

因为不管是数组还是对象,都会返回object,这就需要我们寻找其他的方法,辣么判断数组可以用什么方法呢?

clipboard.png

判断数组的一些方法

7.参考文献

http://blog.csdn.net/dansuwei...

8.更多讨论

分享人:在日常编程中,你还使用过别的有意思的运算符吗?

庄引:ES6中还有Array.isArray(arr);这种方法也可以轻松的分辨数组和对象

肖浩宇:NaN的数据类型

分享人:使用typeofNaN得出值为number;其实这个有点奇怪,我们也讨论了很久,按理说它并不是一个数字,在编码很少直接使用到NaN。通常都是在计算失败时,作为 Math 的某个方法的返回值出现的(例如:Math.sqrt(-1))或者尝试将一个字符串解析成数字但失败了的时候(例如:parseInt("blabla"))。只能说它的属性值是一个number,属于number这个数据类型的集合。

庄引:for in组合遍历数组与for直接遍历数组有什么区别

分享人:for in组合遍历比for有优势,前者不需要知道数组的长度也能将数组中的元素一一遍历出来

instanceof 是 Java 的一个二元操作符(运算符)

instanceof 是 Java 的一个二元操作符(运算符)

instanceof 是 Java 的一个二元操作符(运算符), 也是 Java 的保留关键字。它的作用是判断其左边对象是否为其右边类的实例,返回的是 boolean 类型的数据。用它来判断某个对象是否是某个 Class 类的实例。

用法:

  boolean result = object instanceof class

参数:

  result :boolean 类型。

  object :必选项。任意对象表达式。

  class:必选项。任意已定义的对象类。

说明:

  如果该 object 是该 class 的一个实例,那么返回 true。如果该 object 不是该 class 的一个实例,或者 object 是 null,则返回 false。

例子:

  package com.instanceoftest;
  interface A { } 
  class B implements A { } //B 是 A 的实现
  class C extends B { } //C 继承 B
  class D { }
  class instanceoftest {
    public static void main(String[] args) {
      A a = null;
      B b = null;
      boolean res;
      System.out.println("instanceoftest test case 1: ------------------");
      res = a instanceof A;
      System.out.println("a instanceof A: " + res); // a instanceof A:false
      res = b instanceof B;
      System.out.println("b instanceof B: " + res); // b instanceof B: false
 
      System.out.println("\ninstanceoftest test case 2: ------------------");
      a = new B();
      b = new B();
      res = a instanceof A;
      System.out.println("a instanceof A: " + res); // a instanceof A:true
      res = a instanceof B;
      System.out.println("a instanceof B: " + res); // a instanceof B:true
      res = b instanceof A;
      System.out.println("b instanceof A: " + res); // b instanceof A:true
      res = b instanceof B;
      System.out.println("b instanceof B: " + res); // b instanceof B:true
 
      System.out.println("\ninstanceoftest test case 3: ------------------");
      B b2 = new C();
      res = b2 instanceof A;
      System.out.println("b2 instanceof A: " + res); // b2 instanceof A:true
      res = b2 instanceof B;
      System.out.println("b2 instanceof B: " + res); // b2 instanceof A:true
      res = b2 instanceof C;
      System.out.println("b2 instanceof C: " + res); // b2 instanceof A:true
 
      
      System.out.println("\ninstanceoftest test case 4: ------------------");
      D d = new D();
      res = d instanceof A;
      System.out.println("d instanceof A: " + res); // d instanceof A:false
      res = d instanceof B;
      System.out.println("d instanceof B: " + res); // d instanceof B:false
      res = d instanceof C;
      System.out.println("d instanceof C: " + res); // d instanceof C:false
      res = d instanceof D;
      System.out.println("d instanceof D: " + res); // d instanceof D:true
    }
  }

instanceof 运算符简介

instanceof 运算符简介

  • instanceof和+、-符号一样,都是Java提供的运算符;(同样特殊的还有(type)运算符)
  • instanceof运算符的前一个操作数是一个实例对象,后一个操作数是一个类,它用于判断前面的对象是否是后面的类,或者其子类的实例,如果是,返回true,否则返回false;
  • (重点)在进行引用变量的强制类型转换之前,用来判断前一个对象是否是后一个类的实例,是否可以成功转换,从而保证代码更加健壮;
  • (难点)引用变量之间的类型转换只能在具有继承关系的两个类型之间进行,如果前后是两个没有任何继承关系的类型,则进行类型转换时会报错,用instanceof判断时也会报错。
    ??????如果试图把一个父类实例强制转换成子类类型,则这个对象必须实际上是子类实例才行(即编译类型为父类类型,而运行时类型是子类类型),否则将在运行时引发ClassCastException异常,而如果用instanceof事先判断的话,则会返回false,保证代码的健壮性

??下面是个例子:

public class InstanofTest {

    public static void main(String[] args) {
        //声明obj时使用Object类,则其编译类型是Object
        //但obj运行时类型是String
        Object obj = "hello";
        //下面语句会返回true
        System.out.println(obj instanceof Object);
        //下面语句会返回true,String是Object类的子类,obj运行时类型是String,返回true
        System.out.println(obj instanceof String);
        //下面语句会返回false,Math是Object类的子类,但obj运行时类型是String
        System.out.println(obj instanceof Math);
        //下面语句在编译时不会报错,obj的编译类型是Object,是所有类包括Math类的父类
        //但运行时会报ClassCastException异常,原因是obj运行时类型是String,无法转换成Math
        Math m = (Math)obj;
        String str = "hello";
        //下面语句在编译时会报错,在Eclipse中编写该语句也会报错,str类型既不是Math类,也不是Math类的父类
        System.out.println(str instanceof Math);
    }

}

今天关于接口和类的'instanceof'运算符的行为不同接口和类的用法的讲解已经结束,谢谢您的阅读,如果想了解更多关于C中sizeof运算符的行为、in typeof instanceof ===这些运算符有什么作用、instanceof 是 Java 的一个二元操作符(运算符)、instanceof 运算符简介的相关知识,请在本站搜索。

本文标签: