一.面向对象的特征
1.封装:
一种信息隐蔽技术(属性私有化),提供公共方法访问私有对象。封装有以下优点:
①隐藏类的实现细节
②可加入控制逻辑,限制对属性的不合理操作
③便于修改,增强代码的可维护性
2.继承:
一般类与特殊类之间的关系。继承允许类继承另一个类的属性和方法。首先拥有反映事物一般特性的类,然后在其基础上派生出反应特殊事物的类。
若一个子类只允许继承一个父类,则成为单继承;若允许继承多个父类,则成为多继承。Java语言通过接口(interface)的方式来弥补由于Java不支持多继承而带来的子类不能享用多个父类成员的缺点。
3.多态:
“一种定义,多种实现”,同一类事物表现出多种形态。
多态是允许程序中出现重名现象。当父类的某个方法被多个子类重写后,将不同的子类对象赋值给父类对象的引用,可以产生不同的功能。
Java中的两种多态形式:
①方法重载:一个类中允许多个方法使用同一个名字,但方法的参数不同,完成的功能也不同。
②子类对象可以与父类对象进行相互转换,而且根据其使用的子类不同,完成的功能也不同。
4.抽象:
从许多事物中,舍弃个别的、非本质的属性,抽取出共同的、本质的属性的过程。抽象的角度取决于分析问题的目的。
二.类与对象
1.定义类
public class Person { String name; //属性 int age; public void say() { //方法 System.out.println("我的名字叫"+name+",今年已经"+age+"岁了!"); } }
其中
public为访问控制符,用于限定声明的类在多大范围内可以被其他的类访问,主要还有默认访问控制符(无关键字)。
2.创建&使用对象
类名 对象名称 = null; //声明对象 对象名称 = new 类名(); //实例化对象
类名 对象名称= new 类名(); //在声明对象的同时实例化对象
public class Person { String name; int age; public void say() { System.out.println("我的名字叫"+name+",今年已经"+age+"岁了!"); } } public class ClassDemo01{ public static void main(String[] args) { Person p1 = new Person(); Person p2 = p1; } }
类是一种引用数据类型,这与数组一样。类的属性需要内存来存储。执行Person p1 = null 时,Java系统会在栈内存开辟一个空间给对象p1,程序继续向下执行到p1 = new Person()时,Java系统会在栈内存开辟空间保存对象p1属性的内容。
在类中,一个对象创建时,编译器会为对象的各类型的成员变量进行初始化,无论是基本数据类型还是引用数据类型。
package com.imooc; public class Person { String name; int age; public void say() { System.out.println("我的名字叫"+name+",今年已经"+age+"岁了!"); } } public class ClassDemo01{ public static void main(String[] args) { Person p1 = new Person(); Person p2 = p1; } }
使用private关键字对name和age属性进行隐藏,那么只能在本类中才能访问name和age属性,其他类是无法访问的。
使用set()和get()方法
public class Person { private String name; private int age; public void setName(String name) { this.name = name; } public String getName() { return name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void say() { System.out.println("我的名字叫"+name+",今年已经"+age+"岁了!"); } } public class ClassDemo03{ public static void main(String[] args) { Person p1 = new Person(); p1.setName("Hua"); p1.setAge(20); p1.say(); } }
3.匿名对象
匿名对象是指没有栈空间的对象,即没有明确给出名字的对象。因为没有对应的栈内存空间引用,所以对象只能使用一次。
4.构造函数
同C++规则,构造函数主要作用是为类中的属性初始化,所以使用构造方法就可以初始化成员属性。
public class Person { private String name; private int age; public Person(String n,int a) { // TODO Auto-generated constructor stub name = n; age = a; } public void say() { System.out.println("我的名字叫"+name+",今年已经"+age+"岁了!"); } } public class ClassDemo04{ public static void main(String[] args) { Person p1 = new Person("Hua",20); p1.say(); } }
注意:只有调用new关键字实例化对象时,才会调用构造函数。
类必须存在构造函数,类中没有用户自定义的构造方法时,Java会自动提供一个默认的构造方法。默认构造方法是一个无参的,什么都不做的构造函数。默认构造方法可以进行对象的实例化操作,但不能对成员属性初始化。有一点需注意,一旦用户自定义了构造方法,那么Java就不会自动提供默认的构造方法。