标签:提升 重载 实例化 static rgs 相关 开发 nbsp ati
1.抽象类的相关概念
如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
如形状类是抽象的类,圆、三角形等是具体类。
用abstract修饰的类就是抽象类。如果某个类中包含有抽象方法,那么该类就必须定义成抽象类。但是抽象类中不一定有抽象方法。
2.用abstract修饰的类就是抽象类。如果某个类中包含有抽象方法,那么该类就必须定义成抽象类。
抽象类可以有成员属性和非抽象的成员方法。
抽象类不能被实例化,但可以有构造函数。
抽象类只能用作基类,表示的是一种继承关系。继承抽象类的非抽象类必须实现其中的所有抽象方法,而已实现方法的参数、返回值要和抽象类中的方法一样。否则,该类也必须声明为抽象类。
3.使用关键字abstract定义抽象类,一般语法:
[访问权限] abstract class 类名 {成员列表}
4.抽象类的注意事项
抽象类可以有构造方法,但不能直接实例化,只能用来继承;
抽象类的派生子类应该提供对其所有抽象方法的具体实现;如果抽象类的派生子类没有实现其中的所有抽象方法,那么该派生子类仍然是抽象类,只能用于继承,而不能实例化;
抽象类中也可以包含有非抽象的方法,子类中重写非抽象方法时返回值和参数必须与父类一致;
构造方法和静态方法不可以修饰为abstract。
1.抽象方法的相关概念
在某些情况下,类无法(或者没有必要)提供方法的具体实现,可以将此方法声明成抽象方法;
在类中没有方法体的方法,就是抽象方法;
含有抽象方法的类,一定是抽象类。
2.使用关键字abstract声明抽象方法,一般语法:
[访问权限] abstract 返回值类型 方法名称(参数列表);
1.在面向对象领域,抽象类主要用来进行类型隐藏;也就是使用抽象的类型来编程,但是具体运行时就可以使用具体类型。
利用抽象的概念,能够在开发项目中创建扩展性很好的架构,优化程序。
抽象类,抽象方法,在软件开发过程中都是设计层面的概念。也就是说,设计人员会设计出抽象类,抽象方法,程序员都是来继承这些抽象类并覆盖抽象方法,实现具体功能。
1.多态性是面向对象的三大特征之一
多态的含义是:对外一种表现形式,内在有多种具体实现。
Java中多态的具体体现
方法重载
方法覆盖
多态参数(新内容,重点、难点)
1.第一种情况:编译期类型和运行期类型相同
A a = new A();
a.show();
声明A的时候,使用到的类型A表示对象的类型,被称为编译期类型,在编译期,虚拟机认为a的类型是A,对于a所使用的属性和方法的有效性将到类A中去验证。
构造方法A()中的A是运行期类型,在运行期,将执行运行期类型中的方法。
2.第二种情况:当有继承关系时,可能发生编译期类型和运行期类型不同的情况,即编译期类型是父类类型,运行期类型是子类类型。
//A类是B类的父类
A ab = new B();
ab.show();
对象ab的编译期类型为父类A类,运行期类型为子类B类。
如果一个引用的编译期类型和运行期类型不同,那么一定是编译期类型与运行期类型有父类子类关系。
ab对象使用的方法,在编译期到类A中去校验,而运行则执行B类的方法
如果一个对象的编译期类型是父类,运行期类型是子类,可以对该对象进行强制类型转换,将其编译器类型转换为与运行期类型相同的类型,即:B b=(B)ab;
1.当编译器类型是父类,运行期类型是子类时,被称为父类引用指向子类对象
public class Father {
void study() {
this.strXchinaese="小学语文";
System.out.println("我在学"+this.strXchinaese);
}
}
public class Son extends Father {
void study() {
}
}
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Father fa=new Son("456");
fa.study();
}
}
对象Father可以调用Son类中的所有方法,fa只能调用Father中定义的方法,
Son扩展的新方法不能调用。
1.多态环境下对成员方法的调用
public class Father {
void study() {
this.strXchinaese="小学语文";
System.out.println("我在学"+this.strXchinaese);
}
}
public class Son extends Father {
void study() {
}
}
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Father fa=new Son("456");
fa.study();
}
}
简单的说:编译看左边,运行看右边。
2.多态环境下对静态成员方法的调用public class Father {
static void study() {
this.strXchinaese="小学语文";
System.out.println("我在学"+this.strXchinaese);
}
}
public class Son extends Father {
static void study() {
}
}
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Father fa=new Son("456");
fa.study();
}
}
简单的说:编译和运行都看左边。
3.多态环境下对成员变量的调用
public class Father {
int a=100;
void study() {
this.strXchinaese="小学语文";
System.out.println("我在学"+this.strXchinaese);
}
}
public class Son extends Father {
int a=200;
void study() {
}
}
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Father fa=new Son("456");
fa.study();
}
}
简单的说:编译和运行都看等号左边。
注意:变量不存在被子类覆写这一说法,只有方法存在覆写
1.方法参数具有多态性
public class Animal {
void eat() {
System.out.println("动物吃食物");
}
}
public class Cat extends Animal{
void eat() {
System.out.println("猫吃猫粮");
}
}
public class Dog extends Animal{
void eat() {
System.out.println("狗吃肉");
}
}
public class Main1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//Animal animal = new Animal();
Cat cat=new Cat();
Dog dog=new Dog();
/*cat.eat();
dog.eat();*/
method(dog);
method(cat);
}
static void method(Animal animal) {
animal.eat();
}
}
方法参数多态性的好处:提高代码的扩展性
1.向上造型 –又称自动类型提升
public class Father {
void study() {
this.strXchinaese="小学语文";
System.out.println("我在学"+this.strXchinaese);
}
}
public class Son extends Father {
void study() {
}
}
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Father fa=new Son("456");
fa.study();
}
}
只能使用父类中的方法
2.向下造型 –又称向下转型
public class Father {
void study() {
this.strXchinaese="小学语文";
System.out.println("我在学"+this.strXchinaese);
}
}
public class Son extends Father {
void study() {
}
}
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Son son=new Father("456");
son.study();
}
}
子父类中的方法都可以使用
1.instanceof 用法
result = 对象名称 instanceof 类型
参数:
result:布尔类型。
对象名称:必选项,任意对象表达式。
类型:必选项,任意已定义的类,可以是API中的类,可以是自定义的类。
说明:
如果对象是这个类型的一个实例,则 instanceof 运算符返回 true。如果对象不是指定类的一个实例,或者对象是 null,则返回 false
instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例
public class Animal {
void eat() {
System.out.println("动物吃食物");
}
}
public class Cat extends Animal{
void eat() {
System.out.println("猫吃猫粮");
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//Animal animal = new Animal();
Cat cat=new Cat();
Dog dog=new Dog();
/*cat.eat();
dog.eat();*/
method(dog);
method(cat);
}
static void method(Animal animal) {
if(animal instanceof Cat) {
Cat c= (Cat)animal;
c.eat();
}
}
标签:提升 重载 实例化 static rgs 相关 开发 nbsp ati
原文地址:http://www.cnblogs.com/Summer-snow/p/7562692.html