黑马程序员---java基础---多态,抽象类,接口
2015-09-27 15:13
531 查看
-------
android培训、java培训、期待与您交流! ----------
一.多态:
1.父类的引用指向子类的对象;
2.多态前提和体现
1).有继承关系
2).有方法重写
3).有父类引用指向子类对象
3.多态的转型:
1).自动转型:子类的引用转为父类的引用;Person p = new Student();
2).强制转型:父类的引用转为它所指向的子类对象的引用;Student stu = (Student)p;
3).在进行强制转型前,为保证安全,可以使用instanceof关键字进行判断:
if(p instanceof Student){
Student stu = (Student)p;
}
4.多态的好处:
1).提高了程序的维护性(由继承保证)
2).提高了程序的扩展性(由多态保证)
5.多态的弊端:
1).不能访问子类特有功能(可以向下转型)
6.多态时的访问规则:
1).总体规则:访问的任何成员父类中必须要有,否则编译错误;
例如:
class A{
int num = 10;
}
class B extends A{
int n = 20;
}
main(){
A a = new B();
System.out.println(a.n); //编译错误,父类中没有n
}
2).成员变量:如果子、父类中都有,访问的是“父类”的;
class A{
int num = 10;
}
class B extends A {
int num = 20;
}
main(){
A a = new B(); //多态
System.out.println(a.num); //打印10;
}
普通方法:如果子、父类中都有(重写),访问的是“子类”的;
class A{
void show(){
System.out.println("A-->show()");
}
}
class B extends A{
void show(){
System.out.println("B-->show()");
}
}
main(){
A a = new B();
a.show(); //打印:B-->show()(访问的是子类的show());
}
静态方法:如果子、父类中都有(重写),访问的是“父类”的;
二.抽象类:
1.使用abstract关键字修饰;可以修饰“类”,可以修饰“成员方法”;
abstract class A{
abstract void show();
}
2.“抽象类”的特点:
1).不能被实例化,只能用于被继承;
2).可以包含:成员变量、构造方法、成员方法、抽象方法;
3).可以不包含抽象方法;
3.“抽象方法”的特点:
1).没有方法体;abstract void show();
2).必须被子类重写。除非子类也是个抽象类;
3.子类继承抽象类使用关键字:extends,仍然是单继承;
4.一个子类继承 了一个抽象类,必须实现抽象类中所有的抽象方法;
否则子类也必须是抽象的。
例如:
abstract class A{
abstract void show();
}
class B extends A{ } //编译错误。类B不是抽象的,继承类抽象类必须重写抽象类中的所有抽象方法。
abstract class B extends A{ } //编译通过。类B没有重写父类中的抽象方法,但类B是抽象的。
5.abstract关键字不能和哪些关键字共存:
1.private:抽象方法就是用来被子类重写的,而私有方法不能被子类重写;
2.final:抽象类和抽象方法就是用来被子类继承和重写的,而fianl类和final方法不能
被继承和重写;
3.static:static修饰的方法在没有任何对象的情况下就会被分配内存空间;而抽象方法
没有方法体,无法分配空间;
三.接口:
1.使用interface关键字定义:只能修饰“类”:
interface IA{
}
2.“接口”的特点:
1).不能被实例化,没有构造方法,只能用于子类“实现”;
2).可以包含:
A.成员变量(常量):隐式的定义为:public static final。
上述三个关键字中任何一个都可以不写,系统会自动添加;
例如:
interface IA{
public int num1 = 10; //OK
static final int num2 = 20; //OK
final int num3 = 30; //OK
public final num4 = 40; //OK
int num5 = 50; //OK
}
B.抽象方法:隐式的定义为:public abstract。可以省略,系统会自动添加
例如:
interface IA{
void show1(); //OK
public void show2(); //OK;
abstract void show3(); //OK;
}
3).接口的功能是:扩展功能;
3.子类实现接口使用关键字:implements
4.一个子类可以同时实现多个接口;
interface IA{}
interface IB{}
class C implements IA,IB{ //OK的。
}
5.子类实现接口时,必须重写接口中所有的抽象方法,而且必须是public的--因为
接口中抽象方法的定义隐式的是public的。
例如:
interface IA{
void show();
}
class B implements IA{
void show(){ } //编译错误。父接口的show()隐式的为public的,子类重写时必须是public的;
}
5.接口编译后一样会生成.class文件。
四.多态的形式:
1.父类的多态;
2.抽象类多态;
3.接口多态;
五.类与类,类与接口,接口与接口的关系:
1.类与类:继承关系,关键字:extends ,只能单继承,但是可以多层继承
2.类与接口:实现关系,关键字:implements ,可以单实现,也可以多实现。还可以在继承一个类的同时实现多个接口
3.接口与接口:继承关系,关键字:extends,可以单继承,也可以多继承
例如:
interface IA{}
interface IB{}
interface IC extends IA,IB{} //OK的
六.抽象类和接口的区别:
1.成员区别
1).抽象类 变量,常量;有抽象方法;抽象方法,非抽象方法
2).接口 常量;抽象方法
2.关系区别
1).类与类 继承,单继承
2).类与接口 实现,单实现,多实现
3).接口与接口 继承,单继承,多继承
3.设计理念区别
1).抽象类 被继承体现的是:”is a”的关系。共性功能
2).接口 被实现体现的是:”like a”的关系。扩展功能
七.
一.类名作为形参:
1.实参可以是:
1).此类对象的引用;
2).null;
3).此类子类对象的引用;
二.抽象类作为形参:
1.实参可以是:
1).此类子类对象的引用;
2).null;
三.接口作为形参:
1.实参可以是:
1).此接口子类对象的引用;
2).null;
四.类名作为返回值:
1.可以返回的类型:
1).此类对象的引用;
2).null;
3).此类子类对象的引用;
2.可以用什么类型接收:
1).使用此类类型;
2).不能使用某个子类类型接收;
五.抽象类作为返回值:
1.可以返回的类型:
1).null;
2).此类子类对象的引用;
2.可以用什么类型接收:
1).使用此类类型;(多态)
2).不能使用某个子类类型接收;
六.接口作为返回值:
1.可以返回的类型:
1).null;
2).此接口子类对象的引用;
2.可以用什么类型接收:
1).使用此接口类型;(多态)
2).不能使用某个子类类型接收;
-------
android培训、java培训、期待与您交流! ----------
一.多态:
1.父类的引用指向子类的对象;
2.多态前提和体现
1).有继承关系
2).有方法重写
3).有父类引用指向子类对象
3.多态的转型:
1).自动转型:子类的引用转为父类的引用;Person p = new Student();
2).强制转型:父类的引用转为它所指向的子类对象的引用;Student stu = (Student)p;
3).在进行强制转型前,为保证安全,可以使用instanceof关键字进行判断:
if(p instanceof Student){
Student stu = (Student)p;
}
4.多态的好处:
1).提高了程序的维护性(由继承保证)
2).提高了程序的扩展性(由多态保证)
5.多态的弊端:
1).不能访问子类特有功能(可以向下转型)
6.多态时的访问规则:
1).总体规则:访问的任何成员父类中必须要有,否则编译错误;
例如:
class A{
int num = 10;
}
class B extends A{
int n = 20;
}
main(){
A a = new B();
System.out.println(a.n); //编译错误,父类中没有n
}
2).成员变量:如果子、父类中都有,访问的是“父类”的;
class A{
int num = 10;
}
class B extends A {
int num = 20;
}
main(){
A a = new B(); //多态
System.out.println(a.num); //打印10;
}
普通方法:如果子、父类中都有(重写),访问的是“子类”的;
class A{
void show(){
System.out.println("A-->show()");
}
}
class B extends A{
void show(){
System.out.println("B-->show()");
}
}
main(){
A a = new B();
a.show(); //打印:B-->show()(访问的是子类的show());
}
静态方法:如果子、父类中都有(重写),访问的是“父类”的;
二.抽象类:
1.使用abstract关键字修饰;可以修饰“类”,可以修饰“成员方法”;
abstract class A{
abstract void show();
}
2.“抽象类”的特点:
1).不能被实例化,只能用于被继承;
2).可以包含:成员变量、构造方法、成员方法、抽象方法;
3).可以不包含抽象方法;
3.“抽象方法”的特点:
1).没有方法体;abstract void show();
2).必须被子类重写。除非子类也是个抽象类;
3.子类继承抽象类使用关键字:extends,仍然是单继承;
4.一个子类继承 了一个抽象类,必须实现抽象类中所有的抽象方法;
否则子类也必须是抽象的。
例如:
abstract class A{
abstract void show();
}
class B extends A{ } //编译错误。类B不是抽象的,继承类抽象类必须重写抽象类中的所有抽象方法。
abstract class B extends A{ } //编译通过。类B没有重写父类中的抽象方法,但类B是抽象的。
5.abstract关键字不能和哪些关键字共存:
1.private:抽象方法就是用来被子类重写的,而私有方法不能被子类重写;
2.final:抽象类和抽象方法就是用来被子类继承和重写的,而fianl类和final方法不能
被继承和重写;
3.static:static修饰的方法在没有任何对象的情况下就会被分配内存空间;而抽象方法
没有方法体,无法分配空间;
三.接口:
1.使用interface关键字定义:只能修饰“类”:
interface IA{
}
2.“接口”的特点:
1).不能被实例化,没有构造方法,只能用于子类“实现”;
2).可以包含:
A.成员变量(常量):隐式的定义为:public static final。
上述三个关键字中任何一个都可以不写,系统会自动添加;
例如:
interface IA{
public int num1 = 10; //OK
static final int num2 = 20; //OK
final int num3 = 30; //OK
public final num4 = 40; //OK
int num5 = 50; //OK
}
B.抽象方法:隐式的定义为:public abstract。可以省略,系统会自动添加
例如:
interface IA{
void show1(); //OK
public void show2(); //OK;
abstract void show3(); //OK;
}
3).接口的功能是:扩展功能;
3.子类实现接口使用关键字:implements
4.一个子类可以同时实现多个接口;
interface IA{}
interface IB{}
class C implements IA,IB{ //OK的。
}
5.子类实现接口时,必须重写接口中所有的抽象方法,而且必须是public的--因为
接口中抽象方法的定义隐式的是public的。
例如:
interface IA{
void show();
}
class B implements IA{
void show(){ } //编译错误。父接口的show()隐式的为public的,子类重写时必须是public的;
}
5.接口编译后一样会生成.class文件。
四.多态的形式:
1.父类的多态;
2.抽象类多态;
3.接口多态;
五.类与类,类与接口,接口与接口的关系:
1.类与类:继承关系,关键字:extends ,只能单继承,但是可以多层继承
2.类与接口:实现关系,关键字:implements ,可以单实现,也可以多实现。还可以在继承一个类的同时实现多个接口
3.接口与接口:继承关系,关键字:extends,可以单继承,也可以多继承
例如:
interface IA{}
interface IB{}
interface IC extends IA,IB{} //OK的
六.抽象类和接口的区别:
1.成员区别
1).抽象类 变量,常量;有抽象方法;抽象方法,非抽象方法
2).接口 常量;抽象方法
2.关系区别
1).类与类 继承,单继承
2).类与接口 实现,单实现,多实现
3).接口与接口 继承,单继承,多继承
3.设计理念区别
1).抽象类 被继承体现的是:”is a”的关系。共性功能
2).接口 被实现体现的是:”like a”的关系。扩展功能
七.
一.类名作为形参:
1.实参可以是:
1).此类对象的引用;
2).null;
3).此类子类对象的引用;
二.抽象类作为形参:
1.实参可以是:
1).此类子类对象的引用;
2).null;
三.接口作为形参:
1.实参可以是:
1).此接口子类对象的引用;
2).null;
四.类名作为返回值:
1.可以返回的类型:
1).此类对象的引用;
2).null;
3).此类子类对象的引用;
2.可以用什么类型接收:
1).使用此类类型;
2).不能使用某个子类类型接收;
五.抽象类作为返回值:
1.可以返回的类型:
1).null;
2).此类子类对象的引用;
2.可以用什么类型接收:
1).使用此类类型;(多态)
2).不能使用某个子类类型接收;
六.接口作为返回值:
1.可以返回的类型:
1).null;
2).此接口子类对象的引用;
2.可以用什么类型接收:
1).使用此接口类型;(多态)
2).不能使用某个子类类型接收;
相关文章推荐
- 黑马程序员---java基础---代码块及继承
- 美团2016面试总结
- java面试题二十六 多线程考题
- 一个程序员的时间管理“辛”路历程
- 黑马程序员---java基础---面向对象中的构造方法及static关键字,变量的问题
- 赴京面试中的成长
- 黑马程序员———java基础知识———面向对象
- 2016年一些面试题的整理和心情--1异或到100
- 你也一样重要的非技术贴,告诉你的求职信的写作9温馨提示
- java面试题二十五 构造函数
- java面试题二十四 继承题2
- java面试题二十三 接口
- [转载]Java程序员掌握的10大项知识体系--精通太难说出口
- 高效程序员的 7 个共同特征
- 黑马程序员——反射的理解与应用
- Hibernate面试问题集锦: 概述
- 从交换两个变量的值来看程序员的“奇技淫巧”
- 聊一下测试工程师的面试与招聘【转载自安大叔】
- Java面试问题集锦03-Java程序的基本结构
- 黑马程序员-----java基础(正则表达式和反射)