IDEA 基础操作
创建一个新的 Java 工程
- 点击左上角File->New->Project,弹出如下界面:
- 语言选择 Java
- 在 JDK 一栏选择自己安装好的 JDK
- 起完名字后点击 Create 就创建好了一个 Java Project
- src就是存放代码的文件夹
创建 Package 和 Class
- 右键单击src文件夹->New->Package,起名并回车
- 右键单击刚刚创建的 Package -> New -> Java CLass,选择 Class 起名并回车( Interface 与 Class 等都在此处创建)
- 声明主方法,打印输出 Hello World,完成测试
IDEA 的 Module
- 在 IDEA 中 Project 是最顶级的级别,次级别是 Module。一个 Project 可以有多个 Module。目前主流的大型项目都是分布式部署的,结构都是类似这种多 Module 结构
- 项目一般是这样划分的,比如:core Module、web Module、plugin Module、solr Module 等等,模块之间彼此可以相互依赖。通过这些 Module 的命名也可以看出,他们之间都是处于同一个项目业务下的模块,彼此之间是有不可分割的业务关系的
- 创建 Module 需要在 Project 下新建,右键单击 Project -> New -> Module ,起名并点击 Create
- 之后,我们可以在 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();
}
}
输出结果:
方法重写与方法重载的区别
相同点:方法名相同
不同点:
重载:参数列表不同,返回值与访问修饰符无关
重写:参数列表相同,返回值相同或其子类,访问修饰符不能比父类更严
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("汪汪");
}
}
运行结果:
- 场景二 使用父类作为方法返回值实现多态,使方法可以返回不同子类对象
示例:
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("叨叨");
}
}
运行结果: