理解面向对象
面向过程和面向对象是两种编程思想
面向过程:以行为为中心,按功能来分析系统需求,最小的程序单元是函数
面向对象:强调直接以现实世界中的事物(即对象)为中心来思考问题,解决问题,保持客观世界中事物及其相互关系的本来面貌
面向对象提供了更好的可重用性、可扩展性、可维护性
类和对象
类:对现实生活中事物的描述
对象:就是这类事物,实实在在的个体
成员变量和局部变量
成员变量:
成员变量作用于整个类,当系统加载类或创建该类的实例时,系统自动为成员变量在堆中分配空间并指定初始值
static修饰的成员变量随着类的存在而存在(类成员变量),没有被static修饰的成员变量随着实例的存在而存在(实例成员变量)
局部变量:
局部变量作用于方法或者语句,存在于栈内存中,定义局部变量后,系统并未为这个变量在栈中分配空间,直到等到程序为这个变量赋初始值时,系统才为局部变量分配内存,并将初始值保存到这块内存中
因为局部变量不会自动赋初值,所以在定义局部变量时必须显示赋初值,否则就无法使用此局部变量
方法或语句结束,变量消失
封装(Encapsulation)
是指隐藏对象的属性和实现细节,仅对外提供公共访问方式
封装原则:
将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共方法对其访问
继承(Inheritance)
通过继承可以实现代码重用,让类与类之间产生了关系。继承是多态的基础
Java语言中,只支持单继承,不支持多继承
简单一句话:查阅父类功能,创建子类对象使用功能
子父类中成员变量的特点
子类会继承父类的成员变量
如果子类存在与父类同名的成员变量,子类会使用自身的成员变量
子父类中方法的特点-重写(override)
当子类继承父类,沿袭了父类的功能到子类中,但是子类虽具备该功能,功能内容却和父类不一致,这时使用覆盖特性,保留父类的功能定义,并重写功能内容
注意:
子类方法和父类方法必须一模一样(子类方法的访问权限必须大于或等于父类方法访问权限,子类方法只能抛出比父类方法更少的异常,或者父类方法异常的子类异常)
如果父类方法是私有方法,那么子类则不存在重写,相当于子类中增加了一个全新的方法
静态只能覆盖静态
子父类中构造函数的特点
子类的实例化过程:
子类的所有构造函数默认都会访问父类中空参数的构造函数,因为在子类初始化之前,必须先初始化父类
因为子类每一个构造函数内的第一行都有一句隐式super(); //super():会访问父类中空参数的构造函数
当父类中没有无参的构造函数时,子类的构造函数中必须手动调用父类中带参的构造函数
当然子类的构造函数第一行也可以手动指定this语句来访问本类中的构造函数,此时第一行是 this语句,不是super语句
但this语句中还是会默认调用super(),也就是说子类中至少会有一个构造函数会访问父类中的构造函数
多态(Polymorphism)
Java引用变量有两种类型:编译类型和运行类型,编译类型由声明该变量的类型决定,运行类型由实际赋给该变量的对象决定。如果编译类型和运行类型不一致,就出现了多态
类与类之间存在继承或者实现关系,父类引用指向子类对象,多态提高了程序的扩展性
转型
Animal a = new Cat(); //类型提升,向上转型
Cat c = (Cat)a; //强制将父类的引用转成子类类型,向下转型
instanceof
Animal a = new Cat(); //a instanceof Animal; 为true
成员方法的多态特性:
编译时参考编译类型,如果调用的方法在编译类型中不存在,则报异常,目的是保证扩展性
运行时参考运行类型
简单总结:编译看左边,运行看右边
成员变量不存在多态特性:
成员变量始终参考编译类型
注意:
子类对继承过来的变量的修改会映射到父类
静态成员方法不存在多态特性:
静态成员方法始终参考编译类型
/**
多态例子
*/
class PolymorphismTest
{
public static void main(String[] args)
{
DoStudent ds = new DoStudent();
ds.doSomething(new BaseStudent());
ds.doSomething(new AdvStudent());
}
}
//学生类,由基础班和高级班抽取出来的共性
abstract class Student
{
public abstract void study();
public void sleep()
{
System.out.println("躺着睡");
}
}
//学生操作类,直接操作Student,而不是基础班或高级班的学生,体现多态的扩展性
class DoStudent
{
public void doSomething(Student stu)
{
stu.study();
stu.sleep();
}
}
//基础班学生
class BaseStudent extends Student
{
public void study()
{
System.out.println("学习基础知识");
}
public void sleep()
{
System.out.println("站着睡");
}
}
//高级班学生
class AdvStudent extends Student
{
public void study()
{
System.out.println("学习高级知识");
}
}
---------------------- ASP.Net+Android+IOS开发</a>、 .Net培训、期待与您交流! ----------------------