首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

灵魂拷问Java泛型,extends你为什么继承

问题 今天在知乎上遇到这么个问题,泛型方法apply定义了泛型T和S,S extends T,按理说S只能是T的本身及其子类型,但实际中,参数s传入任何类型都能正常运行。...问题如下: 看到这个问题,自己第一反应也是很纳闷,为什么调用apply的时候,T指定了Double,S传入Integer为什么还不报错了,自己还特地去运行了一下,居然能正常运行。...但是为什么都是Object类型呢,S不是继承了T么?从类型擦除的角度来说,编译的时候T和S都会被擦除掉,但是S是T的子类型这一点是肯定的。...但是在编译的时候,T的类型根本没有确定,编译器也不知道T到底是什么类型,所以就给他一个Object类型,所以S extends Object。...总结 说白了泛型在编译时需要先声明,才能起到约束作用。方法中的泛型要不然在类上定义,在创建类的时候指明具体类型,要不然就在定义泛型方法的时候指明具体类型。 就酱,共勉,晚安。

33310
您找到你想要的搜索结果了吗?
是的
没有找到

025:为什么需要将Logger对象声明为private static final类型

有时候我会使用protected而不是private,只有一种情况下我会这么用:当我的设计中有继承体系,并且我希望继承体系里的对象都使用同一个日志对象时,就会在基类里定义一个protected的日志对象...背景知识梳理 Java中的访问修饰符 private(私有的):只有声明该成员的类内部才可以访问这个成员; package-private(包级-私有的):声明改成员的包内部的任何类都可以访问这个成员。...protected(受保护的):声明该成员的子类可以访问这个成员,并且声明改成员的包内部的任何类也可以访问该成员; public(公有的):在任何地方都可以访问该成员 static关键词 修饰成员变量,...final关键词 final修饰符一般用于基本类型(primitive)域,或不可变(immutable)类对象。

1.5K20

夯实Java基础系列18:深入理解Java内部类及其实现原理

, 参数的类型是外部类的类型, 在构造方法内部使用这个参数为1中添加的成员变量赋值;   3 在调用内部类的构造函数初始化内部类对象时, 会默认传入外部类的引用。...问得好,区别如下: (1)静态内部类持有外部类的引用 在普通内部类中,我们可以直接访问外部类的属性、方法,即使是private类型也可以访问,这是因为内部类持有一个外部类的引用,可以自由访问。...为什么普通内部类不能有静态变量呢?...} } //包外部依然无法访问,因为包没有继承关系,所以找不到这个类 protected static class SS{ int i = 2;//内部类之间共享变量...匿名内部类为什么只能访问局部的final变量?

1.2K10

夯实Java基础系列18:深入理解Java内部类及其实现原理

, 参数的类型是外部类的类型, 在构造方法内部使用这个参数为1中添加的成员变量赋值; 3 在调用内部类的构造函数初始化内部类对象时, 会默认传入外部类的引用。...问得好,区别如下: (1)静态内部类持有外部类的引用 在普通内部类中,我们可以直接访问外部类的属性、方法,即使是private类型也可以访问,这是因为内部类持有一个外部类的引用,可以自由访问。...为什么普通内部类不能有静态变量呢?...} } //包外部依然无法访问,因为包没有继承关系,所以找不到这个类 protected static class SS{ int i = 2;//内部类之间共享变量...匿名内部类为什么只能访问局部的final变量?

40710

【Java面试八股文宝典之基础篇】备战2023 查缺补漏 你越早准备 越早成功!!!——Day09

目录 hashCode()与equals()之间的关系 简述final作用 为什么局部内部类和匿名内部类只能访问局部final变量? ...简述final作用 最终的 修饰类:表示类不可被继承 修饰方法:表示方法不可被子类覆盖,但是可以重载 修饰变量:表示变量一旦被赋值就不可以更改它的值。...如果 final 修饰的是成员变量,可以在非静态初始化块、声明该变量或者构造器中执行初始值。 (2)修饰局部变量 系统不会为局部变量进行初始化,局部变量必须由程序员显示初始化。...因此使用 final 修饰局部变量 时, 即可以在定义时指定默认值(后面的代码不能对变量再赋值),也可以指定默认值,而在 后面的代码 中对final 变量赋初值(仅一次) (3)修饰基本类型数据和引用类型数据...为什么局部内部类和匿名内部类只能访问局部final变量?

26730

java小心机(4)| 继承与组合的爱恨情仇

继承 子类拥有父类的基本特性,需使用extend关键字实现,声明某子类继承于某父类 如下例子,麻雀继承鸟类 //鸟类 public class Bird { public void eat()...在运行时,子类无法选择不同的父类 紧耦合 缺点分析 1.为什么说破坏封装性?...,结构越复杂 3.继承不能支持动态继承 因为继承是编译期就决定下来的,无法在运行时改变 4.为什么说紧耦合?...在运行时,整体对象可以选择不同类型局部对象 整体类可以对局部类进行包装,封装局部类的接口,提供新的接口 缺点 整体类不能自动获得和局部类同样的接口 创建整体类的对象时,需要创建所有局部类的对象 继承与组合对比...方法调用需要同时接受两个子类的类型,这时就需要将他们的父类作为方法参数,使用向上转型将子类转换为父类类型 以上文中继承的例子Fruit和Apple,添加Banner类和一个测试类,如下 public

47631

Java面向对象问题汇总

1.5、为什么是单继承而不能多继承呢? 如果在一个子类继承的多个父类中拥有相同名字的实例变量,子类在引用该变量时将产生歧义,无法判断应该使用哪个父类的变量。...如果在一个子类继承的多个父类中拥有相同方法,子类中有没有覆盖该方法,那么调用该方法时将产生歧义,无法判断应该调用哪个父类的方法。 1.6、为什么是多实现呢?...安全、严密性:接口是实现软件松耦合的重要手段,它描叙了系统对外的所有服务,而涉及任何具体的实现细节。这样就比较安全、严密一些。...3.3、静态内部类和非静态内部类的区别有 静态内部类是指被声明为static的内部类,可不依赖外部类实例化,而非静态内部类需要通过生成外部类来间接生成。...3.5、为什么内部类调用的局部变量必须是final修饰的? 由于方法中的局部变量的生命周期很短,一旦方法结束变量就要被销毁,为了保证在内部类中能找到外部局部变量。

34930

关于final关键字的两个面试题

我做一下记录,仅供参考 简述final的作用 为什么局部内部类和匿名内部类只能访问局部的final变量 二、简述final的作用 final是一个修饰符,表示最终的,不可被修改 修饰类:表示类不可被继承...public static void main(String[] args) { final int a = 1;// 一旦赋值无法改变 final int b;// 在声明时...,可以赋值 b = 2;// 在使用前一定要进行赋值 System.out.println(a + b); } } 修饰静态变量时 public class Demo...a = 1; // 在静态代码块中赋值 static final int b; static { b = 2; } } 修饰基本数据类型和引用类型时...Person { String name; int age; } 三、局部内部类和匿名内部类 为什么局部内部类和匿名内部类只能访问局部的final变量 这的确是一个好问题,我们一起来看看

27320

java内部类 java内部类作用

java内部类作用 为什么在Java中需要内部类?总结一下主要有以下四点:   1.每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。...当我们将内部类声明为private时,只有外部类可以访问内部类,很好地隐藏了内部类。 内部类可以继承(extends)或实现(implements)其他的类或接口,而不受外部类的影响。...局部内部类也可以访问所在方法的局部变量、方法参数等,限制是局部变量或方法参数只有在声明为final时才能被访问。 ?...2、匿名内部类必须继承或实现一个接口,指定给new的类型为匿名类的超类型,匿名类不能有显示的extends或implements子句,也不能有任何修饰符。...3、匿名内部类和成员内部类、局部内部类一样,也不能声明静态成员。 ?

2.8K20

JDK1.9-final关键字

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 1.1 概述 学习了继承后,我们知道,子类可以在父类的基础上改写父类内容,比如,方法重写。...那么我们能不能随意的继承API中提供的类,改写其内容呢?显然这是不合适的。为了避免这种随意改写的情况,Java提供了 用于修饰不可改变内容。 final: 不可改变。可以用于修饰类、方法和变量。...类:被修饰的类,不能被继承。 方法:被修饰的方法,不能被重写。 变量:被修饰的变量,不能被重新赋值。 1.2 使用方式 修饰类 格式如下: ?...修饰变量 1.局部变量—基本类型 基本类型局部变量,被final修饰后,只能赋值一次,不能再更改。代码如下: ? 思考,如下两种写法,哪种可以通过编译? 写法1: ? 写法2: ?...写法2,为什么通过编译呢?因为每次循环,都是一次新的变量c。这也是大家 需要注意的地方 2.局部变量—引用类型 引用类型局部变量,被final修饰后,只能指向一个对象,地址不能再更改。

37130

【Java基本功】一文读懂Java内部类的用法和原理

, 参数的类型是外部类的类型, 在构造方法内部使用这个参数为1中添加的成员变量赋值;   3 在调用内部类的构造函数初始化内部类对象时, 会默认传入外部类的引用。...问得好,区别如下: (1)静态内部类持有外部类的引用 在普通内部类中,我们可以直接访问外部类的属性、方法,即使是private类型也可以访问,这是因为内部类持有一个外部类的引用,可以自由访问。...==为什么普通内部类不能有静态变量呢?...} } //包外部依然无法访问,因为包没有继承关系,所以找不到这个类 protected static class SS{ int i = 2;//内部类之间共享变量...final类型

92430

Java中的final关键字详解

文章目录 final概述 使用方式 修饰类 修饰方法 修饰变量 局部变量—基本类型 局部变量—引用类型 成员变量 final概述 子类可以在父类的基础上改写父类内容,比如,方法重写。...类:被修饰的类,不能被继承。 方法:被修饰的方法,不能被重写。 变量:被修饰的变量,不能被重新赋值。...有抽象方法的abstract类被继承时,其中的方法必须被子类Override,而final不能被Override。...修饰变量 局部变量—基本类型 基本类型局部变量,被final修饰后,只能赋值一次,不能再更改。...写法2,为什么通过编译呢?因为每次循环,都是一次新的变量c。这也是大家需要注意的地方。 局部变量—引用类型 引用类型局部变量,被final修饰后,只能指向一个对象,地址不能再更改。

25820

C++面试知识总结

struct保证成员按照声明顺序在内存中存储,而class不能保证。 默认情况下,struct是public继承,而class是private继承。...咋不同文件中:直接引用头文件;使用extern声明变量。 2.13 变量声明和定义的区别 变量声明:告诉编译器有某个类型的变量,但不会为其分配内存。 变量定义:位该类型的变量分配内存。...2.19 static局部变量和普通局部变量的区别 静态局部变量只在定义它的函数内有效,只是程序仅分配一次内存,函数返回后,该变量不会消失,直到程序运行结束后才释放。...普通局部变量在定义它的函数内有效,这个函数返回会后失效。 static局部变量会自动初始化,而局部变量不会。...为什么((int *)p)++; 不行? 类型转换的实质“把这些二进制位看作另一种类型, 并作相应的对待”。 ((int *)p)++是一个转换操作符, 根据定义它只能生成一个右值(rvalue)。

1.7K41

JAVA 1-6章测试题

答:1>数组中的类型都是同类型的 2>数组的大小是确定的 3>数组中的元素可以是基本类型和引用类型 4>数组是引用类型,数组型数据是对象 5>数组是通过操作下标来使用的 19、JAVA中为什么要引入包体的概念...答:1>抽象类只能单继承,抽象方法是以abstract修饰的,只声明返回类型、方法名称、参数列表、没有方法体; 2>并且抽象类中不一定有抽象方法,但有抽象方法的类必须申明为抽象类; 3>抽象类不能被实例化...答:生成父类的对象。通过super关键字来实现。 34、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?...50、类中完全是实现了的方法,能否将本类声明为一个抽象类?为什么? 答:可以。抽象类可以没有抽象方法,但含有抽象方法的类必须申明为抽象类。...54、静态变量、实例变量、局部变量的声明周期及初始化过程介绍? 答:静态变量:类的静态变量在内存中只有一个,Java虚拟机在加载类的过程中为静态变量分配内存,静态变量位于方法区,被所有类的实例共享。

82830

var lady first

C# 中的隐式类型局部变量是为了支持匿名类型而出现的,并且也是为了解决一部分查询操作返回的结果是 IQueryable 类型,而另一部分查询返回的结果是 IEnumerable 类型导致的把 IQueryable...在大部分情况下使用 var 声明隐式类型的变量,编译器会自动选择合适的类型来处理。...看到这里,一定会有读者说既然有明确的类型为什么指定明确的类型呢,而且使用隐式变量也会容易让其他开发人员搞不清楚变量的类型。那么我现在就给大家解答一下。...首先局部变量类型推断不等于动态类型检查,var 声明的变量不是动态变量,c# 会根据赋值符号等号右边的值的类型来确定等号左边的变量类型。其次,编译器会自动判断类型。...这里我需要强调的是隐式类型变量的真实类型是由方法的签名决定的,也就是说不管这个隐式类型的真实类型是从某个类继承的类还是实现了一个或多个接口的类,只要没有明确执行类型转换,编译器都会根据方法的签名来决定隐式类型的真实类型

84320

菜鸟教程java_JAVA笔记(菜鸟教程)

1.局部变量是在栈上分配的。 2.局部变量没有默认值,所以局部变量被声明后,必须经过初始化,才可以使用。...5.方法继承的规则: 父类中声明为 public 的方法在子类中也必须为 public。...父类中声明为 protected 的方法在子类中要么声明为 protected,要么声明为 public,不能声明为 private。 父类中声明为 private 的方法,不能够被继承。...但抽象类可以包含抽象方法。抽象方法的声明以分号结尾。 例如:public abstract sample(); 8.synchronized 关键字声明的方法同一时间只能被一个线程访问。...抽象类中的抽象方法只是声明包含方法体,就是不给出方法的具体实现也就是方法的具体功能。 (4). 构造方法,类方法(用static修饰的方法)不能声明为抽象方法。 (5).

1.3K10

C++笔试面试题整理

常引用声明方式:const类型标识符 &引用名=目标变量名; 将“引用”作为函数返回值类型的格式、好处和需要遵守的规则?...格式:类型标识符 &函数名(形参列表及类型说明){ //函数体 } 好处:在内存中产生被返回值的副本;(注意:正是因为这点原因,所以返回一个局部变量的引用是不可取的。...生命周期不同: 全局变量随主程序创建和创建,随主程序销毁而销毁;局部变量在局部函数内部,甚至局部循环体等内部存在,退出就不存在; 使用方式不同:通过声明后全局变量程序的各个部分都可以用到;局部变量只能在局部使用...生命周期不同: 全局变量随主程序创建和创建,随主程序销毁而销毁;局部变量在局部函数内部,甚至局部循环体等内部存在,退出就不存在; 使用方式不同:通过声明后全局变量程序的各个部分都可以用到;局部变量只能在局部使用...单向的,非传递的,不能继承的。 成员函数通过什么来区分不同对象的成员数据?为什么它能够区分? 答:通过this指针指向对象的首地址来区分的。 对象都具有的两方面特征是什么?分别是什么含义?

2.5K30
领券