精华内容
下载资源
问答
  • C++不可继承类final

    千次阅读 2017-10-13 07:14:46
    经理丢了一份win服务器代码给我,看到一个这样的写法 class xxxx final ,懵了。默默记下来,回来查资料做实验,看一下到底是什么新姿势。 0x01测试代码 class System final { private: unsigned int ...

    0x00触发场景

    经理丢了一份win服务器代码给我,看到一个类这样的写法 class xxxx final ,懵了。默默记下来,回来查资料做实验,看一下到底是什么新姿势。


    0x01测试代码

    class System final
    {
    private:
    	unsigned int version;
    };


    //这里winSystem继承System报错

    class WinSystem : public System
    {
    
    };
    


    0x02总结

    查资料说这是c++11的新特性,在class后面加上关键字final之后,该类就不能被子类锁继承。


    0x03适用场景

    暂时还不知道有哪些场景



    展开全文
  • 首先你要知道自己为什么final,final干什么! 6.8.2 final方法 之所以要使用final方法,可能是出于对两方面理由的考虑。第一个是为方法“上锁”,防止任何继承类改变它的本来含义。设计程序时,若希望一个方法...

    首先你要知道自己为什么要用final,用final干什么!

    final方法
    之所以要使用final方法,可能是出于对两方面理由的考虑。第一个是为方法“上锁”,防止任何继承类改变它的本来含义。设计程序时,若希望一个方法的行为在继承期间保持
    不变,而且不可被覆盖或改写,就可以采取这种做法。
    这是final的规定

    当你将final用于类身上时,一个final类是无法被任何人继承的,那也就意味着此类在一个继承树中是一个叶子类,并且此类的设计已被认为很完美而不需要
    进行修改或扩展。对于final类中的成员,你可以定义其为final,也可以不是final。而对于方法,由于所属类为final的关系,自然也就成了final型的。你也可以明确的给final
    类中的方法加上一个final,但这显然没有意义。


     采用final方法的第二个理由是程序执行的效率。将一个方法设成final后,编译器就可以把对那个方法的所有调用都置入“嵌入”调用里。只要编译器发现一个final方法调用,
    就会(根据它自己的判断)忽略为执行方法调用机制而采取的常规代码插入方法(将自变量压入堆栈;跳至方法代码并执行它;跳回来;清除堆栈自变量;最后对返回值进行处理)。
    相反,它会用方法主体内实际代码的一个副本来替换方法调用。这样做可避免方法调用时的系统开销。当然,若方法体积太大,那么程序也会变得雍肿,可能受到到不到嵌入代码
    所带来的任何性能提升。因为任何提升都被花在方法内部的时间抵消了。Java编译器能自动侦测这些情况,并颇为“明智”地决定是否嵌入一个final方法。然而,最好还是不要
    完全相信编译器能正确地作出所有判断。通常,只有在方法的代码量非常少,或者想明确禁止方法被覆盖的时候,才应考虑将一个方法设为final。类内所有private方法都自动成为final。由于我们不能访问一个private方法,所以它绝对不会被其他方法覆盖(若强行这样做,编译器会给出错误提示)。
    可为一个private方法添加final指示符,但却不能为那个方法提供任何额外的含义。


    final类
    如果说整个类都是final(在它的定义前冠以final关键字),就表明自己不希望从这个类继承,或者不允许其他任何人采取这种操作。换言之,出于这样或那样的原因,我们的类
    肯定不需要进行任何改变;或者出于安全方面的理由,我们不希望进行子类化(子类处理)。


    展开全文
  • 我们知道在Java中,String是不可变的、final的。Java在运行时也保存了一个字符串池(String pool),这使得String成为了一个特别的。 主要是为了 “ 效率 ” 和 “ 安全性 ” 的缘故。 若 String 允许...

    String是所有语言中最常用的一个类。我们知道在Java中,String是不可变的、final的。Java在运行时也保存了一个字符串池(String pool),这使得String成为了一个特别的类。

    主要是为了 “ 效率 ”  “ 安全性 ” 的缘故。  String 允许被继承由于它的高度被使用率可能会降低程序的性能,所以 String 被定义成 final

     

    一:String 和其他基本类型不同 , 他是个对象类型既然是对象类型 , 如果是在静态方法下是必须调用静态方法或值的 , 如果是非静态的方法 , 就必须要实例化.

     

    main 函数是个 static 所以String 要能像其他的基本类型一样直接被调用这也是为什么在 main 函数下使用 String 类型不会报告错误的原因..

     

    一下就解释了两个心里的疑问..

     

    以前一直觉得奇怪 ,为什么 String 是对象类型在 main 函数下却是不需要实例化的再次佩服 java 设计人员想得真周到.

     

    二:当定义 String 类型的静态字段(也成类字段),可以用静态变量(非 final)代替常量(final)加快程序速度。 反之,对于原始数据类型,例如 int,也成立。

     

    例如,你可能创建一个如下的 String 对象:

     

    Privatestatic final Stringx="example";

    对于这个静态常量(由 final 关键字标识),你使用常量的每个时候都会创建一个临时的 String 对象。 在字节代码中,编译器去掉 ”x”,代替它的是字符串 “example”, 以致每次引用 ”x”  VM 都会进行一次哈希表查询。

     

    相比之下,度于静态变量 (  final 关键字 ),字符串只创建一次。 仅当初始化 “x” 时, VM 才进行哈希表查询。

     

    还有另一个解释 :

    带有 final 修饰符的类是不可派生的。  java 核心 API 中,有许多应用 final 的例子,例如 java.lang.String  String 类指定 final 防止了人们覆盖 length() 方法。

     

    另外,如果指定一个类为 final,则该类所有的方法都是 final java 编译器会寻找机会内联(inline)所有的 final 方法(这和具体的编译器实现有关)。 此举能够使性能平均提高 50%

     

    示例:

     

    publicclassTest{

    publicstaticvoidmain(String[]args){

    //

    }

    }

    如果 String 不是 final 那么就可以继承

     

    publicclassString2extendsString{

    //..

    //...

    }

    那我们的 main 也就可以写成

     

    publicclassTest{

    publicstaticvoidmain(String2[]args){//注意此处

    //

    }

    }

    英文参考:http://forums.sun.com/thread.jspa?threadID=636414

     

    另外补充一点:

    作用就是 final的类不能被继承,不能让别人继承有什么好处?

     

    意义就在于,安全性,如此这般:

    java 自出生那天起就是“为人民服务”,这也就是为什么java做不了病毒,也不一定非得是病毒,反正总之就是为了安全, 人家java的开发者目的就是不想让 java干这类危险的事儿,java并不是操作系统本地语言, 换句话说java必须借助操作系统本身的力量才能做事,JDK中提供的好多核心类比如 String,这类的类的内部好多方法的实现都不是java编程语言本身编写的, 好多方法都是调用的操作系统本地的API,这就是著名的“本地方法调用”,也只有这样才能做事,这种类是非常底层的, 和操作系统交流频繁的,那么如果这种类可以被继承的话,如果我们再把它的方法重写了,往操作系统内部写入一段具有恶意攻击性质的代码什么的, 这不就成了核心病毒了么?

     

    上面所述是最重要的,另外一个方面,上面2位老兄说的也都很对, 就是不希望别人改,这个类就像一个工具一样,类的提供者给我们提供了, 就希望我们直接用就完了,不想让我们随便能改,其实说白了还是安全性, 如果随便能改了,那么java编写的程序肯定就很不稳定,你可以保证自己不乱改, 但是将来一个项目好多人来做,管不了别人,再说有时候万一疏忽了呢?他也不是估计的, 所以这个安全性是很重要的,javaC++相比,优点之一就包括这一点;

     

    原因绝对不只有这么多,因为如果这些个核心的类都能被随便操作的话,那是很恐怖的,会出现好多好多未知的错误,莫名其妙的错误….

     

    String类不可变性的好处

     

    只有当字符串是不可变的,字符串池才有可能实现。字符串池的实现可以在运行时节约很多heap空间,因为不同的字符串变量都指向池中的同一个字符串。但如果字符串是可变的,那么String interning将不能实现(译者注:String interning是指对不同的字符串仅仅只保存一个,即不会保存多个相同的字符串。),因为这样的话,如果变量改变了它的值,那么其它指向这个值的变量的值也会一起改变。

     

    如果字符串是可变的,那么会引起很严重的安全问题。譬如,数据库的用户名、密码都是以字符串的形式传入来获得数据库的连接,或者在socket编程中,主机名和端口都是以字符串的形式传入。因为字符串是不可变的,所以它的值是不可改变的,否则黑客们可以钻到空子,改变字符串指向的对象的值,造成安全漏洞。

     

    因为字符串是不可变的,所以是多线程安全的,同一个字符串实例可以被多个线程共享。这样便不用因为线程安全问题而使用同步。字符串自己便是线程安全的。

     

    类加载器要用到字符串,不可变性提供了安全性,以便正确的类被加载。譬如你想加载java.sql.Connection类,而这个值被改成了myhacked.Connection,那么会对你的数据库造成不可知的破坏。

     

    因为字符串是不可变的,所以在它创建的时候hashcode就被缓存了,不需要重新计算。这就使得字符串很适合作为Map中的键,字符串的处理速度要快过其它的键对象。这就是HashMap中的键往往都使用字符串 

    展开全文
  • TS中继承修饰

    千次阅读 2019-07-10 17:37:18
    1、ts定义 class class Person { public name: string //属性 public关键词省略 constructor(name: string) { //构造函数 实例化触发的方法 this.name = name; } getName(): string { return this.name; } set...

    1、ts定义类 class
    class Person {
    public name: string //属性 public关键词可省略
    constructor(name: string) { //构造函数 实例化触发的方法
    this.name = name;
    }
    getName(): string {
    return this.name;
    }
    setName(name: string): void {
    this.name = name;
    }

    }
    var p = new Person(‘张三’);
    console.log(p.getName());

    p.setName(‘李四’);

    console.log(p.getName());
    p.setName(‘李四’);

    console.log(p.getName());

    //2.ts定义类的继承 extends super

    class Person {
    public name: string;
    constructor(name: string) {
    this.name = name;
    }
    run(): string {
    return this.name + ‘在运动’;
    }
    }
    var p = new Person(‘王五’);
    console.log(p.run());

    class Web extends Person {
    constructor(name: string) {
    super(name); //初始化父类的构造函数
    }
    }
    var w = new Web(‘李四’);
    console.log(w.run());

    Ps:
    1、ts定义类,一般用class 类名{}。

    2、ts类的继承, 需要用到extends super

    3、ts类中的修饰符
    *public: 公有的 在类里面、子类、类外面都可以访问

    • protected 保护类型 在类里面、子类里面可以访问,类外部没法访问
    • private 私有的 在类里面可以访问, 子类、外部都没法访问
      不加修饰符的 默认 public
    展开全文
  • 成员变量:成员变量不可修改,只能在声明是赋值或者是构造器中赋值,系统是不会对final属性默认的赋初始值 方法:不能在子类中被覆盖,即不能修改 :最终,不能被集成 ...
  • string什么不不继承

    千次阅读 2016-09-25 11:02:36
    答案: 可以,因为String有final修饰符,而final修饰能被继承的,实现细节允许改变。 public final class String implements java.io.Serializable, ComparableString>, CharSequence 11 详细...
  • String类不可变以及不可总结

    千次阅读 2017-10-01 20:11:38
    String在java中是immutable(不可变),因为它被关键字final修饰。当String实例创建时就会被初始化,并且以后无法修改实例信息。String是工程师精心设计的艺术品。 一、String为什么不可变? 要了解String...
  • java中被final修饰类不能被继承

    千次阅读 2018-11-05 17:29:23
    final方法 之所以要使用final方法,可能是出于对两方面理由的考虑。第一个是为方法“上锁”,防止任何继承类改变它的本来含义。设计程序时,若希望一个方法的...不变,而且不可被覆盖或改写,就可以采取这种做法。 ...
  • 抽象类不继承接口

    千次阅读 2017-09-21 10:21:43
    1. 抽象可以继承普通,但可以继承接口。 (public abstract class 抽象 extends 普通 { }) 2. 接口可以继承多接口,但可以继承抽象。 (public abstract class 接口1 extends 接口2,接口3 ,接口4{ }...
  • Java中的String什么不可

    千次阅读 2018-07-23 15:00:42
    1、什么是不可变? java角度来讲就是说成final的。 String不可变如下图: 假设给字符串s赋值为abcd,第二次重新赋值为...1、首先Stringfinal修饰的,这说明String不可继承 2、其次String的主力成员...
  • String什么不能被继承

    千次阅读 2020-03-26 17:34:38
    我们都知道String类不能被继承,但为什么不能却能回答地很完整。 首先我们可以看下String的源码(部分): public final class String implements java.io.Serializable, Comparable<String>, CharSequence { ...
  • 类什么情况下可以被继承

    千次阅读 2017-06-14 17:23:11
    1、如果被final修饰,那么此类可以被继承。 2、如果中只有private的构造方法,那么此类可以被继承。  其原因在于:  (1)一个一定会有构造函数,如果写,那就是默认的无参构造函数,如果写,就...
  • 今天我们谈谈为什么抽象能有静态的抽象方法以及static修饰的方法能被重写可以被继承 1 static修饰的方法能被重写可以被继承 我们知道static修饰的方法为静态方法,可以直接使用类名.方法名进行调用...
  •  相信大家在开发中,对于final修饰符都比较常见,它会将修饰的变量固定不可重复赋值。但是我们是否思考过被它所修饰属性变量或存储在哪里呢?下面已我将比较有趣的问答形式,让大家对final有一个全面的认识。在...
  • java 外部只能被public 和 default 修饰(但是这是为什么?) 对于一个外部 定义为 private 很显然是没有意义的,一个定义出来其他的都无法和他沟通,独立存在是没有意义的. 默认是default,即缺省的时候外部...
  • 默认的修饰符(default)可以保证该外部类可被同一包的其它使用。 public可以使该在同一工程的任意位置(本包和其它包)中使用。 若声明为private,该类不能被任何其它调用,则失去了在实际应用中的意义(一...
  • static修饰的方法: 1、父类中的静态方法可以...2、修饰方法表示允许被子重写,但是可以被子类继承修饰构造方法。 3、修饰变量表示允许被修改 a)方法内部的局部变量,使用前被赋值即可(只能赋值一次
  • Java中的String什么用final修饰

    千次阅读 2020-10-22 22:37:50
    相信很多小伙伴在面试的时候都被问到过“Java中的String什么用final修饰?”这个问题,今天带大家一探究竟,希望小伙伴们在之后面试中遇到这个问题时,能够很顺利的回答出来,顺利斩获高薪offer。 二、final...
  • String能否被继承呢? 答案是不能的 ...其含义相当于C/C++的const,意味着不可修改。 final可以用来修饰 、变量 和 方法, final修饰类的时候 ,这个就不能被继承中所有的方法也就被...
  • 有时候我们并希望自己写的继承,怎么做呢? 方法很简单,只需要在定义时加上 sealed 关键字, sealed 关键字声明的也叫密封
  • final修饰什么特点 2018年04月22日 10:59:31点点滴滴的记录阅读数:129 变量定义为final,一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可再变。 方法...
  • C++设计一个能被继承

    千次阅读 2011-06-17 11:05:00
    在C#中定义了关键字sealed,被sealed修饰类不能被继承。在Java中同样也有关键字final表示一个类型能被继承。在C++中没有类似于sealed和final的关键字,所以我们只有自己来实现。  很多人都能够想到,的构造...
  • 面试题28:能被继承

    千次阅读 2017-06-13 22:24:52
    在C#中定义了关键字sealed,被sealed修饰类不能够被继承。在Java中同样也有关键字final表示一个类不能被继承。C++11提供final关键字使得类不能够被继承。那么,如何自己实现一个继承?常规的解法是,把...
  • 继承关系声明和访问修饰

    千次阅读 2007-02-02 14:40:00
    则默认为从object继承明确声明时,需要描述的各种约束可以直接派生的System.ArraySystem.DelegateSystem.EnumSystem.ValueType派生和父类可以有同样级别的访问修饰类的默认声明是内部的,但可以显式声明 ...
  • 抽象可以继承实体吗?

    千次阅读 2018-04-24 03:03:56
    答案是:yes!举例:java中object是一个实体,其他的...我个人对明确构造函数的理解为:供子类调用的构造(子类调用父类构造是继承的前提),主要有以下3点。①父类写了无参构造,或者写(写会默认生成无参...
  • 面向对象的优势在于的复用,继承与多态都是对进行复用,继承级别的复用,多态是方法级别的复用。提到继承就必须提到的组合,继承和组合有何异同?PHP到底有没有多态?这些将在下面进行讲述。 1. ...
  • 答案是能被继承。下面来看看究竟是为什么? Java中对String的定义: public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for ...
  • final修饰类时,被修饰类不能被继承; finale修饰变量时,如果是基本数据类型的变量,则其数值一旦在初始化之后便能更改;如果是引用类型的变量,则在对其初始化之后便能再让其指向另一个对象。 那为什么说...
  • Java中是否可以继承String,为什么

    千次阅读 2019-11-20 14:49:14
    能被继承,因为String有final修饰符,而final修饰能被继承的。 Java对String的定义: public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /...
  • Java继承修饰

    千次阅读 2017-02-25 16:52:52
    Java中不同的修饰修饰、方法、属性变量的继承关系

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 212,042
精华内容 84,816
关键字:

不可继承的类用什么修饰