面向对象

java是一门面向对象的语言,因此在正式学习java前,先来了解一下什么是面向对象?

面向对象是指一种程序设计范型,同时也是一种程序开发的方法。对象是类的具体化实现。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性,一切事物皆对象,通过面向对象的方式,将现实世界的事物抽象成对象,现实世界中的关系抽象成类、继承,帮助人们实现对现实世界的抽象与数字建模。

 

面向对象的三大特性:封装、继承、多态

封装是指属性私有化,目的是增强数据安全性,不能让其他用户随意访问和修改数据,简化编程,使用者不必在意具体实现细节,而只是通过外部接口即可访问类的成员

  • 根据需要提供setter和getter方法来访问属性
  • 隐藏具体属性和实现细节,仅对外开放接口
  • 控制程序中属性的访问级别

例如以下代码:

在User类中,定义了三个成员变量,分别为idCard,name,user,它们的访问修饰都是private私有的,通过setter和getter方法对这些变量进行设值以及取值.

public class User {
	private String idCard;
	private String name;
	private User user;
	
	public String getIdCard() {
		return idCard;
	}
	public void setIdCard(String idCard) {
		this.idCard = idCard;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}	

}

继承是指在一个现有类(父类)的基础上在构建一个新类(子类),子类可以访问和使用父类中的非私有成员变量,以及重写父类中的非私有成员方法。但父类中private私有的成员变量以及方法不能访问和调用)。继承的作用就是能提高代码的复用性。

  • java中一个类只能继承一个父类,且只能继承访问权限非private属性和方法
  • 子类可以重写父类中的方法,命名与父类中同名的属性

例如以下代码,在父类中分别定义了一个私有变量height、一个公有变量weight、一个私有方法showHeight()以及一个公有方法showWeight();

在子类中分别调用和重写,私有的变量和方法子类无法访问到,子类只访问到了一个公有变量和方法,且子类重写了父类的公有方法showWeight();

父类:

public class User {
	private String idCard;
	private String name;
	private int height=180;//父类私有变量
	public int weight=90;//父类公有变量
	private User user;
	
	public String getIdCard() {
		return idCard;
	}
	public void setIdCard(String idCard) {
		this.idCard = idCard;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
	//父类私有方法
	private void showHeight() {
		System.out.println("user showheight:"+height);
	}
	//父类公有方法
	public void showWeight() {
		System.out.println("user showheight:"+weight);
	}
	
}

子类:

public class Women extends User{
	@Override
	public void showWeight() {
		System.out.println("user showheight:子类的体重为"+weight);
	}

	public static void main(String[] args) {
		Women women=new Women();
//		women.height=150; //子类对象对父类的私有成员变量使用报错
		women.weight=88;//子类对象对父类的公有成员变量使用正常
//		women.showHeight();	//子类对象调用父类的私有方法使用报错
		women.showWeight(); //子类对象调用父类的私有方法使用正常
	}
}

多态可以分为两种:设计时多态、运行时多态

设计(编译)时多态:即重载(Overload),是指java允许方法名相同而参数不同(返回值可以相同也可以不同),同一个类中允许存在一个或多个以上的同名函数,只要参数类型或参数个数不同即可

运行时多态:即重写(Override)必须是在继承体系中,子类重写父类方法,JVM运行时根据调用该方法的类型决定调用那个方法。

代码如下例所示

public class Women extends User{
	int CurrentWeight;
	
	//重写showWeight方法
	@Override
	public void showWeight() {
		System.out.println("user showheight:子类的体重为"+weight);
	}

    //重载showWeight方法
	public void showWeight(int CurrentWeight) {
		System.out.println("当前体重为"+CurrentWeight);
	}

	public static void main(String[] args) {
		Women women=new Women();
//		women.height=150; //子类对象对父类的私有成员变量使用报错
		women.weight=88;//子类对象对父类的公有成员变量使用正常
//		women.showHeight();	//子类对象调用父类的私有方法使用报错
		women.showWeight(); //子类对象调用父类的私有方法使用正常
		
		women.showWeight(66);//重载的方法
	}

}