一、面向对象的理解
面向对象的思想是相对于C语言中的面向过程编程思想。我们用java做一件事,只用去new一个对象,并且去调用这个对象的方法,就可以实现我们所要的业务,而这个对象的具体方法做了什么,具体过程,我们就不用去关注了!这就是面向对象编程思想,简而言之,就是角色的改变,由原来的执行者变成了指挥者。
一、面向对象的三大特点封装,继承,多态。
封装——封装性是面向对象程序设计的原则之一。它规定对象应对外部环境隐藏它们的内部工作方式。良好的封装提高了代码的模块性,它防止了对象之间不良的相互影响,这样就使得未来的开发工作变得容易。封装就是隐藏实现细节,将属性私有化,提供公有方法访问私有属性。 类是基于面向对象思想编程语言的基础,程序员可以把具有相同业务性质的代码封装到一个类里, 通过接口方法向外部代码提供服务,同时向外部代码屏蔽类里服务的具体实现方式。对象是类的实例, 类一般是个抽象名词, 比如“人类”,而对象则是具体的物质存在,比如“张三” 这个人。在现实生活中,经常会遇到“类” 和“对象” 这些概念, 比如封装了能实现“全自动洗衣机” 功能的洗衣机类。这里, 用户可以使用面板上的按钮,使用该类里提供的洗衣等服务,并且, 由于该类实现了封装, 所以在使用的时候, 用户可以不用了解其中的自动洗衣原理以及实现机制。类的实现使用的是class关键字,如下:
class Person
{
private int age;
public void setAge(int a)
{
if(a>0 && a<130)
{
age = a;
speak();
}
else
System.out.println("feifa age");
}
public int getAge()
{
return age;
}
private void speak()
{
System.out.println("age="+age);
}
}
这就是一个简单的类,描述了persion这类事物。
继承——从一般到特殊的关系,是一种拓展关系,子类对象是父类的一种,也可称为”is a“的关系。
格式:
修饰符 class SubClass extends SuperClass{
}
SubClass :继承类、子类
SuperClass:父类、基类、超类
子类SubClass通过extends来继承父类SuperClass
修饰符 class SubClass extends SuperClass{
}
SubClass :继承类、子类
SuperClass:父类、基类、超类
子类SubClass通过extends来继承父类SuperClass
特点:
继承是通过extends来实现的,继承提高了代码的复用性,提高了软件的开发效率,让类与类之间产生关系,这个是实现多态的前提,子类对象访问实例成员的时候,是现在子类里找,要是找不到再去父类找,每个类有且只有一个直接父类,一个类没有显示的继承其他的一个类时候,默认的直接父类就是object类,一旦一个类显示的继承了其他的一个类的时候,此时默认的直接父类object就会被取消,Java只支持单继承不支持多继承(接口间可以),父类里面私有的东西,子类不能继承,在继承操作中,对于子类的对象实例化,子类对象在实例化之前必须首先调用父类中的构造方法之后在调用自身的构造方法,如下:
class Super
{
public Super()
{
System.out.println("我是父类super");
}
}
class Sub extends Super
{
public Sub()
{
<span style="white-space:pre"> </span>System.out.println("我是子类sub");
}
}
public class InstanceDemo
{
public static void main(String[] args)
{
<span style="white-space:pre"> </span>new Sub();
/**
* 我是父类super
* 我是子类sub
*
* 先打印的是父类里面的在打印的子类里面
* 从这个可以看出是先调用父类的构造方法创建父类对象再来调用子类里面的构造方法
*
*/
}
}
继承中还有一个重要的特效,那就是成员方法的覆盖(重写):
当父类的某个方法不适合于子类本身的特征行为时就当重写父类中应当改变的方法。
方法重写应遵循的原则:
方法签名(方法名+参数列表)必须相同。
子类方法的返回值类型比父类方法的返回值类型更小或相等。
子类方法声明抛出的异常应比父类方法申明跑出异常更小或相等,即子类方法不能抛出新的异常类型,子类方法可以同时声明抛出多个父类方法声明抛出异常的子类(RuntimeException例外)。
子类方法的访问权限应比父类方法更大或相等。
方法重写应遵循的原则:
方法签名(方法名+参数列表)必须相同。
子类方法的返回值类型比父类方法的返回值类型更小或相等。
子类方法声明抛出的异常应比父类方法申明跑出异常更小或相等,即子类方法不能抛出新的异常类型,子类方法可以同时声明抛出多个父类方法声明抛出异常的子类(RuntimeException例外)。
子类方法的访问权限应比父类方法更大或相等。
1,多态的体现
父类的引用指向了自己的子类对象。
父类的引用也可以接收自己的子类对象。
2,多态的前提
必须是类与类之间有关系。要么继承,要么实现。
通常还有一个前提:存在覆盖。
3,多态的好处
多态的出现大大的提高程序的扩展性。
4,多态的弊端:
提高了扩展性,但是只能使用父类的引用访问父类中的成员。
5,多态的应用
父类的引用指向了自己的子类对象。
父类的引用也可以接收自己的子类对象。
2,多态的前提
必须是类与类之间有关系。要么继承,要么实现。
通常还有一个前提:存在覆盖。
3,多态的好处
多态的出现大大的提高程序的扩展性。
4,多态的弊端:
提高了扩展性,但是只能使用父类的引用访问父类中的成员。
5,多态的应用
利用动物,猫,狗的关系说明:
//对动物的描述
abstract class Animal
{
abstract void eat();
}
//猫继承动物
class Cat extends Animal
{
public void eat()
{
System.out.println("吃鱼");
}
public void catchMouse()
{
System.out.println("抓老鼠");
}
}
//狗继承动物
class Dog extends Animal
{
public void eat()
{
System.out.println("吃骨头");
}
public void kanJia()
{
System.out.println("看家");
}
}
class DuoTaiDemo
{
public static void main(String[] args)
{
function(new Cat());
function(new Dog());
function(new Pig());
}
public static void function(Animal a)//Animal a = new Cat();
{
a.eat();
//a.catchMouse();
}
}
以上function()方法就是多态的具体体现,当我们不实用多态的时候,程序后期但凡产生一个动物我们都要新建一个function()方法提供动物调用。使用多态后我们可以传如任何继承Animal的动物。
但是这也产生了另一个问题,就是Animal a = new Cat();会使Cat类型自动提升为Animal类型,当我们要使用a这个对象来调用Cat中的方法的时候是会报错的。所以要进行Cat c = (Cat)a;这样的强制转型。