Java面向对象
面向对象基础
1.class和instance
class即类,instance即实例。
class是一种对象模版,它定义了如何创建实例,因此,class本身就是一种数据类型;
而instance是对象实例,instance是根据class创建的实例,可以创建多个instance,每个instance类型相同,但各自属性可能不相同。
2.实例
package oop;
// 定义一个city类
class City{
// 创建类的字段即属性
public String name;
public double lattitude;
public double longitude;
}
public class oop1 {
public static void main(String[] args) {
// 创建实例frist
City frist = new City();
// 对实例的属性赋值
frist.name = "shanghai";
frist.lattitude = 11;
frist.longitude = 111;
// 访问实例属性并打印
System.out.println(frist.name);
System.out.println(frist.lattitude);
System.out.println(frist.longitude);
}
}
3. 实例讲解
- City类中包含了3个字段(field,有些语言叫做属性),通过class我们实现了数据的封装
- public可以用来修饰方法和字段,表示其可以被外部访问
- 创建实例用new,用Class名作为实例的数据类型
- 访问实例属性时可以用
变量.字段
的形式,但是如果用private修饰了该属性则会报错
方法
1.方法的引入
上一级中,我们直接把属性用public
修饰,把属性暴露给外部可能会破坏封装性。所以我们往往采用private
修饰属性,然后通过方法来读取属性赋值
2.参数绑定
基本类型参数的传递,是调用方值的复制。双方各自的后续修改,互不影响
3.实例
package oop;
public class opp2 {
public static void main(String[] args) {
Person Jhon = new Person();
// 调用实例的方法
Jhon.setBirth(2000);
System.out.println(Jhon.getage());
}
}
class Person{
// 定义私有属性,外部不可调用
private String name;
private int birth;
// this永远指向当前实例,从而达到赋值的目的
public void setBirth(int birth){
this.birth = birth;
}
public int getage(){
// 调用类内部私有的方法
return calcAge(2020);
}
// 私有方法,仅允许类内部调用
private int calcAge(int currentYear){
return currentYear - this.birth;
}
}
4.实例讲解
public int getage()
该语句中,public
用于修饰方法是否供外部调用,int
则是该方法的返回数据类型- 通过
this.field
就可以访问当前实例的字段,如果命名没有冲突实际上可以省略this
this.birth = birth
前一个birth
指向实例的一个属性,后一个birth
则是外部传入的参数,因为命名重复,所以要用this修饰
构造方法
1.构造方法应用
创建对象实例时,我们可以使用构造方法让内部字段初始化,其相当于类内部一个和类同名的特殊的方法。
2.默认构造方法
如果一个类没有定义构造方法,编译器会为我们生成一个默认的构造方法,因而我们可以在new Person()
调用
如果我们自定义了一个构造方法,那么默认的构造方法将不会被创建
3.实例
package oop;
public class opp3 {
public static void main(String[] args) {
// 调用构造方法
Person2 ming = new Person2("小明", 21);
System.out.println(ming.getAge());