JAVA学习(一)

993 阅读5分钟

IDEA 基础操作

创建一个新的 Java 工程

  1. 点击左上角File->New->Project,弹出如下界面:image.png
  2. 语言选择 Java
  3. 在 JDK 一栏选择自己安装好的 JDK
  4. 起完名字后点击 Create 就创建好了一个 Java Project
  5. src就是存放代码的文件夹image.png

创建 Package 和 Class

  1. 右键单击src文件夹->New->Package,起名并回车image.png
  2. 右键单击刚刚创建的 Package -> New -> Java CLass,选择 Class 起名并回车( Interface 与 Class 等都在此处创建)image.png
  3. 声明主方法,打印输出 Hello World,完成测试image.png

IDEA 的 Module

  • 在 IDEA 中 Project 是最顶级的级别,次级别是 Module。一个 Project 可以有多个 Module。目前主流的大型项目都是分布式部署的,结构都是类似这种多 Module 结构
  • 项目一般是这样划分的,比如:core Module、web Module、plugin Module、solr Module 等等,模块之间彼此可以相互依赖。通过这些 Module 的命名也可以看出,他们之间都是处于同一个项目业务下的模块,彼此之间是有不可分割的业务关系的
  • 创建 Module 需要在 Project 下新建,右键单击 Project -> New -> Module ,起名并点击 Createimage.png
  • 之后,我们可以在 Module 的 src 里写代码,此时 Project 工程下的 src 就没什么用了,可以删掉

Java 的三大特性

封装

概念

尽可能隐藏对象的内部实现细节,控制对象的修改及访问的权限尽可能隐藏对象的内部实现细节,控制对象的修改及访问的权限

访问修饰符

private

公共访问方法

  • 提供方法来实现属性的读取与赋值

  • 命名规范:

    setXXX()//赋值

    getXXX()//读取

示例

如下方所示,Student类中共有 age 和 mark 两个属性,每个属性都用 private 修饰,并提供了 set 和 get 方法
class Student {
    private int age;
    private int mark;

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    public void setMark(int mark) {
        this.mark = mark;
    }

    public int getMark() {
        return mark;
    }
}

应用

过滤非法数据: 在set方法內部,我们可以添加判断,从而过滤掉非法数据,避免非法数据录入,保证数据安全。

继承

继承

概念

  • 程序中的继承,是类与类之间特征和行为的一种赠与或获得。
  • 两个类必须要满足"is a"的关系才有继承关系

语法

    class 子类 extends 父类{
        //代码
    }

如何选择父类

  • 现实生活中,很多类别之间都存在着继承关系,都满足“is a”的关系
  • 狗 is a 动物、狗 is a 生物、狗 is a 物质
  • 多个类别都可作为“狗”的父类,需要从中选择出最适合的父类
  • 功能越精细,重合点越多,越接近直接父类
  • 功能越粗略,重合点越少,越接近Object类

注意

  • Java为单继承,一个类只能有一个直接父类,但可以多级继承,属性和方法逐级叠加
  • 构造方法:类中的构造方法,只负责创建本类对象,不可继承。
  • private修饰的属性和方法:访问修饰符的一种,仅本类可见。
  • 父子类不在同一个package中时,default修饰的属性和方法:访问修饰符的一种,仅同包可见。

重写(覆盖)

原则

  • 方法名称、参数列表与父类相同
  • 返回值类型必须与父类相同或其子类
  • 访问修饰符可与父类相同或是比父类更宽泛

特性

  • 子类重写父类方法时子类方法会覆盖父类方法
  • 子类重写父类方法,访问级别不能严于父类方法
  • 子类重写方法名和类型与父类一样
  • 父类的构造方法无法重写,只能被覆盖

示例

    class Animal{
        public void sleep(){
            System.out.println("睡");
        }
        public void eat(){
            System.out.println("吃");
        }
    }
    class Dog extends Animal{
        public void sleep(){
            System.out.println("呼呼");
        }
        public void eat(){
            System.out.println("啊呜");
        }
    }
    public class Test { 
        public static void main(String[] args) { 
            Dog d = new Dog();
            d.sleep(); 
            d.eat(); 
        } 
    }

输出结果:

image.png

方法重写与方法重载的区别

相同点:方法名相同

不同点:
重载:参数列表不同,返回值与访问修饰符无关
重写:参数列表相同,返回值相同或其子类,访问修饰符不能比父类更严

super关键字

用法

  • super():表示调用父类无参构造方法。如果没有显示书写,隐式存在于子类构造方法的首行
  • super(实参):表示调用父类有参构造方法

this和super

this或super使用在构造方法中时,都要求在首行。
当子类构造中使用了this()或this(实参),即不可再同时书写super()或super(实参),会由this()指向构造方法完成super()调用

多态

概念

  • 父类引用指向子类对象,从而产生多种形态
  • 二者具有直接或间接的继承关系时,父类引用可指向子类对象,即形成多态
  • 父类引用仅可调用父类所声明的属性和方法,不可调用子类独有的属性和方法

应用

  • 场景一:使用父类作为方法形参实现多态,使方法参数的类型更为宽泛

示例:

public class Test {
    public static void main(String[] args) {

        Animal d = new Dog();
        d.sleep();
        d.eat();
        //由于animal类中无bark方法,所以要强转
        ((Dog)d).bark();
    }
}
class Animal{
    public void sleep(){
        System.out.println("睡");
    }
    public void eat(){
        System.out.println("吃");
    }
}
class Dog extends Animal{
    public void sleep(){
        System.out.println("呼呼");
    }
    public void eat(){
        System.out.println("啊呜");
    }
    //子类特有的方法
    public void bark(){
        System.out.println("汪汪");
    }
}

运行结果:

image.png

  • 场景二 使用父类作为方法返回值实现多态,使方法可以返回不同子类对象

示例:

public class Main {
    public static void main(String[] args) {
        Animal d = new Dog();
        Animal b = new Bird();
        //喂鸟
        feed(b);
        //喂狗
        feed(d);
    }
    public static void feed(Animal a){
        a.eat();
    }
}
class Animal{
    public void eat(){
        System.out.println("吃");
    }
}
class Dog extends Animal{
    public void eat(){
        System.out.println("啊呜");
    }
}
class Bird extends Animal{
    public void eat(){
        System.out.println("叨叨");
    }
}

运行结果:

image.png