关于 super 关键字和 this 关键字
1、super 和 this 的共同特征
1)都能出现在实例方法和构造方法中
2)"super." "super()" "this." "this()"
3)不能使用在静态方法中
4)大多数情况下可以省略
5)只能出现在构造方法的第一行
2、super 和 this 不同的特征
2.1 关于 this 关键字
1)在区分局部变量和实例变量的时候不能省略;
public void setName(String name){
this.name = name;
}
复制代码
点击并拖拽以移动
2)this()通过当前的构造方法去调用 "本类" 中的其他构造方法,目的是:代码复用;
2.2 关于 super 关键字
1)super(实参列表)通过当前的构造方法去调用 "父类" 中的构造方法,目的是:创建子类对象的时候,先初始化父类型特征,实现代码复用;
public class Super {
public static void main(String[] args) {
new B();
}
}
class A{
public A() {
System.out.println("A类的构造方法!");
}
}
class B extends A{
public B(){
super();//子类构造方法的第一行无论写不写都会默认存在super(),但不与this()共存;
System.out.println("B类中的构造方法");
}
}
复制代码
点击并拖拽以移动
2)重要结论: 当一个构造方法的第一行: 既没有 this()又没有 super()【this()和 super()不能共存】的话,默认会有一个 super(); 表示通过当前子类的构造方法调用父类的无参数构造方法,所以必须保证父类的无参构造方法是存在的;
public class Super {
public static void main(String[] args) {
new B();
}
}
class A{
public A() {
System.out.println("A类的构造方法!");
}
}
class B extends A{
public B(){
this("zhangsan");//此处调用下面有参的构造方法,同时也会触发super()调用父类的构造方法
System.out.println("B类中的构造方法");
}
public B(String name){
super();//无论如何,构造方法中都会存在一个super()
System.out.println("B类中的有参数构造方法String");
}
}
复制代码
点击并拖拽以移动
点击并拖拽以移动
编辑
3)理解:super 的作用:模拟现实世界要想有儿子,必须把父亲造出来;它代表的是当前对象(this)的父类型特征;
4)无论怎么折腾,父类的构造方法都会先执行;
不管创建什么对象,老祖宗的 object 类的无参构造方法一定会执行(object 类中的构造方法是处于"栈顶部",最后调用最先结束)
5)super 不是引用,不保存内存地址,也不指向任何对象,只是代表当前对象内部那一刻父类型的特征;
6)"super."后面不仅可以访问属性,还可以访问方法;
7)练习
public class Super {
public static void main(String[] args) {
new C();
}
}
/*class Object{
public Object(){
}
}*/
class A /*extends Object*/{//Object这个是Sun公司写的
public A() {
//有super()
System.out.println("1");
}
}
class B extends A{
public B(){
//有super()
System.out.println("2");
}
public B(String name){
//有super()
System.out.println("3");
}
}
class C extends B{
public C(){
this("zhangsan");
System.out.println("4");
}
public C(String name){
this(name,20);
System.out.println("5");
}
public C(String name,int age){
super(name);
System.out.println("6");
}
}
复制代码
点击并拖拽以移动
输出结果
点击并拖拽以移动
编辑
3、何时使用,何时省略 super 关键字?
1)何时使用 super(实参列表) 当子类中构造方法访问父类 private 修饰的实例变量时,此时无法访问,必须通过 super(实参列表)调用父类的构造方法才可访问父类 private 修饰的实例变量;
2)初始化当前对象父类型的特征,并没有创新新的对象,实际上对象只创建一个;
3) "super."何时不能省略? 父中有,子中又有,如果想在在子中访问"父的特征"时不可以省略
public class Super {
public static void main(String[] args) {
Vip v = new Vip("zhangsan");
v.shopping();
}
}
class Customer{
String name;//相当于super.name
public Customer(){
}
public Customer(String name){
super();
this.name = name;
}
}
class Vip extends Customer{
String name;//相当于this.name 允许同名变量出现,此时的name为空,但super和this访问的name不同
public Vip(){
}
public Vip(String name){
super(name);
}
public void shopping() {
System.out.println(this.name + "正在购物!");//null
System.out.println(super.name + "正在购物!");//zhangsan
System.out.println(name + "正在购物!");//null
}
}
复制代码
点击并拖拽以移动
点击并拖拽以移动
编辑
1、关于 IDEA 工具的快捷键以及一些简单的设置
1)字体设置 File ---> setting ---> 输入 font --->设置字体样式以及字号大小;
2)快速生成 main 方法: psvm
3)快速生成 Sys.out.println(): sout
4)注意 IDEA 是自动保存,不需要 Ctrl + S
5)删除一行: Ctrl + Y
6)运行: 代码上右键--->run 点击代码左侧的绿色箭头 Ctrl + Shift + F10
7)左侧窗口的列表的展开和关闭: 左箭头关闭; 右箭头打开; 上下箭头移动;
8)退出任何窗口 Esc 键
9)任何新增/新建/添加的快捷键: Alt + Insert
10)窗口变大、变小: Ctrl + Shift + F12
11)切换 Java 程序 Alt + 左右箭头
12)切换窗口 Alt + 标号(打开、关闭)
13)提示方法的参数: Ctrl + P
14)复制光标当前行代码到下一行: Ctrl + D
15)定位方法/属性/变量 光标停到某个单词下面,按 Ctrl 键,出现下划线,点击
2、关于 eclipse 工具的快捷键以及一些简单设置
2.1. 文件相关的快捷键
1)新建一个工程、文件、文件夹等内容 Ctrl + N
2)在对话框中进行的快捷操作 Alt + 带下划线字母
3)窗口最大化/还原 Ctrl + M
4)打开被选中的工程、包、文件等的属性窗口 Alt + Enter
5)运行程序 Ctrl + F11
6)调试模式运行程序 F11
7)重命名工程名、文件名、方法名、变量名 右键 —> Refactor —> Rename Alt + Shift + R F2
8)重命名工程名、文件名 F2
9)打开编辑窗口查看目录 Ctrl + E
10)切换到当前编辑窗口的上一个窗口 Ctrl + Page Up
11)切换到当前编辑窗口的下一个窗口 Ctrl + Page Down
2.2 编写代码时常用的快捷键
1)向上(下)复制光标所在行内容或选中内容 Ctrl + Alt + 向上(下)键
2)向上(下)移动光标所在行内容或选中内容 Alt + 向上(下)键
3)删除当前行/光标所在行 Ctrl + D
3)在光标所在行下添加一个空格 Shift + Enter
4)错误给出解决方案 Ctrl + 1
5)自动提示 Alt + ?
3、Java 程序基础练习题
3.1 题目一:Vehicle Driving
要求:
请定义一个交通工具(Vehicle)的类,其中有属性:
1)速度(speed),
2)体积(size),
3)方法移动(move()),
4)设置速度(setspeed(int speed,) ),
5)加速 speedUp (),
6)减速 speedDown();
最后在测试类 Vehicle 中的 main()中实例化一个交通工具对象并通过方法给它初始化 speed,size 的值并且打印出来,用加速减速的方法对速度进行改变;
public class HelloWorld {
public static void main(String[] args) {
//无参数构造方法创造对象
Vehicle v = new Vehicle();
//有参数构造方法创造对象
Vehicle v1 = new Vehicle(100.0,5.0);
//通过set方法赋值
v.setSpeed(100.0);
System.out.println("oldSpeed : " + v.getSpeed());
v.setSize(5.0);
//调用加速方法
v.speedUp(10.0);
System.out.println("addSpeed : " + v.getSpeed());
//调用减速方法
v.speedDown(5.0);
System.out.println("downSpeed : " + v.getSpeed());
}
}
class Vehicle {
private double speed;
private double size;
//无参构造方法
public Vehicle() {
}
//有参构造方法
public Vehicle(double speed, double size) {
this.speed = speed;
this.size = size;
}
public double getSpeed() {
return speed;
}
//设置速度的方法
public void setSpeed(double speed) {
this.speed = speed;
}
public double getSize() {
return size;
}
public void setSize(double size) {
this.size = size;
}
//交通工具的移动方法
public void move() {
System.out.println("公共汽车起步行驶");
}
//加速方法
public void speedUp(double addSpeed) {
//在原来基础上加
//int oldSpeed = this.getSpeed()
this.setSpeed(this.getSpeed() + addSpeed);
}
//减速方法
public void speedDown(double delSpeed) {
//在原来基础上减
//int oldSpeed = this.getSpeed()
this.setSpeed(this.getSpeed() - delSpeed);
}
}
复制代码
点击并拖拽以移动
3.2 题目二:Calculator
要求:
1)定义名为 Number 的类其中有两个整型数据成员 n1 和 n2 应声明为私有。
2)编写构造方法赋值 n1 和 n2 初始值;
3)为该类定义加 addition()、减 subration()、乘 multiplication()、除 division()公有实例方法;
4)分别对两个成员变量执行加、减、乘、除的运算;
public class JiSuanQi {
public static void main(String[] args) {
Number n1 = new Number();
Number n2 = new Number(5,41);
Number n3 = new Number(82,6);
Number n4 = new Number(24,6);
n1.addition();
n2.subration();
n3.multiplication();
n4.division();
}
}
class Number {
private int n1;
private int n2;
public Number(int n1, int n2) {
this.n1 = n1;
this.n2 = n2;
}
public Number() {
this(10,20);
}
public void setN1(int n1) {
this.n1 = n1;
}
public void setN2(int n2) {
this.n2 = n2;
}
public int getN1() {
return n1;
}
public int getN2() {
return n2;
}
public void addition(){
System.out.println(n1 + "+" + n2 + "=" + (n1+n2));
System.out.println(this.getN1() + "+" + this.getN2() + "=" + (this.getN1() + this.getN2()));
}
public void subration(){
System.out.println(n1 + "-" + n2 + "=" + (n1-n2));
System.out.println(this.n1 + "-" + this.getN2() + "=" + (this.getN1() - this.getN2()));
}
public void multiplication(){
System.out.println(n1 + "*" + n2 + "=" + (n1*n2));
System.out.println(n1 + "*" + n2 + "=" + (getN1() * getN2()));
}
public void division(){
System.out.println(n1 + "/" + n2 + "=" + (n1/n2));
}
}
复制代码
点击并拖拽以移动
3.3 题目三:People Message
要求:
1)定义一个人类 People 该类中应该有两个私有属性姓名 name 和年龄 age;
2)定义构造方法用来初始化数据成员;
3)定义显示 display 方法将姓名和年龄打印出来;
4)在 main 方法中创建人类对象的实例然后将信息显示;
public class People {
public static void main(String[] args) {
Peason p = new Peason("Sam",18);
p.display();
Peason p2 = new Peason();
p2.setName("张三");
p2.display();
}
}
class Peason{
private String name;
private int age;
public void display(){
System.out.println("name:" + this.getName() + "," + "age:" + this.age);
}
public Peason() {
}
public Peason(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
复制代码
点击并拖拽以移动
3.4 题目四:Add Time
要求:
1)定义为 MyTime 的类其中应有三个整形成员时 hour 分 minute 秒 second;
2)为了保证数据的安全性这三个成员变量应声明为私有;
3)为 MyTime 类定义构造方法以方便创建对象时初始化成员变量;
4)再定义 display 方法用于将时间信息打印出来;
5)为 MyTime 类添加一下方法:
addSecond(int sec)
addMinute(int min)
addHour(int hou)
subSecond(int sec)
subMinute(int min)
subHour(int hou)
public class Time {
public static void main(String[] args) {
MyTime t1 = new MyTime(13,20,15);
t1.display();
t1.addSecond(121);
t1.display();
}
}
class MyTime{
private int hour;
private int minute;
private int second;
public void addSecond(int sec){
int oldSec = this.getSecond();
int newSec = oldSec +sec;
if(newSec < 60){
this.setSecond(newSec);
}else if(newSec == 60){
this.addMinute(1);
this.setSecond(0);
}else{
this.addMinute(newSec / 60);
this.setSecond(newSec % 60);
}
}
public void addMinute(int min) {
this.setMinute(this.getMinute() + min);
}//由于下列方法类似,不再赘述解决数学问题
//还可以采用秒处理的方法对此类题进行处理
public void addHour(int hou){
}
public void subSecond(int sec){
}
public void subMinute(int min){
}
public void subHour(int hou){
}
public void display(){
System.out.println(this.getHour() + "时" + this.getMinute() + "分" + this.getSecond() + "秒");
}
public void setHour(int hour) {
this.hour = hour;
}
public void setMinute(int minute) {
this.minute = minute;
}
public void setSecond(int second) {
this.second = second;
}
public int getHour() {
return hour;
}
public int getMinute() {
return minute;
}
public int getSecond() {
return second;
}
public MyTime() {
}
public MyTime(int hour, int minute, int second) {
this.hour = hour;
this.minute = minute;
this.second = second;
}
}
复制代码
点击并拖拽以移动
\
评论