Surpass Day——IntelliJ IDEA和eclipse的使用、super关键字

39 阅读7分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情


关于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;
    }
}

\