黑马程序员-面向对象

---------------------- ASP.Net+Android+IOS开发</a>、 .Net培训、期待与您交流! ----------------------


理解面向对象

面向过程和面向对象是两种编程思想

面向过程:以行为为中心,按功能来分析系统需求,最小的程序单元是函数
面向对象:强调直接以现实世界中的事物(即对象)为中心来思考问题,解决问题,保持客观世界中事物及其相互关系的本来面貌

面向对象提供了更好的可重用性、可扩展性、可维护性


类和对象

类:对现实生活中事物的描述
对象:就是这类事物,实实在在的个体


成员变量和局部变量


成员变量:

成员变量作用于整个类,当系统加载类或创建该类的实例时,系统自动为成员变量在堆中分配空间并指定初始值

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培训、期待与您交流! ----------------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值