Java中的两个特殊变量this和super
- 格式:doc
- 大小:41.50 KB
- 文档页数:8
JAVA面向对象一:填空1、_____ 是JVM自带的一个线程(自动运行着的程序),用于回收没有任何引用所指向的对象。
2、_____空间用于存储使用new关键字所创建的对象;_____空间用于存储程序运行时在方法中声明的所有的局部变量;_____用于存放类的信息(包括方法),方法有_____份。
3、面向对象三大特征:_____,_____,_____.4、下面是一个类的定义,请将其补充完整。
class _____ {String name;int age;Student( _____ s, int i) {name=s;age=i;}}5、Java 语言的接口是特殊的类,其中包含______常量和_______方法。
6.如果子类中的某个方法的名字、__________和参数列表与它的父类中的某个方法完全一样,则称子类中的这个方法覆盖了父类的同名方法。
7. Java 仅支持类间的单重继承,接口可以弥补这个缺陷,支持_____重继承.8. 接口中所有方法均为________和________的。
9. Java语言中,表示一个类不能再被继承的关键字是________。
10.Java语言中,表示一个类A继承自父类B,并实现接口C的语句是_________________。
11、以下代码的输出结果是________________。
int i=9;char c=’a’;char d=(char)(c+i);System.out.println(d);12.继承主要强调子类在父类的基础上取”长”补”短”,而______主要强调的是类与类之间的传输13、我们在java程序中,把关键字________加到方法名称的前面,来实现子类调用父类的方法14.java语言中,调用方法时,参数传递是_____调用,而不是地址调用15.接口是一种只含有抽象方法或______的一种特殊抽象类16.abstract方法_______(不能或能)与final并列修饰同一个类17.创建一个类就是创建一个新的数据类型,而类在java中属于_____数据类型。
Java里的this到底是什么意思
this代表当前对象的意思。
这个this肯定是用在某个类的方法里吧。
呵呵,我们继续往下说。
举个例子:
public class persion{
private String name=null;
private int age;
public void setName(String name){
=name;
}
public String getName(){
return name;
}
}
在这个类中setName方法中第一个变量用this是为了和本方法的参数this做区别,表示这个name指的是Person这个类的name属性,而不是name参数,如果去掉这个this,执行完这个方法后,Person类的name属性仍然为null
getName方法返回的Person类的name,之所以不用this是因为没有必要,因为编译器会知道这个name就指的是Person的name 而不是其他的name(因为找个方法没有name变量和它混淆)。
当然,这个方法你也可以显示的使用return ,没错。
这些都是最基本的了。
开始学只要记住这个就可以了。
慢慢的其
他的用法也就无师自通了!。
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、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和Super的区别
⼀:this
java中this关键字的作⽤和词义很接近:
它在⽅法内部使⽤,即这个⽅法所属对象的引⽤
它在构造器内部使⽤,表⽰该构造器正在初始化的对象。
this表⽰当前对象,可以调⽤类的属性、⽅法和构造器。
注意
使⽤this()必须放在构造器的⾸⾏!
使⽤this()调⽤本类中其他的构造器,保证⾄少有⼀个构造器不是⽤this的。
⼆:super
java类中使⽤super来调⽤⽗类中的指定操作:
super可⽤于访问⽗类中定义的属性
super可⽤于调⽤⽗类中定义的成员⽅法
super可⽤于在⼦类构造⽅法中调⽤⽗类的构造器
注意
尤其当⼦⽗类出现同名成员是,可以⽤super进⾏区分。
super的追溯不仅限于直接⽗类。
super和this的⽤法相像,this代表本类对象的引⽤,super代表⽗类的内存空间的标识。
三:this和super区别
No.区别点this super
1访问属性访问本类中的属性,如果本类没有此属性则从⽗类中继续查找访问⽗类中的属性
2调⽤⽅法访问本类中的⽅法直接访问⽗类中的⽅法
3调⽤构造器调⽤本类构造器,必须放在构造器⾸⾏调⽤⽗类构造器,必须放在⼦类构造器的⾸⾏4特殊表⽰当前对象⽆。
一、super()的概念在Java编程中,super()是一个关键字,用来调用父类的构造方法。
在子类中使用super()可以调用父类的构造方法,从而实现子类继承父类的属性和方法。
super()必须作为子类构造方法的第一条语句,如果不显式调用super(),则默认调用父类的无参构造方法。
二、super()的用法1. 调用父类的构造方法当子类实例化时,会先调用父类的构造方法,可以使用super()在子类构造方法中调用父类的构造方法。
例如:```javapublic class Parent {public Parent(){System.out.println("Parent类的构造方法");}}public class Child extends Parent {public Child(){super(); //调用父类的构造方法System.out.println("Child类的构造方法");}}在上述例子中,当实例化Child类时,会先调用Parent类的构造方法,然后再调用Child类的构造方法。
2. 访问父类的属性和方法在子类中使用super关键字可以访问父类的属性和方法。
例如:```javapublic class Parent {public String name = "parent";public void sayHello(){System.out.println("Hello, I'm "+ name);}}public class Child extends Parent {public String name = "child";public void sayHello(){super.sayHello(); //调用父类的sayHello方法System.out.println("My name is "+ name);}}在上述例子中,子类可以通过super关键字访问父类的属性和方法,实现对父类的继承和扩展。
1.1什么叫对象?什么叫方法?什么叫面向对象的程序设计?面向过程的程序设计语言最重要的特点是按照解决问题的一个一个步骤来设计程序。
这种语言是与解决相对比较简单的问题,当程序规模较大时,将显得纷繁复杂。
“对象”原来是描述自然界时使用的一个词语。
比如,现在我正在写讲义,桌上的稿纸、手中的笔、案头的参考书、身后的电脑以及窗外的鸟都可以成为对象面向对象,就是将世界看成由许多彼此之间能联络的对象组成。
不少程序设计语言借用了对象这个词语作为一个专用名词,此时,对象也是具有状态和行为两个特征。
在程序设计中,对象的状态时相对处于静态的,用变量来描述和表达;而对象的行为时动态的,他们通过“方法”来实现和完成,所以方法一定是实现对象行为的语句块。
从功能上讲,方法和子程序、函数很相似。
变量和方法是彼此有关、相互依赖的。
当然,计算机都是用数据来表示对象的状态的,也是通过对数据的操作和修改来体现某个方法的功能的。
1.2 Java作为面向对象的程序设计语言有什么特点?Java是面向对象的程序设计语言,从面向对象这个角度看,体现了如下三个特点:a:封装性—面向对象的程序设计语言都是把数据和处理数据的操作结合在一起而构成一个整体,这就是对象。
对象的使用者只能看到对象的外部特性,比如,其主要功能、如何调用等,而看不到内部如何实现这些功能。
作为面向对象的程序设计语言,程序中的数据就是变量,程序对数据作处理则成为方法。
变量和方法都被封装在对象中。
所以,一个对象就是变量和方法的集合,其中变量表明这个对象的状态,方法实现这个对象所具有的行为,而且在程序中将这些变量和方法进行封装,使它们成为一个模块,再用一个名字来代表这个模块。
这样,以后得更高层的程序设计中,就不必关心某个对象的行为到底是怎样实现的。
可见,将对象封装就是为了使模块尽可能少地展现其内部细节,而只是以一种界面来面向外部。
对象的封装性减少了程序各部分之间的依赖,使程序的复杂性降低,而可靠性提高,并便于修改。
第3章面向对象程序设计基础【1】什么是Java程序使用的类?什么是类库?[解答]:Java程序的基本单位是类。
对象是对事物的抽象,而类是对对象的抽象和归纳,找出事物的共性,把具有共同性质的事物归结为一类,得出一个抽象的概念——类。
类是具有相同属性和方法的一组对象的集合,类是在对象之上的抽象,对象则是类的具体化,一旦建立类之后,就可用它来建立许多你需要的对象。
Java的类库是系统提供的已实现的标准类的集合,是Java编程的API(Application Program Interface),它可以帮助开发者方便、快捷地开发Java程序。
【2】如何定义方法?在面向对象程序设计中方法有什么作用?[解答]:方法的定义由两部分组成:方法声明和方法体。
方法声明的基本格式如下:返回类型方法名(形式参数){… //方法体内容}方法声明包括方法名、返回类型和形式参数,方法的小括号是方法的标志;方法体为实现方法行为的Java语句。
在面向对象程序设计中,方法所起的作用是完成对类和对象属性操作。
【3】简述构造方法的功能和特点。
下面的程序片段是某学生为student类编写的构造方法,请指出其中的错误。
void Student(int no,String name){studentNo=no;studentName=name;return no;}[解答]:构造方法是一个特殊的方法,主要用于初始化新创建的对象。
构造方法的方法名要求与类名相同,用户不能直接调用,只能通过new运算符调用,而且构造方法是不返回任何数据类型,甚至也不返回void数据类型,即不能在构造方法前加void。
以上的代码段出错于:①构造方法Student()前不能加void ②不能用return语句【4】定义一个表示学生的student类,包括的域有学号、姓名、性别、年龄,包括的方法有获得学号、姓名、性别、年龄及修改年龄。
编写Java程序创建student类的对象及测试其方法的功能。
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是一个关键词,代表了父类对象的引用。
super可以在子类中使用,以调用父类的方法、构造函数和属性。
主要用途包括以下几个方面:
1. 调用父类的构造函数
在子类的构造函数中,可以使用super调用父类的构造函数。
这种情况通常发生在子
类需要在父类的基础上进行一些特定的初始化操作,或者需要传入一些父类的参数。
调用
父类的构造函数可以使用super(),并且必须是子类中的第一条语句。
3. 引用父类的属性
子类可以使用super来引用父类的属性。
这种情况通常发生在子类需要使用父类中的
某个属性作为基础,在此基础上进行一些特定的操作。
使用super的格式为super.属性名。
4. 提高程序的可维护性
使用super可以提高程序的可维护性,使得代码更加清晰简洁。
父类中的方法和属性
通常具有通用性和重复性,子类可以直接复用这些方法和属性,避免了重复的代码,并且
可以更加方便地进行程序的扩展。
5. 帮助实现多态
Java是一种面向对象的语言,多态是面向对象最重要的特征之一。
使用super可以帮助实现多态性。
当子类对象调用方法时,JVM首先在子类中查找方法,如果没有找到,就
会到父类中查找方法。
如果父类中也没有找到,那么会一直向上查找,直到找到Object类为止,这种机制就是多态性的体现。
Java中的两个特殊变量this和super在Java中有两个非常特殊的变量:this和super,这两个变量在使用前都是不需要声明的。
this变量使用在一个成员函数的内部,指向当前对象,当前对象指的是调用当前正在执行方法的那个对象。
super变量是直接指向超类的构造函数,用来引用超类中的变量和方法。
因此它们都是非常有用的变量,下面我想介绍一下this和super的使用方法。
1、this让我们先看一段代码吧:class PersonInformation{String name,gender,nationality,address;int age;void PersonInformation(String p_name,String p_gender,String p_nationality,String p_address,int p_age){name=p_name;gender=p_gender;nationality=p_nationality;address=p_address;age=p_age;}}你会发现,在PersonInformation()函数中这个对象的方法提示可以直接访问对象的成员变量的,而且在同一个范围中,定义两个相同的名字的局部变量是不允许的,如果确实想使类的成员变量和方法的参数或方法自己定义的局部变量同名的话就需要想一种方法使成员变量与更它同名的方法参数或局部变量区分开来,这就要使用到this变量。
下面我想改写一下上面的代码,使PersonInformation类的构造函数的每个参数都有与对象成员变量相同的名字,而成员变量的初值由参数给出。
class PersonInformation{String name,gender,nationality,address;int age;void PersonInformation(String name,String gender,String nationality,String address,int age){=name;this.gender=gender;this.nationality=nationality;this.address=address;this.age=age;}}由上一例中,我们可以看出,该构造函数中必须使用this,this在方法体重用来指向引用当前正在执行方法的那个对象实例,this变量的类型总是为包含前执行方法的类,上例中,我们要区别参数name和成员变量name,写成name=name显然是不允许的,在参数或局部变量名与类成员变量同名的时候,由于参数或局部变量的优先级高,这样在方法体中参数名或局部变量名将隐藏同名的成员变量,因此,为了值名成员变量,你必须使用this显示地指明当前对象。
有时候会遇到这种情况,我们全面的访问当前对象,而不是访问某一个个别的实例对象,我们也可以使用this,并利用Java中的toString()方法(它能够返回一个描述这个对象的字符串)如果把任何一个对象传递到System.out.println方法中,这个方法调用这个对象的toString方法,并打印出结果字符串,所以,我们可以用如下方法System.out.println(this),来打印出任何对方法固有参数的当前状态。
this还有一个用法,就是构造函数的第一个语句,它的形式是this(参数表),这个构造函数就会调用同一个类的另一个相对的构造函数。
请看下面的例子:class UserInfo{public UserInfo(String name){this(name,aNewSerialNumber);}public Userinfo(String name,int number){userName=name;userNumber=number;}}如果你调用UserInfor newinfotable = new UserInfo("Wayne Zheng")后,就会自动调用UserInfo(String name,int number)构造函数。
可见,熟练掌握this在Java程序设计过程中是非常重要的2、super在Java中,有时还会遇到子类中的成员变量或方法与超类(有时也称父类)中的成员变量或方法同名,因为子类中的成员变量或方法名优先级高,所以子类中的同名成员变量和方法就隐藏了超类的成员变量或方法,但是我们如果想要使用超类中的这个成员变量或方法,此使就需要用到super,请看下面的类。
class Country{String name;void value(){name="China";}}下面的子类中,自类的成员变量和方法隐藏了超类的成员变量name和方法value(),class City extends CountryString name;void value(){name="Hefei";super.value();System.out.println(name);System.out.println();}为了在子类中引用超类中的成员变量name和方法value(),在代码中我们使用了super,和super.value();所以显示的结果为HefeiChina如果我们想要使用超类的构造函数则应当使用super(参数列表)的形式。
一、static请先看下面这段程序:public class Hello{public static void main(String[] args){ //(1)System.out.println("Hello,world!"); //(2)}}看过这段程序,对于大多数学过Java 的从来说,都不陌生。
即使没有学过Java,而学过其它的高级语言,例如C,那你也应该能看懂这段代码的意思。
它只是简单的输出“Hello,world”,一点别的用处都没有,然而,它却展示了static关键字的主要用法。
在1处,我们定义了一个静态的方法名为main,这就意味着告诉Java编译器,我这个方法不需要创建一个此类的对象即可使用。
你还得你是怎么运行这个程序吗?一般,我们都是在命令行下,打入如下的命令(加下划线为手动输入):javac Hello.javajava HelloHello,world!这就是你运行的过程,第一行用来编译Hello.java这个文件,执行完后,如果你查看当前,会发现多了一个Hello.class文件,那就是第一行产生的Java二进制字节码。
第二行就是执行一个Java程序的最普遍做法。
执行结果如你所料。
在2中,你可能会想,为什么要这样才能输出。
好,我们来分解一下这条语句。
(如果没有安装Java文档,请到Sun的官方网站浏览J2SE API)首先,System是位于ng包中的一个核心类,如果你查看它的定义,你会发现有这样一行:public static final PrintStream out;接着在进一步,点击PrintStream这个超链接,在METHOD页面,你会看到大量定义的方法,查找println,会有这样一行:public void println(String x)。
好了,现在你应该明白为什么我们要那样调用了,out是System的一个静态变量,所以可以直接使用,而out所属的类有一个println方法。
静态方法通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法。
如下所示:class Simple{static void go(){System.out.println("Go...");}}public class Cal{public static void main(String[] args){Simple.go();}}调用一个静态方法就是“类名。
方法名”,静态方法的使用很简单如上所示。
一般来说,静态方法常常为应用程序中的其它类提供一些实用工具所用,在Java的类库中大量的静态方法正是出于此目的而定义的。
静态变量静态变量与静态方法类似。
所有此类实例共享此静态变量,也就是说在类装载时,只分配一块存储空间,所有此类的对象都可以操控此块存储空间,当然对于final则另当别论了。
看下面这段代码:static int c=0;static void inc(){c++;}}class Count{public static void prt(String s){System.out.println(s);}public static void main(String[] args){V alue v1,v2;v1=new V alue();v2=new V alue();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=0v1.c=1 v2.c=1由此可以证明它们共享一块存储区。
static变量有点类似于C中的全局变量的概念。
值得探讨的是静态变量的初始化问题。
我们修改上面的程序:class V alue{static int c=0;V alue(){c=15;}V alue(int i){c=i;}static void inc(){c++;}}class Count{public static void prt(String s){System.out.println(s);}V alue v=new V alue(10);static V alue v1,v2;prt("v1.c="+v1.c+" v2.c="+v2.c);v1=new V alue(27);prt("v1.c="+v1.c+" v2.c="+v2.c);v2=new V alue(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这个程序展示了静态初始化的各种特性。