Java中super的几种用法并与this的区别

合集下载

super()的参数

super()的参数

super()的参数
在Python中,super()函数是用来调用父类的方法。

它的参数
有两种形式,super()和super(type, obj)。

1. super(),当不传入任何参数时,super()函数会自动获取当
前类和实例,并在方法解析顺序(MRO)中继续搜索。

这种用法通常
在单继承的情况下使用。

2. super(type, obj),当传入两个参数时,super()函数会返
回type类型的父类在obj实例所属的类中的方法解析顺序(MRO)
中的下一个类。

这种用法通常在多继承的情况下使用,以确保调用
父类方法时的准确性。

需要注意的是,super()函数通常与__init__()方法一起使用,
以便在子类中调用父类的构造函数,确保父类的属性被正确初始化。

此外,还要注意在Python 3中,super()函数可以不传入任何参数,因为它会自动获取当前类和实例。

而在Python 2中,必须显式地传
入当前类和实例作为参数。

总的来说,super()函数的参数是用来确定在多继承情况下,要
调用哪个父类的方法,以及确保方法解析顺序(MRO)的正确性。


样可以避免出现混乱或错误的情况,保证程序的正确性和可维护性。

?extendsT和?superT的使用

?extendsT和?superT的使用

extendsT和?superT的使⽤阿⾥规范中有⼀个12.【强制】泛型通配符<? extends T>来接收返回的数据,此写法的泛型集合不能使⽤ add ⽅法,⽽<? super T>不能使⽤ get ⽅法,两者在接⼝调⽤赋值的场景中容易出错。

具体的分析可以看下如下:最终PECS (Producer Extends Consumer Super ) 原则频繁往外读取内容的,适合⽤上界Extends。

经常往⾥插⼊的,适合⽤下界Super。

<? extends T> 和 <? super T> 是Java泛型中的“通配符(Wildcards)” 和 “边界(Bounds)”的概念<? extends T> 是指 “上界通配符(Upper Bounds Wildcards)”<? super T> 是指 “下界通配符(Lower Bounds Wildcards)”1. 为什么要⽤通配符和边界?使⽤泛型的过程中,经常出现⼀种很别扭的情况。

⽐如,我们有Fruit类,和它的派⽣类Apple类。

class Fruit {}class Apple extends Fruit {}然后有⼀个最简单的容器:Plate类。

盘⼦⾥可以放⼀个泛型的“东西”。

我们可以对这个东西做最简单的“放”和“取”的动作:set()和get()⽅法。

public class Plate<T> {private T item;public Plate(T t) {this.item = t;}public T get() {return item;}public void set(T item) {this.item = item;}}现在我定义⼀个“⽔果盘⼦”,逻辑上⽔果盘⼦当然可以装苹果。

Plate<Fruit> p=new Plate<Apple>(new Apple());但实际上Java编译器不允许这个操作。

java中this的用法

java中this的用法

java中this的用法This,英语单词,发音:[英][ðɪs][美][ðɪs]。

常翻译为:这,这么。

java中this的用法有哪些呢?本文是店铺整理java中this的用法的资料,仅供参考。

java中this的用法11. this指当前对象。

当在一个类中要明确指出使用对象变量或函数时加上this引用。

如下面例子中:public class Hello {String s = "Hello";public Hello(String s){System.out.println("s = " + s);System.out.println("1 -> this.s = " + this.s);this.s = s;System.out.println("2 -> this.s = " + this.s);}public static void main(String[] args) {Hello x=new Hello("HelloWorld!");}}运行结果:s = HelloWorld!1 -> this.s = Hello2 -> this.s = HelloWorld!在这个例子中,构造函数Hello中,参数s与类Hello的变量s同名,这时直接对s进行操作则是对参数s进行操作。

对类Hello的成员变量s进行操作就应该用this进行引用。

运行结果的第一行就是直接对构造函数中传递过来的参数s进行打印结果;第二行是对成员变量s的打印;第三行是先对成员变量s赋传过来的参数s值后再打印,所以结果是HelloWorld!2. this作为参数传递当你要把自己作为参数传递给别的对象时如:public class A {public A() {new B(this).print();}public void print() {System.out.println("Hello from A!");}}public class B {A a;public B(A a) {this.a = a;}public void print() {a.print();System.out.println("Hello from B!");}}运行结果:Hello from A!Hello from B!在这个例子中,对象A的构造函数中,newB(this)把对象A作为参数传递给了对象B的构造函数。

Java中的两个关键字——super、this

Java中的两个关键字——super、this

Java中的两个关键字——super、thisJava中的两个关键字——super、this ⼀、supersuper 是java中⽅的⼀个关键字,⽤它可以引⽤⽗类中的成员:super可⽤于访问⽗类中定义的属性super可⽤于调⽤⽗类中定义的成员⽅法super可⽤于在⼦类构造器中调⽤⽗类的构造器使⽤super关键字注意事项:1、当⼦类和⽗类都有同名的属性时,在⼦类中如果要使⽤⽗类的属性 super . 属性2、 super只能应⽤在成员⽅法和构造⽅法中,不能⽤在静态⽅法中(和this是⼀样的)3、如果在构造⽅法中使⽤必须放在第⼀⾏4、在构造⽅法中this()和super()不能同时出现super没有什么需要解释的地⽅,我们⽤代码来看看super具体的⼀些强⼤功能吧⽰例⼀、使⽤super调⽤基类的属性:public class Father { int num=20;}public class Child extends Father{ int num; public void print(){ num=10; super.num=30; System.out.println("num="+num); System.out.println("="+super.num); }}public class Test { public static void main(String[] args) { Child xm=new Child(); xm.print(); }}运⾏结果:⽰例⼆、使⽤super调⽤基类中的构造⽅法:public class Father { int num; public Father() { System.out.println("⽗类中的⽆参构造⽅法---"); } public Father(int num){ System.out.println("⽗类中的有参的构造⽅法----"+num); }}public class Child extends Father{ int num; public Child() { super(30); System.out.println("⼦类⽆参构造⽅法---"); } public Child(int num) { this.num = num; System.out.println("⼦类中的有参的构造⽅法---"+num); }}解释⼀下上⾯的这段代码:在Child类中的第⼀个构造函数⾥⾯,super(30);它会去调⽤⽗类中嗲有⼀个int型参数的构造⽅法。

this的用法归纳总结

this的用法归纳总结

this的用法归纳总结一、this关键字的基本概念与用法在许多编程语言中都有一个关键字叫做this,它代表当前对象或者当前执行上下文。

在JavaScript中,this是一个非常重要的概念,在不同的情况下具有不同的含义和作用。

本文将对this的用法进行归纳总结,帮助读者更好地理解和使用this关键字。

1.1 this的含义和作用简单来说,this关键字用于指向当前正在执行代码的对象。

它可以在方法内部引用对象自身,并提供了一种灵活的方式来访问对象属性和调用方法。

通过使用this,我们可以避免使用硬编码来引用对象,从而使得代码更加通用和可重复使用。

1.2 this的指向问题在JavaScript中,this的指向是动态确定的,取决于函数被调用时所处的上下文。

以下列举几种常见情况:1.2.1 方法调用时:当一个函数作为某个对象的方法调用时,this指向该对象。

1.2.2 函数调用时:当一个独立函数被直接调用时(不作为对象的方法),this指向全局对象(浏览器环境下是window)。

1.2.3 构造函数创建实例时:当通过new关键字调用构造函数创建一个新的实例时,this指向新创建的对象。

1.2.4 apply和call方法调用时:当使用apply或call方法来调用函数时,通过传递上下文参数,可以手动控制this的指向。

1.3 this的常见使用场景1.3.1 在对象内部访问属性和方法:通过使用this关键字,可以直接在对象内部访问自身的属性和方法。

例如:```javascriptconst person = {name: 'Alice',sayHello() {console.log(`Hello, ${}!`);}};person.sayHello(); // 输出 "Hello, Alice!"```1.3.2 DOM事件处理函数中:当给DOM元素添加事件处理函数时,该函数中的this指向触发事件的DOM元素。

java中的this和super的作用和异同和C++中调用父类的构造函数

java中的this和super的作用和异同和C++中调用父类的构造函数

java中的this和super的作⽤和异同和C++中调⽤⽗类的构造函数这⼏天看到类在继承时会⽤到this和super,这⾥就做了⼀点总结,与各位共同交流,有错误请各位指正~thisthis是⾃⾝的⼀个对象,代表对象本⾝,可以理解为:指向对象本⾝的⼀个指针。

this的⽤法在java中⼤体可以分为3种:1.普通的直接引⽤这种就不⽤讲了,this相当于是指向当前对象本⾝。

2.形参与成员名字重名,⽤this来区分:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17class Person {private int age = 10;public Person(){System.out.println("初始化年龄:"+age);}public int GetAge(int age){this.age = age;return this.age;}}public class test1 {public static void main(String[] args) {Person Harry = new Person();System.out.println("Harry's age is "+Harry.GetAge(12)); }}运⾏结果:初始化年龄:10Harry's age is 12可以看到,这⾥age是GetAge成员⽅法的形参,this.age是Person类的成员变量。

3.引⽤构造函数这个和super放在⼀起讲,见下⾯。

supersuper可以理解为是指向⾃⼰超(⽗)类对象的⼀个指针,⽽这个超类指的是离⾃⼰最近的⼀个⽗类。

super也有三种⽤法:1.普通的直接引⽤与this类似,super相当于是指向当前对象的⽗类,这样就可以⽤super.xxx来引⽤⽗类的成员。

2.⼦类中的成员变量或⽅法与⽗类中的成员变量或⽅法同名12 3 4 5 6 7 8 9 10 11 12 13class Country {String name;void value() {name = "China";}}class City extends Country {String name;void value() {name = "Shanghai";super.value(); //调⽤⽗类的⽅法 System.out.println(name);13 14 15 16 17 18 19 20 21 System.out.println(name);System.out.println();}public static void main(String[] args) { City c=new City();c.value();}}运⾏结果:ShanghaiChina可以看到,这⾥既调⽤了⽗类的⽅法,也调⽤了⽗类的变量。

在java中super的用途

在java中super的用途

在java中super的用途
在Java中,super是一个关键词,代表了父类对象的引用。

super可以在子类中使用,以调用父类的方法、构造函数和属性。

主要用途包括以下几个方面:
1. 调用父类的构造函数
在子类的构造函数中,可以使用super调用父类的构造函数。

这种情况通常发生在子
类需要在父类的基础上进行一些特定的初始化操作,或者需要传入一些父类的参数。

调用
父类的构造函数可以使用super(),并且必须是子类中的第一条语句。

3. 引用父类的属性
子类可以使用super来引用父类的属性。

这种情况通常发生在子类需要使用父类中的
某个属性作为基础,在此基础上进行一些特定的操作。

使用super的格式为super.属性名。

4. 提高程序的可维护性
使用super可以提高程序的可维护性,使得代码更加清晰简洁。

父类中的方法和属性
通常具有通用性和重复性,子类可以直接复用这些方法和属性,避免了重复的代码,并且
可以更加方便地进行程序的扩展。

5. 帮助实现多态
Java是一种面向对象的语言,多态是面向对象最重要的特征之一。

使用super可以帮助实现多态性。

当子类对象调用方法时,JVM首先在子类中查找方法,如果没有找到,就
会到父类中查找方法。

如果父类中也没有找到,那么会一直向上查找,直到找到Object类为止,这种机制就是多态性的体现。

java 泛型面试题

java 泛型面试题

java 泛型面试题1. 什么是Java的泛型?Java的泛型是一种在编译时期提供类型安全的机制,用于允许我们在定义类、接口或方法时使用参数化类型,以达到在使用时指定具体类型的目的。

2. 泛型的主要作用是什么?泛型主要有以下几个作用:- 类型安全:通过使用泛型,可以在编译时期捕获类型错误,减少在运行时期出现类型转换异常的可能性。

- 代码复用和可读性:通过定义泛型方法或泛型类,可以将逻辑和数据结构与具体的类型解耦,实现更好的代码复用和可读性。

- 性能优化:通过使用泛型可以减少类型转换操作,提高程序的执行效率。

3. 请解释Java中的类型擦除是什么意思。

Java中的类型擦除是指在编译时期,将泛型类型的相关信息擦除为其边界类型或者是Object类型。

这是由于Java的泛型机制是通过类型擦除来实现的,即在编译期间通过擦除泛型类型信息,使得编译生成的字节码中只包含普通的类、方法和字段。

4. 泛型通配符"?"和"extends"、"super"的区别是什么?- "?"是非受限通配符,可以匹配任何类型,例如List<?>表示一个未知元素类型的List。

- "extends"用于上界限定,表示泛型参数必须是指定类型的子类或者实现类。

- "super"用于下界限定,表示泛型参数必须是指定类型的父类或者接口。

5. 什么时候应该使用通配符的上界限定?什么时候应该使用通配符的下界限定?- 使用上界限定通配符可以实现对参数的协变性,即可以传入泛型参数类型的子类实例。

- 使用下界限定通配符可以实现对参数的逆变性,即可以传入泛型参数类型的父类实例。

6. 请解释什么是类型通配符捕获和通配符作用域。

类型通配符捕获是指在某些情况下,通过编译器的推断,将通配符的具体类型捕获并转换为确定的类型。

通配符作用域指的是通配符的有效范围,即它只在当前的代码块中有效。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

4.super和this的异同:1)super(参数):调用基类中的某一个构造函数(应该为构造函数中的第一条语句)2)this(参数):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句)3)super:它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时如:super.变量名super.成员函数据名(实参)4)this:它代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名)5)调用super()必须写在子类构造方法的第一行,否则编译不通过。

每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。

6)super()和this()类似,区别是,super()从子类中调用父类的构造方法,this()在同一类内调用其它方法。

7)super()和this()均需放在构造方法内第一行。

8)尽管可以用this调用一个构造器,但却不能调用两个。

9)this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。

10)this()和super()都指的是对象,所以,均不可以在static环境中使用。

包括:static 变量,static方法,static语句块。

11)从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。

1.静态方法通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法声明为static的方法有以下几条限制:1)它们仅能调用其他的static 方法。

2)它们只能访问static数据。

3)它们不能以任何方式引用this 或super。

class Simple {static void Go() {System.out.println("Welcome");}}public class Cal {public static void main(String[] args) {Simple.go();}}调用一个静态方法就是“类名.方法名”,静态方法的使用很简单如上所示。

一般来说,静态方法常常为应用程序中的其它类提供一些实用工具所用,在Java的类库中大量的静态方法正是出于此目的而定义的。

2. 静态变量声明为static的变量实质上就是全局变量。

当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例变量共用同一个static变量。

静态变量与静态方法类似。

所有此类实例共享此静态变量,也就是说在类装载时,只分配一块存储空间,所有此类的对象都可以操控此块存储空间,当然对于final则另当别论了class Value {static int c = 0;static void inc() {c++;}}public class Count2 {public static void prt(String s) {System.out.print(s);}public static void main(String[] args) {Value v1, v2;v1 = new Value();v2 = new Value();prt("v1.c=" + v1.c + " v2.c=" + v2.c);v1.inc();prt(" v1.c=" + v1.c + " v2.c=" + v2.c);}}输出的结果如下:v1.c=0 v2.c=0 v1.c=1 v2.c=1由此可以证明它们共享一块存储区。

static变量有点类似于C中的全局变量的概念。

值得探讨的是静态变量的初始化问题。

如果你需要通过计算来初始化你的static变量,你可以声明一个static块,Static 块仅在该类被加载时执行一次。

下面的例子显示的类有一个static方法,一些static变量,以及一个static 初始化块:class Value3 {static int c = 0;Value3() {c = 15;}Value3(int i) {c = i;}static void inc() {c++;}}public class Count {public static void prt(String s) {System.out.println(s);}Value3 v = new Value3(10);static Value3 v1, v2;static {//此即为static块prt("v1.c=" + v1.c + " v2.c=" + v2.c);v1 = new Value3(27);prt("v1.c=" + v1.c + " v2.c=" + v2.c);v2 = new Value3(15);prt("v1.c=" + v1.c + " v2.c=" + v2.c);}public static void main(String[] args) {Count ct = new Count();prt("ct.c=" + ct.v.c);prt("v1.c=" + v1.c + " v2.c=" + v2.c);v1.inc();prt("v1.c=" + v1.c + " v2.c=" + v2.c);prt("ct.c=" + ct.v.c);}}结果为:v1.c=0 v2.c=0v1.c=27 v2.c=27v1.c=15 v2.c=15ct.c=10v1.c=10 v2.c=10v1.c=11 v2.c=11ct.c=11这个程序展示了静态初始化的各种特性。

如果你初次接触Java,结果可能令你吃惊。

可能会对static后加大括号感到困惑。

首先要告诉你的是,static定义的变量会优先于任何其它非static变量,不论其出现的顺序如何。

正如在程序中所表现的,虽然v出现在v1和v2的前面,但是结果却是v1和v2的初始化在v的前面。

在static{后面跟着一段代码,这是用来进行显式的静态变量初始化,这段代码只会初始化一次,且在类被第一次装载时。

如果你能读懂并理解这段代码,会帮助你对static关键字的认识。

在涉及到继承的时候,会先初始化父类的static变量,然后是子类的,依次类推。

3.静态类通常一个普通类不允许声明为静态的,只有一个内部类才可以。

这时这个声明为静态的内部类可以直接作为一个普通类来使用,而不需实例一个外部类。

public class StaticCls {public static void main(String[] args) {OuterCls.InnerCls oi = new OuterCls.InnerCls();}}class OuterCls {public static class InnerCls {InnerCls() {System.out.println("InnerCls");}}}结果为:InnerCls4.static和final一块用表示什么static final用来修饰成员变量和成员方法,可简单理解为“全局常量”!对于变量,表示一旦给值就不可修改,并且通过类名可以访问。

对于方法,表示不可覆盖,并且可以通过类名直接访问。

5.补充:static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。

被static修饰的成员变量和成员方法独立于该类的任何对象。

也就是说,它不依赖类特定的实例,被类的所有实例共享。

只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。

因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。

用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象时,不生成static变量的副本,而是类的所有实例共享同一个static变量。

static 变量前可以有private修饰,表示这个变量可以在类的静态代码块中,或者类的其他静态成员方法中使用(当然也可以在非静态成员方法中使用--废话),但是不能在其他类中通过类名来直接引用,这一点很重要。

实际上你需要搞明白,private是访问权限限定,static 表示不要实例化就可以使用,这样就容易理解多了。

static前面加上其它访问权限关键字的效果也以此类推。

static修饰的成员变量和成员方法习惯上称为静态变量和静态方法,可以直接通过类名来访问,访问语法为:类名.静态方法名(参数列表...)类名.静态变量名用static修饰的代码块表示静态代码块,当Java虚拟机(JVM)加载类时,就会执行该代码块(用处非常大,呵呵)。

static变量按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量。

两者的区别是:对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。

对于实例变量,没创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。

static方法静态方法可以直接通过类名调用,任何的实例也都可以调用,因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。

因为实例成员与特定的对象关联!因为static方法独立于任何实例,因此static方法必须被实现。

相关文档
最新文档