黑马程序员—面向对象封装继承多态
2015-04-07 00:12
337 查看
一,类的含义及关键字
面向过程:是面向对象的基础,我们承担的是执行者角色
面向对象:是基于面向过程,我们承担的是指挥者,也因此更有利于描述事物
面向对象的三大特征:封装,继承,多态
类是某一类事物的描述,是抽象的、概念上的定义;对象是实际存在的该类事物的每个个体,因而也称实例(instance)。
如下:
</pre><pre name="code" class="java"><span style="font-size:14px;">class Person //定义一个类
{
int age;
void show()
{
System.out.println("my age is "+age);
}
public static void main(String[] args)
{
Person p1=new Person(); //产生对象p1
Person p2=new Person(); //产生对象p2
p1.age=-30;
p1.shw();
p2.shw();
}
}</span>
1,this的使用还没声明,该对象却要调用该对象时,其传递参数可用this;另外,可以区别成员变量
2,如果一个class有多个构造函数,其中在某个构造函数中需要调用另一个或几个构造函数时可用诸如this()的形式来调用该类的构造函数,其中()中的内容可根据具体的参数调用相应的构造函数
3,静态成员变量的访问方式有3种,通过类名访问;通过对象名访问;同一类中的成员函数也可以直接对该静态变量进行访问
类的继承
二继承和实现形成描述事物的体系
通过继承可以简化类的定义,java只支持单继承,不允许多重继承。但可以有多层继承,即一个类可以继承某一个类的子类。子类继承父类所有的(非private的)成员变量和成员方法,但不继承父类的构造方法。在子类的构造方法中可使用语句super(参数列表)调用父类的构造方法。如果子类的构造方法中没有显示地调用父类的构造方法,也没有使用this(参数列表)调用重载的其他构造方法,则在产生子类的实例对象时,系统默认调用父类无参数的构造方法,因此在编写一个类时,应保证有一个无参数的构造方法。
覆盖父类的方法
覆盖父类的方法和被覆盖方法具有相同的方法名称、参数列表和返回值类型。
如果在子类中想调用父类的那个被覆盖的方法,我们可以用super.方法的格式。
覆盖方法时,不能使用比父类中被覆盖的方法更小的访问权限。
final
final标记的类不能被继承。
final标记的方法不能被子类重写。
final标记的变量(成员变量或局部变量)即成为常量,只能赋值一次。要么在变量刚开始定义时对其进行赋值,要么在构造方法中进行赋值,但必须保证在所有的构造方法中对其赋值。
方法中定义的内置类只能访问该方法的final类型的局部变量,用final定义的局部变量相当于一个常量,它的生命周期超出方法的运行的生命周期,将一个形参定义成final也是可以的,就先定了我们在方法中修改形式参数的值。
抽象类
ja
b00a
va中可以一些不含方法体的方法,它的方法体的实现交给该类的子类根据自己的情况去实现,这样的方法就是抽象方法,包含抽象方法的类就叫抽象类。抽象类中不一定所有的方法是抽象方法。
抽象类必须用abstract关键字修饰;抽象方法也必须用abstract来修饰。
抽象类不能被实例化,也就是不能用new关键字去产生对象。
抽象方法只需声明,而不需实现,即没用大括号。
含有抽象方法的类必须被声明为抽象类,抽象类的子类必须覆盖所有的抽象方法后才能被实例化,否则这个子类还是个抽象类。
接口(interfacce)
如果一个抽象类中的所有方法都是抽象的(不用加abstract关键字),我们就可以将这个类用另外一种方式来定义,也就是接口。接口是抽象方法和常量的定义的集合,从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。
接口中的成员都是public访问类型的,public关键字可省略。接口里的变量默认是用publicstatic final标识的,一般可以将public static省略。
我们可以定义一个新的接口用extends关键字去继承一个已有的接口。
我们也可以定义一个类用implements关键字去实现一个接口中所有的方法,这些方法必须是public的。我们还可以去定义一个抽象类用implements关键字去实现一个接口中定义的部分方法。
一个类可以继承一个父类的同时,实现一个或多个接口,extends关键字必须位于implements关键字之前。
三,多态
这里给出老师的一个经典例子
面向过程:是面向对象的基础,我们承担的是执行者角色
面向对象:是基于面向过程,我们承担的是指挥者,也因此更有利于描述事物
面向对象的三大特征:封装,继承,多态
类是某一类事物的描述,是抽象的、概念上的定义;对象是实际存在的该类事物的每个个体,因而也称实例(instance)。
如下:
</pre><pre name="code" class="java"><span style="font-size:14px;">class Person //定义一个类
{
int age;
void show()
{
System.out.println("my age is "+age);
}
public static void main(String[] args)
{
Person p1=new Person(); //产生对象p1
Person p2=new Person(); //产生对象p2
p1.age=-30;
p1.shw();
p2.shw();
}
}</span>
1,this的使用还没声明,该对象却要调用该对象时,其传递参数可用this;另外,可以区别成员变量
2,如果一个class有多个构造函数,其中在某个构造函数中需要调用另一个或几个构造函数时可用诸如this()的形式来调用该类的构造函数,其中()中的内容可根据具体的参数调用相应的构造函数
3,静态成员变量的访问方式有3种,通过类名访问;通过对象名访问;同一类中的成员函数也可以直接对该静态变量进行访问
类的继承
二继承和实现形成描述事物的体系
通过继承可以简化类的定义,java只支持单继承,不允许多重继承。但可以有多层继承,即一个类可以继承某一个类的子类。子类继承父类所有的(非private的)成员变量和成员方法,但不继承父类的构造方法。在子类的构造方法中可使用语句super(参数列表)调用父类的构造方法。如果子类的构造方法中没有显示地调用父类的构造方法,也没有使用this(参数列表)调用重载的其他构造方法,则在产生子类的实例对象时,系统默认调用父类无参数的构造方法,因此在编写一个类时,应保证有一个无参数的构造方法。
覆盖父类的方法
覆盖父类的方法和被覆盖方法具有相同的方法名称、参数列表和返回值类型。
如果在子类中想调用父类的那个被覆盖的方法,我们可以用super.方法的格式。
覆盖方法时,不能使用比父类中被覆盖的方法更小的访问权限。
final
final标记的类不能被继承。
final标记的方法不能被子类重写。
final标记的变量(成员变量或局部变量)即成为常量,只能赋值一次。要么在变量刚开始定义时对其进行赋值,要么在构造方法中进行赋值,但必须保证在所有的构造方法中对其赋值。
方法中定义的内置类只能访问该方法的final类型的局部变量,用final定义的局部变量相当于一个常量,它的生命周期超出方法的运行的生命周期,将一个形参定义成final也是可以的,就先定了我们在方法中修改形式参数的值。
抽象类
ja
b00a
va中可以一些不含方法体的方法,它的方法体的实现交给该类的子类根据自己的情况去实现,这样的方法就是抽象方法,包含抽象方法的类就叫抽象类。抽象类中不一定所有的方法是抽象方法。
抽象类必须用abstract关键字修饰;抽象方法也必须用abstract来修饰。
抽象类不能被实例化,也就是不能用new关键字去产生对象。
抽象方法只需声明,而不需实现,即没用大括号。
含有抽象方法的类必须被声明为抽象类,抽象类的子类必须覆盖所有的抽象方法后才能被实例化,否则这个子类还是个抽象类。
接口(interfacce)
如果一个抽象类中的所有方法都是抽象的(不用加abstract关键字),我们就可以将这个类用另外一种方式来定义,也就是接口。接口是抽象方法和常量的定义的集合,从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。
接口中的成员都是public访问类型的,public关键字可省略。接口里的变量默认是用publicstatic final标识的,一般可以将public static省略。
我们可以定义一个新的接口用extends关键字去继承一个已有的接口。
我们也可以定义一个类用implements关键字去实现一个接口中所有的方法,这些方法必须是public的。我们还可以去定义一个抽象类用implements关键字去实现一个接口中定义的部分方法。
一个类可以继承一个父类的同时,实现一个或多个接口,extends关键字必须位于implements关键字之前。
三,多态
这里给出老师的一个经典例子
/* 需求: 电脑运行实例, 电脑运行基于主板。 */ interface PCI { public void open(); public void close(); } class MainBoard { public void run() { System.out.println("mainboard run "); } public void usePCI(PCI p)//PCI p = new NetCard()//接口型引用指向自己的子类对象。 { if(p!=null) { p.open(); p.close(); } } } class NetCard implements PCI { public void open() { System.out.println("netcard open"); } public void close() { System.out.println("netcard close"); method(); } } class SoundCard implements PCI { public void open() { System.out.println("SoundCard open"); } public void close() { System.out.println("SoundCard close"); } } /* class MainBoard { public void run() { System.out.println("mainboard run"); } public void useNetCard(NetCard c) { c.open(); c.close(); } } class NetCard { public void open() { System.out.println("netcard open"); } public void close() { System.out.println("netcard close"); } } */ class DuoTaiDemo { public static void main(String[] args) { MainBoard mb = new MainBoard(); mb.run(); mb.usePCI(null); mb.usePCI(new NetCard()); mb.usePCI(new SoundCard()); } }
相关文章推荐
- 黑马程序员——OC笔记之面向对象三大特征(封装、继承、多态)
- 黑马程序员——OC语言基础:面向对象三大特性,封装、继承、多态
- 黑马程序员_OC语言之面向对象的三大特性(封装、继承、多态)
- 黑马程序员---java基础之面向对象(一)三大特征(封装,继承,多态)
- 黑马程序员——Java基础---面向对象(封装、继承、多态)
- 黑马程序员----Java基础之面向对象(封装 继承 多态)(二)
- 黑马程序员——OC篇(二)面向对象的三大特性(封装、继承、多态)
- 黑马程序员<java基础<面向对象(封装,继承,多态,抽象)>>
- 黑马程序员-面向对象(封装,继承,多态)
- 黑马程序员-面向对象三大原则——封装、继承、多态
- 黑马程序员---OC面向对象三大特性(封装、继承、多态)
- 黑马程序员----Java基础之面向对象(封装 继承 多态)
- 黑马程序员—面向对象(static,封装,继承,多态,内部类,抽象类,接口)总结
- 黑马程序员——面向对象三大特征(封装、继承、多态)
- 黑马程序员 JAVA基础<二> 面向对象之封装 继承 多态
- 黑马程序员_JAVA之面向对象(封装,继承和多态)
- 黑马程序员-------面向对象的封装、继承、多态一些学习笔记
- 黑马程序员java学习笔记——面向对象的特征封装、继承和多态
- 黑马程序员—面向对象之封装、继承、多态
- 黑马程序员——JAVA面向对象的特性:封装,继承,多态