Java笔记

Java笔记

面向对象

1 重载

方法重载:具有多个同名方法称为方法的重载。前提是不同方法之间的参数列表互不相同,例如参数个数、参数顺序、参数类型都可以算做不同的参数列表。返回值不同不能作为重载的依据。

注意:构造方法也可以重载。无参构造方法执行时,类内部没有执行初始化的属性将执行默认初始化。

2 封装

封装:将类的属性设置为private,再设置public方法。外部通过调用public方法获取或修改privae属性。

优势:加强权限控制。

劣势:代码繁琐(可通过插件,自动在编译时加上默认get\set方法,省去人工编写的工作量以及类代码更简洁)。

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Animal {
private String className;
private int age;

Animal(String className, int age){
this.className = className;
this.age = age;
}

public void setClassName(String className){
this.className = className;
}

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

public String getClassName(){
return this.className;
}

public int getAge(){
return this.age;
}
}

3 继承

一个类继承另一个类的所有属性及方法称为继承。Java只支持单继承(C++支持多继承),避免了菱形继承。

Animal.java:

1
2
3
4
5
public class Animal {
public void speak(){
System.out.println("This is animal speaking!");
}
}

Cat.java

1
2
public class Cat extends Animal{
}

Main.java

1
2
3
4
5
6
public class Main {
public static void main(String[] args) {
Cat cat = new Cat();
animal.speak();
}
}

输出:

1
This is animal speaking!

解释:虽然Cat类未定义speak()方法,但继承了Animal类,所以也继承了Animal的speak()方法。

3.1 重写

子类重写父类方法称为重写。

建议:重写方法加上@Override注解,编译器将自动检查是否重写方法,避免人为的编码错误。

Cat.java

1
2
3
4
5
6
public class Cat extends Animal{
@Override
public void speak(){
System.out.println("This is cat speaking!");
}
}

输出:

1
This is cat speaking!

解释:由于子类重写了父类方法,调用时将调用子类方法。

3.2 子类方法重载

Cat.java

1
2
3
4
5
6
7
8
9
10
11
public class Cat extends Animal{
@Override
public void speak(){
System.out.println("This is cat speaking!");
}

public void speak(String info){
System.out.println(info);
}
}

Main.java

1
2
3
4
// ……
Cat cat = new Cat();
cat.speak("A cat is speak!");
// ……

output:

1
A cat is speak!

解释:子类方法可以与重写的方法重载,也可以与父类方法重载。

总结:

  • 当子类方法名和参数列表与父类方法一致时,子类方法将重写父类方法。
  • 子类方法名和父类方法名一致,但参数列表不一致时,子类方法将与父类方法触发重载(无论子类是否重写父类方法)。

4 多态

编译多态:方法重载。

运行多态:类指针指向父类或子类实例。

4.1 指向子类实例

new:

1
Animal animal = new Cat();

方法调用:

1
animal.speak();

输出:

1
This is cat speaking!

解释:虽然animal是Animal类,但animal是Cat实例,调用方法时将优先调用子类复写的方法。

调用子类重载的方法:

1
animal.speak("A cat is speak!");

报错:’speak()’ in ‘多态.Animal’ cannot be applied to ‘(java.lang.String)’

解释:虽然animal是cat实例,但是animal对象。调用Cat的重载方法时,在animal中找不到该方法,IDE报错。

总结:对象指向子类实例时,只能调用父类有的方法和属性,优先调用子类重写的方法和属性。

4.2 指向父类实例

new:

1
Cat cat = (Cat)new Animal();

方法调用:

1
cat.speak("A cat is speak!");  //报错:找不到speak的重载方法

运行报错:Animal cannot be cast to Cat

解释:虽然加上(Cat)强转类型在编码阶段不报错,但在运行时候提示无法强制类型转换。(原因不明)

5 接口

  • 接口不能拥有private属性、private抽象方法
  • 接口的属性必须在声明时实例化
  • 接口抽象方法不能拥有body(不能在接口实现抽象方法)
  • 接口可省略public关键字,即接口的属性和方法只能是public类型
  • 接口如要像实例化类一样实例化接口,须得在实例化时带上'body(即实例化同时实现接口))
  • 接口可以像类一样使用多态

集合

IO

多线程


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!