Java是一门纯粹的面向对象编程语言,即使是Hello World也要写在一个类中。从打孔纸带编程,到现在的电子计算机,这个发展过程是倾向于让编程更加简单的,面向对象编程就是历史的选择。
那么对象是什么?
- 对象是数据和行为的集合。
- 一切new出来的都是对象。注意装箱类型也是对象
Integer a = 1;。
public class Cat{
String name; // 数据
public static void main(String[] args){
}
public Cat(String name){
this.name = name;
}
public void meow(){ // 行为
//...
}
}
对象是由什么组成的?
- 对象都分配到堆上。
- 每个对象都包含自己的数据(成员变量)。
- 原生类型的成员
- 引用类型的成员
对象的构造函数
- 新建对象的唯一方法:
- 在堆上分配内存空间
- 执行必要的初始化操作(如给成员赋初值)。
- 首先static的变量和代码块先于main函数初始化。
- 其次是执行main函数,成员变量的初始化
- 然后是花括号中初始化块的初始化
- 最后执行构造器
初始化块中可以调用方法,这是合法的,但是这时的实体是不完整的,因此是危险的。
- 执行构造器函数
- 如果没有任何构造器,编译器会替我们生成。
public class Cat{
int age;
String name;
public Cat(int age,String name){
this.age = age;
this.name = name;
}
}
new Cat(1, "张三");
方法的重载(overload)
- 重载(overload)/重写(override)
- 如何区分同名的不同重载方法?
- 根据参数表
- 隐式转换的情况下类型最匹配的的优先。
上面四个f方法都存在的话,匹配第一个方法,否则匹配第二个。出现这种情况是因为Java的继承体系,int可以自动装箱成Integer,Integer继承自Number,Number继承自Object,优先匹配最接近的类型。void f(int i){} void f(Integer i){} void f(Number i){} void f(Object i){} f(1);
如果传的值是null,且被匹配的方法中参数类型是“兄弟关系”,那么需要强制类型转换来选择指定的方法。
- 能根据返回值重载吗?
不能。Java中可以忽略返回值,那么Java就无法根据返回值类选择合适的方法。在本质上看的是方法签名,方法的重载、调用、签名的匹配是在编译器发生的。 - 如何为方法提供默认值呢? 答案是不行,但是可以曲线救国。
meow();
public void meow(){
meow("喵喵");
}
public void meow(String voice){
Syetem.out.println("voice");
}
此外构造函数也可以重载:
public class Cat{
private String name;
private int age;
public Cat(){
this("张三的猫");
}
public Cat(String name){
this(name, 2);
}
public Cat(String name. int age){
this.name = name;
this.age = age;
}
}