[Java]中[this][super]用法总结

this

  • this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针。

this的用法在java中大体可以分为3种:

1.普通的直接引用

这种就不用讲了,this相当于是指向当前对象本身。

2.形参与成员名字重名,用this来区分:
class 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));}
}       

运行结果:

初始化年龄:10
Harry’s age is 12

可以看到,这里age是GetAge成员方法的形参,this.age是Person类的成员变量。

3.引用构造函数

这个和super放在一起讲,见下面。

super

  • super可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类。

super也有三种用法:

1.普通的直接引用

与this类似,super相当于是指向当前对象的父类,这样就可以用super.xxx来引用父类的成员。

2.子类中的成员变量或方法与父类中的成员变量或方法同名
class Country {String name;void value() {name = "China";}
}class City extends Country {String name;void value() {name = "Shanghai";super.value();      //调用父类的方法System.out.println(name);System.out.println(super.name);}public static void main(String[] args) {City c=new City();c.value();}
}

运行结果:

Shanghai
China

可以看到,这里既调用了父类的方法,也调用了父类的变量。若不调用父类方法value(),只调用父类变量name的话,则父类name值为默认值null。

3.引用构造函数

super(参数):调用父类中的某一个构造函数(应该为构造函数中的第一条语句)。
this(参数):调用本类中另一种形式的构造函数(应该为构造函数中的第一条语句)。

class Person { public static void prt(String s) { System.out.println(s); } Person() { prt("父类·无参数构造方法: "+"A Person."); }//构造方法(1) Person(String name) { prt("父类·含一个参数的构造方法: "+"A person's name is " + name); }//构造方法(2) 
} public class Chinese extends Person { Chinese() { super(); // 调用父类构造方法(1) prt("子类·调用父类”无参数构造方法“: "+"A chinese coder."); } Chinese(String name) { super(name);// 调用父类具有相同形参的构造方法(2) prt("子类·调用父类”含一个参数的构造方法“: "+"his name is " + name); } Chinese(String name, int age) { this(name);// 调用具有相同形参的构造方法(3) prt("子类:调用子类具有相同形参的构造方法:his age is " + age); } public static void main(String[] args) { Chinese cn = new Chinese(); cn = new Chinese("codersai"); cn = new Chinese("codersai", 18); } 
}

运行结果:

父类·无参数构造方法: A Person.
子类·调用父类”无参数构造方法“: A chinese coder.
父类·含一个参数的构造方法: A person’s name is codersai
子类·调用父类”含一个参数的构造方法“: his name is codersai
父类·含一个参数的构造方法: A person’s name is codersai
子类·调用父类”含一个参数的构造方法“: his name is codersai
子类:调用子类具有相同形参的构造方法:his age is 18

从本例可以看到,可以用super和this分别调用父类的构造方法和本类中其他形式的构造方法。

例子中Chinese类第三种构造方法调用的是本类中第二种构造方法,而第二种构造方法是调用父类的,因此也要先调用父类的构造方法,再调用本类中第二种,最后是重写第三种构造方法。

super和this的异同:

  • super(参数):调用基类中的某一个构造函数(应该为构造函数中的第一条语句)
  • this(参数):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句)
  • super: 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时如:super.变量名 super.成员函数据名(实参)
  • this:它代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名)
    调用super()必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。
  • super()和this()类似,区别是,super()从子类中调用父类的构造方法,this()在同一类内调用其它方法。
  • super()和this()均需放在构造方法内第一行。
    尽管可以用this调用一个构造器,但却不能调用两个。
  • this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。
  • this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。
  • 从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/426061.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java泛型参数约束_Java泛型方法如何约束方法类型参数?

我一直在阅读有关泛型方法的文章,以为我理解了泛型类型参数如何约束方法参数类型,但是当我用实际代码测试了一些想法时,我得到了意外的结果.这是我不理解的简单通用方法:private static void foo(T[] t1, T[] t2){t2[0] t1[0];}...String[] stringArray new Strin…

Leetcode 950. Reveal Cards In Increasing Order

题目 链接:https://leetcode.com/problems/reveal-cards-in-increasing-order/ Level: Medium Discription: In a deck of cards, every card has a unique integer. You can order the deck in any order you want. Initially, all the cards start face down (un…

java学习(139):多个catch块

import java.sql.Connection;import java.io.IOException; import java.sql.SQLException;//java异常处理 //异常 public class test82 {//定义方法声明定义异常,在满足条件时抛出异常对象,程序转向异常处理public double count(double n, double m, Con…

[Leedcode][JAVA][第289题][生命游戏]

【问题描述】 根据 百度百科 ,生命游戏,简称为生命,是英国数学家约翰何顿康威在 1970 年发明的细胞自动机。给定一个包含 m n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态:1 即为活细…

MySQL报错113_mysql 2003 (113)

1. 问题描述远程访问192.168.2.200主机的mysql数据库时, 出现以下错误:[plain] view plain copy # mysql -host192.168.2.200 -uroot -p Enter password: ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘192.168.2.200‘ (113)2. 解决方法首先确保mysql开启了远程…

MySQL修改表名示例

首先,我们新建一个名为test_table的表: drop table if exists test_table; create table test_table select TABLE_SCHEMA,TABLE_NAME from information_schema.tables where TABLE_SCHEMAinformation_schema; 然后,我们执行如下语句&#xf…

java学习(140):1.7后新特性

import java.sql.Connection;import java.io.IOException; import java.sql.SQLException;//java异常处理 //异常 public class test82 {//定义方法声明定义异常,在满足条件时抛出异常对象,程序转向异常处理public double count(double n, double m, Con…

[剑指offer]面试题第[67]题[Leetcode][JAVA][第8题] 字符串转换整数 (atoi)[字符串]

【问题描述】 请你来实现一个 atoi 函数,使其能将字符串转换成整数。首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。接下来的转化规则如下:如果第一个非空字符为正或者负号时,则将…

java 面板 选择颜色_[代码全屏查看]-java颜色选择器

[1].[代码] [Java]代码package com.liuxing.test;import java.awt.Color;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JColorChooser;import javax.swing.JFrame;import javax.swing.JLabel;impor…

java学习(141):自定义捕捉异常

//自定义异常类 public class ArrayElement extends Exception{public static final int MAX_NUM1000;private static final String MESSAGE"集合存储元素过多";public ArrayElement(){}public String getMessage(){return MESSAGE"最大元素限制为"MAX_NU…

[Leedcode][JAVA][第42题][动态规划][双指针][栈]

【问题描述】 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。![image.png](https://upload-images.jianshu.io/upload_images/17025746-87f6db1a993ce416.png?imageMogr2/auto-orient/strip%7CimageVie…

java环境变量设置优化_Mac/windows配置jdk环境变量-seo优化只选拉一八科技

Mac/windows配置jdk环境变量Mac配置jdk环境变量直接双击dmg文件,然后单击[下一步]完成安装。请忽略[配置jdk环境变量]直接跳转到[检查jdk是否安装成功]。Windows配置jdk环境变量窗户系统配置1.右键单击桌面上的“计算机”,然后单击“属性”2.单击“高级系…

java学习(142):file类的基本创建

//file类的基本创建 import java.io.File;public class test85 {public static void main(String[] args){//创建文件对象String filePath"e:\\1.txt";File filenew File( filePath );System.out.println( filenull );//无论给定的文件虚拟路径是否存在//创建file在j…

speech模块实现语音识别

1.pip安装speech、pywin32 pip install speech pip install pywin322.例子 #!/usr/bin/python # coding:utf-8 from __future__ import unicode_literals import speech import os import sys import webbrowser__author__ "klx" # Create your views here. phrase …

java phantomjs alert_Python+Selenium+PhantomJS脚本中的Javascript警报

我尝试用Python脚本在DSL调制解调器中“单击”Javascript警报以确认重新启动,如下所示:#!/usr/bin/env pythonimport seleniumimport timefrom selenium import webdrivercap {uacceptSslCerts: True,uapplicationCacheEnabled: True,ubrowserConnectio…

[Leedcode][JAVA][第460题][LFU]

【问题描述】 设计并实现最不经常使用(LFU)缓存的数据结构。它应该支持以下操作:get 和 put。get(key) - 如果键存在于缓存中,则获取键的值(总是正数),否则返回 -1。 put(key, value) - 如果键…

java学习(143):file方法类实现

import java.io.File; import java.io.IOException; import java.net.URI; import java.util.List;//文件管理类 public class FileManager {public static File createFileAction(URI uri){//使用URI做出参数创建对象if(uri!null)return new File( uri );return null;}//dir文…

性能测试十九:jmeter参数优化+排错

一:参数优化 1,控制台取样间隔的设置,在jmeter/bin/jmeter.properties文件中修改 summariser.interval10,默认为30s,最低可修改为6s 2,Jvm参数优化 bin目录下,vi jmeter,修改HEAP的…

pythonxml模块高级用法_Python利用ElementTree模块处理XML的方法详解

前言最近因为工作的需要,在使用 Python 来发送 SOAP 请求以测试 Web Service 的性能,由于 SOAP 是基于 XML 的,故免不了需要使用 python 来处理 XML 数据。在对比了几种方案后,最后选定使用 xml.etree.ElementTree模块来实现。这篇…

java学习(144):file常用方法1

import java.io.File; import java.io.IOException; import java.net.URI; import java.util.List;//文件管理类 public class FileManager {public static File createFileAction(URI uri){//使用URI做出参数创建对象if(uri!null)return new File( uri );return null;}//dir文…