一.面向对象的简介
所谓的面向对象不过是程序员的一种偷懒的方法,以前对于一件事情,需要程序员自己去亲自操作去执行,如果一旦有了面向对象的思想,程序员便从一个执行者变成了一个指挥者,这就是面向对象的思想。
二.面向对象的特征
1.封装
所谓的封装就是一种信息隐藏的技术,就是把属性进行私有化,简单点来说就是把对象的行为和属性看做是一个密不可分的整体,或者就是指把不需要把外界知道的信息进行隐藏。
2.继承
继承就是子类继承父类的过程。举个简单的例子就是有一个Animal类和一个Dog类,显而易见,Animal是一个父类,Dog类该父类的子类,父类处于上层,子类在父类的下层可以扩展出来一些特有的属性或者方法。一般在类中,一个子类只允许继承一个父类,即单继承。Java通过接口来弥补其不能实现多继承而带来的子类不能共享多个父类的缺点。
3.多态
所谓的多态就是“一种定义,多次实现”,多态允许程序中出现重名的现象,当父类的某个方法被子类重写后,将不同的子类对象赋值给父类对象的引用,可以产生不同的功能。
Java语言中含有方法重载与对象多态两种形式的多态。
方法重载:在一个类中允许多个方法使用同一个名字,但方法的参数不同,完成的功能也不同
子类对象可以和父类对象实现交互功能,根据使用的子类不同,完成的功能也不同。
4.抽象
抽象就是把现实中的事物抽象出共同的、本质的属性的过程。
抽象过程就是比较的过程,通过比较找出事物之间的共同属性,通过比较区分本质。
三、类和对象
简单来说,类和对象的关系就像我们现实生活中的生产模板和生产产品的关系,类就好比是设计一辆汽车的模板,对象就是每一台设计出来的车辆,类是对象的总称,对象是类的实例化。
对象和实例的区别:在Java内存分配中,足以看出对象和实例的区别,对象是通过new关键字保存在堆内存中的,实例是保存在栈内存中,实例只是对象的一个引用,就是对象的指针,只能通过实例操作对象,并不能直接操作对象。
3.1定义类--举例
class Person{
String name;//成员属性
int age;
public void say() {//成员方法
System.out.println("我的名字叫:"+name+",今年已经"+age+"岁啦!");
}
}
成员变量是类的属性,反映对象的状态;成员方法是类的行为,反映的是对属性的操作
3.2创建和使用对象
创建好一个类之后,如果想使用这个类,就应该创建该类的对象
class Person{
String name;//成员属性
int age;
public void say() {//成员方法
System.out.println("我的名字叫:"+name+",今年已经"+age+"岁啦!");
}
}
public class DemoClass01 {
public static void main(String[] args){
Person p2 = null;//声明一个对象
p2 = new Person();//实例化
Person p1 = new Person();//直接在声明的同时实例化
}
}
3.3使用对象
一般在创建完一个对象之后,我们肯定是要去使用,关于调用一个对象里面的属性和方法可以使用 对象名称.属性值以及对象名称.方法名(),对象在使用前一定要实例化,不然会出现空指针异常。
class Person{
String name;//成员属性
int age;
public void say() {//成员方法
System.out.println("我的名字叫:"+name+",今年已经"+age+"岁啦!");
}
}
public class DemoClass01 {
public static void main(String[] args){
Person p1 = new Person();
p1.age =20;
p1.name="小华";
p1.say();
}
}
eg-信息的隐藏
class Person{
String name;//成员属性
int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void say() {//成员方法
System.out.println("我的名字叫:"+name+",今年已经"+age+"岁啦!");
}
}
public class DemoClass01 {
public static void main(String[] args){
Person p1 = new Person();
p1.setAge(20);
p1.setName("xiaopang");
p1.say();
}
}
一般使用private之后,再访问属性之后就会出现错误,此时应该使用set()和get()方法。另外,在Java的每一个类中都有一种特殊的成员方法,它的方法名和类名是一致的,一般构造方法的的作用是用来对成员变量进行初始化的。
class Person{
String name;//成员属性
int age;
Person() {
}
Person (String name){
this.name=name;
}
Person(String name, int age) {
this.name = name;
this.age = age;
}
/*public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
*/
public void say() {//成员方法
System.out.println("我的名字叫:"+name+",今年已经"+age+"岁啦!");
}
}
public class DemoClass01 {
public static void main(String[] args){
Person p1 = new Person();
// p1.setAge(20);
// p1.setName("xiaopang");
// p1.say();
// Person p2 = new Person("胖胖");
// p2.setAge(22);
// p2.say();
Person p3 = new Person("Hell",23);
p3.say();
}
}
使用构造方法的作用是对变量进行初始化,但是有些人就会问了,不使用构造方法我一样可以对属相进行初始化,那我为什么还要使用构造方法呢,其实使用对象实例化的时候,就会自动调用构造方法对属性进行初始化,在程序中使用未初始化的变量是很危险的,所以,使用构造方法的作用是更大程度的减少了错误的发生。