Java中的abstract方法和abstract类的问题

合集下载

abstract在java中用法(一)

abstract在java中用法(一)

abstract在java中用法(一)Abstract在Java中在Java中,abstract是一个关键字,用于定义抽象类和抽象方法。

抽象类是一种特殊的类,不能被实例化,只能用作其他类的基类。

抽象方法是一种没有具体实现的方法,只有方法声明,没有方法体。

下面将详细讲解abstract在Java中的用法。

抽象类抽象类是一种用abstract关键字修饰的类。

它不能被实例化,只能作为父类被继承。

抽象类的主要作用是定义子类需要实现的一组方法,子类必须实现这些方法才能被实例化。

定义抽象类的语法如下:abstract class AbstractClass {// 抽象方法public abstract void abstractMethod();// 普通方法public void normalMethod() {// 方法实现}}抽象类可以包含抽象方法和普通方法。

抽象方法用abstract关键字修饰,没有方法体;普通方法有方法体。

抽象类可以包含普通成员变量和静态成员变量,也可以包含普通方法和静态方法。

但是不能创建抽象类的实例。

抽象方法抽象方法是一种没有具体实现的方法,只有方法声明。

抽象方法用abstract关键字修饰,没有方法体。

抽象方法必须在抽象类中声明,子类必须实现这些抽象方法才能被实例化。

定义抽象方法的语法如下:abstract void abstractMethod();抽象方法也可以包含参数和返回值,用于定义子类必须实现的方法签名。

子类继承抽象类后,必须实现抽象方法,否则子类也必须声明为抽象类。

继承抽象类子类继承抽象类后,必须实现抽象类中的所有抽象方法才能被实例化。

子类可以通过覆盖抽象方法来实现具体的功能。

如果子类不想实现某个抽象方法,那么子类也必须声明为抽象类。

继承抽象类的语法如下:class ConcreteClass extends AbstractClass {// 实现抽象方法public void abstractMethod() {// 方法实现}// 覆盖普通方法public void normalMethod() {// 方法实现}}注意,如果一个类继承了抽象类,但没有实现抽象方法,则该类必须声明为抽象类。

抽象类和抽象方法

抽象类和抽象方法

抽象类和抽象方法一、定义:java中可以定义的一些不含方法体的方法,它的方法体的实现交给该类的子类根据自己的情况去实现,这就是抽象方法。

包含抽象方法的类就叫做抽象类。

一个抽象类可以有一个或多个抽象方法。

二、抽象规则:1、抽象类和方法必须用abstract来修饰;2、抽象类不能被实例化;3、抽象方法只需声明,无需实现,抽象方法一定调用子类重写后的非抽象的方法;4、抽象类有构造但不能被调用;5、含有抽象方法的类必须声明为抽象类,抽象类的子类必须覆盖所有的抽象方法后才能被实例化,否则这个类还是个抽象类。

注意:抽象方法不能为private的,因为抽象方法没有具体实现,需要在子类中继承并重写来实现具体实现。

抽象方法必须重写实现其具体的功能。

【TestAbstract.java】package day7am;public abstract class TestAbstract {public abstract void test();//含有抽象方法的类一定是抽象类。

public static void main(String[] args) {}}三、抽象方法的继承与实现当某类继承抽象类时,如果其本身不是抽象类时,则必须实现所继承抽象类中的抽象方法。

如,具有启动(startup)方法的抽象车辆类Car,其每中子类都必须实现其自己的、专属于某种类型车辆的具体启动(startup)方法,下边例子就说明了。

【TestAbstract.java】package Pra;//定义抽象类Carabstract class Car{//定义抽象方法startUppublic abstract void startUp();}//定义抽象类Audi并使该类继承自Carabstract class Audi extends Car{//定义抽象方法turbopublic abstract void turbo();}//定义非抽象类Audi_A6继承自Audiclass Audi_A6 extends Audi{//实现startUp方法public void startUp(){System.out.println("调用了奥迪A6的启动功能!!!");}//实现turbo方法public void turbo(){System.out.println("调用了奥迪A6的加速功能!!!");}}//定义非抽象类Audi_A8继承自Audiclass Audi_A8 extends Audi{//实现startUp方法public void startUp(){System.out.println("调用了奥迪A8的启动功能!!!");}//实现turbo方法public void turbo(){System.out.println("调用了奥迪A8的加速功能!!!");}}public class TestAbstract{public static void main(String[] args){//创建Audi_A6对象并使该类引用a6指向该对象Audi_A6 a6=new Audi_A6();//调用Audi_A6对象中的方法a6.startUp();a6.turbo();//创建Audi_A8对象并使该类引用a8指向该对象Audi_A8 a8=new Audi_A8();//调用Audi_A8对象中的方法a8.startUp();a8.turbo();}}程序运行结果:-----------------------------调用了奥迪A6的启动功能!!!调用了奥迪A6的加速功能!!!调用了奥迪A8的启动功能!!!调用了奥迪A8的加速功能!!!-----------------------------上面的例子里定义了4个类,其中Car和Audi为抽象类,他们分别代表轿车和奥迪轿车,故不适具体类,因为轿车和奥迪轿车还有很多子类。

java abstract方法继承

java abstract方法继承

Java Abstract方法继承一、什么是Abstract方法Abstract方法是Java中一种特殊的方法,它只有声明而没有具体的实现。

在定义一个Abstract方法时,需要使用abstract关键字修饰方法,并且该方法所在的类必须是抽象类或者接口。

Abstract方法的定义如下:public abstract void methodName();二、抽象类与接口抽象类(Abstract Class)是一个不能被实例化的类,它可以包含Abstract方法和具体的方法实现。

抽象类通过使用abstract关键字进行修饰。

接口(Interface)是一种纯抽象的类,它只包含Abstract方法和常量。

接口定义方法时,默认使用public abstract修饰。

抽象类和接口的区别如下: - 抽象类可以有构造方法,而接口不能有构造方法。

- 类只能继承一个抽象类,但可以实现多个接口。

- 抽象类可以有成员变量,而接口只能有常量。

- 接口中的方法默认是public的,而抽象类中的方法可以有不同的访问修饰符。

三、Abstract方法的继承方式Abstract方法在继承关系中有以下几种继承方式:子类覆盖方法、子类重载方法、子类继续声明抽象方法。

1. 子类覆盖方法当一个子类继承自一个抽象类或者实现一个接口时,它必须实现抽象类或接口中的所有Abstract方法。

子类通过覆盖Abstract方法来提供具体的实现。

例如,有一个抽象类Animal,其中定义了一个Abstract方法eat(),如下所示:public abstract void eat();}如果一个子类Dog继承自Animal,则必须实现eat()方法:public class Dog extends Animal {@Overridepublic void eat() {System.out.println("狗吃骨头");}}2. 子类重载方法除了覆盖Abstract方法,子类还可以重载Abstract方法。

java中abstract怎么使用

java中abstract怎么使用

java中abstract怎么使⽤abstract(抽象)修饰符,可以修饰类和⽅法1,abstract修饰类,会使这个类成为⼀个抽象类,这个类将不能⽣成对象实例,但可以做为对象变量声明的类型,也就是编译时类型,抽象类就像当于⼀类的半成品,需要⼦类继承并覆盖其中的抽象⽅法。

2,abstract修饰⽅法,会使这个⽅法变成抽象⽅法,也就是只有声明(定义)⽽没有实现,实现部分以";"代替。

需要⼦类继承实现(覆盖)。

注意:有抽象⽅法的类⼀定是抽象类。

但是抽象类中不⼀定都是抽象⽅法,也可以全是具体⽅法。

abstract修饰符在修饰类时必须放在类名前。

abstract修饰⽅法就是要求其⼦类覆盖(实现)这个⽅法。

调⽤时可以以多态⽅式调⽤⼦类覆盖(实现)后的⽅法,也就是说抽象⽅法必须在其⼦类中实现,除⾮⼦类本⾝也是抽象类。

注意:⽗类是抽象类,其中有抽象⽅法,那么⼦类继承⽗类,并把⽗类中的所有抽象⽅法都实现(覆盖)了,⼦类才有创建对象的实例的能⼒,否则⼦类也必须是抽象类。

抽象类中可以有构造⽅法,是⼦类在构造⼦类对象时需要调⽤的⽗类(抽象类)的构造⽅法。

举个简单的例⼦下⾯有⼀个抽象类abstract class E{public abstract void show();//public abstract 可以省略}然后其它类如果继承它通常为了实现它⾥⾯的⽅法class F extends E{void show(){//写具体实现的代码}}最后再主⽅法⾥⾯定义⼀个⽗类引⽤指向⼦类对象,就会发⽣多态现象,⽐如E e=new F();e.show();实际调⽤了⼦类⾥⾯的show()⽅法。

Java抽象类、抽象方法详解

Java抽象类、抽象方法详解

Java抽象类、抽象⽅法详解⽬录1. 概述类⽤于描述现实⽣活中⼀类事物。

类中有属性、⽅法等成员。

⽗类中的⽅法,被它的⼦类们重写,⼦类各⾃的实现都不尽相同。

那么⽗类的⽅法声明和⽅法主体,只有声明还有意义,⽽⽅法主体则没有存在的意义了。

某种情况下,⽗类只能知道⼦类应该具备⼀个怎样的⽅法,但是不能够明确知道如何实现该⽅法。

只能在⼦类中才能确定如何去实现⽅法体。

例如:所有⼏何图形都应该具备⼀个计算⾯积的⽅法。

但是不同的⼏何图形计算⾯积的⽅式不同。

我们把没有⽅法主体的⽅法称为抽象⽅法。

Java语法规定,包含抽象⽅法的类就是抽象类。

2. 抽象⽅法抽象⽅法:只有⽅法的声明,没有⽅法体,以分号 ; 结尾,使⽤abstract关键字修饰定义格式:修饰符 abstract 返回值类型⽅法名(参数列表);代码举例:public abstract void run();抽象⽅法不能⽤private、final、static、native修饰3. 抽象类抽象类:包含抽象⽅法的类。

如果⼀个类包含抽象⽅法,那么该类必须是抽象类,使⽤abstract关键字修饰定义格式:public abstract class 类名 {//抽象类中可以包含变量、常量,抽象⽅法,⾮抽象⽅法}代码举例:public abstract class Person {public abstract void work();}抽象类的使⽤抽象类不能实例化,不能直接创建对象。

抽象类是⽤来被继承的,继承抽象类的⼦类必须重写⽗类所有的抽象⽅法。

否则,该⼦类也必须声明为抽象类,使⽤abstract关键字修饰抽象类也是类,因此原来类中可以有的成员,抽象类都可以有,那么抽象类不能直接创建对象,为什么还有构造器呢?供⼦类调⽤,⼦类创建对象时,需要为从⽗类继承的属性初始化。

抽象类不能使⽤final修饰public class Teacher extends Person {public void work() {System.out.println("讲课");}}public class AbstractClassTest {public static void main(String[] args) {// 创建⼦类对象Teacher t = new Teacher();// 调⽤run⽅法t.work();}}输出结果:讲课此时的⽅法重写,是⼦类对⽗类抽象⽅法的完成实现,我们将这种⽅法重写的操作,叫做实现⽅法。

JAVA抽象类

JAVA抽象类
abstract 关键字修饰的方法必须被其子类重写才有意义,否则这个方法半永远不会有方 法体,因此 abstract 方法不能定义为 private 访问权限,即 private 和 abstract 不能同时使用。
抽象类的作用
从前面的示例程序可以看出,抽象类不能创建实例,它只能当成父类来被继承,从语义的角 度来看,抽象类是从多个具体类中抽象出来的父类,它具有更高层次的抽象。从多个具有相 同特征的类中抽象的出一个抽象类,以这个抽象类作为其子类的模板,从而避免了子类设计 的随意性。
return a+b+c; }
//重写 Shape 类的返回形状的抽象方法 public String getType() {
return "三角形";
} }
上面的 Triangle 类继承了 Shape 抽象类,并实现了 Shape 类中两个抽象方法,是一个普通类, 因此可以创建 Triangle 类的实例,可以让一个 Shape 类型的引用变量指向 Triangle 对象
abstract 不能用于修饰属性,不能用于修饰局部变量,即没有抽象变量,没有抽象属性等说 法;abstract 也不能用于修饰构造器,没有抽象构造器,抽象类里定义的构造器只能是普通构
造器。
另外我们要记住,当使用 static 来修饰一个方法时,表明这个方法属于当前类,即 该方法可以通过类来调用,如果该方法被定义成抽象方法,则将导致通过该类来调用该方法 时出现错误(调用了一个没有方法体的方法肯定会引起错误),因此 static abstract 不能同时 修饰某个方法,即没有所谓的类抽象方法。
抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板,子类在抽象类 的基础上进行扩展、改造,但子类总体上会大致保留抽象类的行为方式。

抽象方法必须在抽象类中吗

抽象方法必须在抽象类中吗

抽象方法必须在抽象类中吗抽象方法是一种没有实现的方法,它只有方法的声明而没有方法的具体实现。

在Java中,抽象方法必须在抽象类中声明。

这是因为抽象类是一种不能创建对象的类,它的主要作用是给它的子类提供一种方法的约束,要求子类必须实现抽象类中的抽象方法。

首先,一个抽象方法的存在就意味着它需要被子类实现。

而抽象类是作为子类的父类存在的,它定义了子类需要实现的方法。

如果抽象方法不是在抽象类中定义,那么它将无法被子类重写和实现,失去了抽象方法的目的和意义。

其次,抽象类本身是不能被实例化的。

抽象类是一种功能不完整、不具体的类,只有具体的子类才能被实例化。

在Java中,如果一个类中包含了抽象方法,那么这个类必须声明为抽象类。

抽象类不能直接实例化,它只能被继承,然后由子类实现其中的抽象方法。

另外,抽象类还可以包含非抽象方法。

非抽象方法是有方法体的方法,它可以在抽象类中直接实现,也可以在抽象类的具体子类中重写。

非抽象方法是抽象类的一部分,它们和抽象方法一起构成了抽象类的特征和能力。

通过上述的解释,我们可以看出抽象方法必须在抽象类中声明是有其合理性和必要性的。

抽象方法的存在使得抽象类成为了一种约束和模板,它给予了子类必须实现的方法规范。

抽象类作为一种模板和约束,它可以定义并实现一些通用的方法,而将具体的实现交给子类来完成。

这样做的好处是可以有效地避免代码的重复和冗余,提高代码的复用性和可维护性。

此外,抽象类还可以通过构造器继承或实例化子类对象。

子类继承抽象类可以获得父类中的方法和变量,并且必须实现父类中的抽象方法。

抽象类也可以通过抽象类的引用变量实例化子类对象。

这种方式可以实现面向抽象编程,提高代码的灵活性和可扩展性。

总结来说,抽象方法必须在抽象类中声明。

抽象类是一种不能被实例化的类,它的主要作用是给子类一种方法的约束,要求子类必须实现抽象类中的抽象方法。

抽象方法的存在使得抽象类具有模板和约束的功能,提高了代码的复用性和可维护性。

java interfac和abstract class的基础用法

java interfac和abstract class的基础用法

public static void main(String[] args) { Runner tt=new TT();//接口的引用指向实现的对象 System.out.println(tt.i); System.out.println(Runner.i); tt.start(); Eater ee=new TT(); System.out.println(ee.j); System.out.println(Eater.j); ee.start(); } }
{ System.out.println("---------run()-------"); } public void stop() { System.out.println("---------stop()-------"); } public void openMouth() { System.out.println("---------openMouth()-------"); } public void upAndDown() { System.out.println("---------upAndDown()-------"); } public void goIn() { System.out.println("---------goIn()-------"); } } public class TestInterface {
同样,如果不能在抽象类中定义默认行为,就会导致同样的方法实现 one place"原则, 出现在该抽象类的每一个派生类中, 违反了"one rule, 造成代码重复,同样不利于以后的维护。因此,在 abstract class 和 interface 间进行选择时要非常的小心。

Java抽象类详解

Java抽象类详解

Java抽象类详解 在中,介绍了抽象⽅法与接⼝,以及做了简单的⽐较。

这⾥我想详细探讨下抽象类。

⼀、抽象类的定义 被关键字“abstract”修饰的类,为抽象类。

(⽽且,abxtract只能修饰类和⽅法) 下⾯显⽰了⼀个最简单的空抽象类public abstract class AbstractClass {public static void main(String[] args) {AbstractClass abstractClass=new AbstractClass();}} 当对这个空的抽象类进⾏实例化时,编译器会报错: 'AbstractClass' is abstract; cannot be instantiated' 现在对这个抽象类进⾏扩展,添加属性和⽅法:public abstract class AbstractClass {public int constInt = 5;/*重载method()*/public void method() { }//没有编译错误public abstract void method(int a);public static void main(String[] args) {AbstractClass abstractClass=new AbstractClass() {@Overridepublic void method(int a) {System.out.println("实例化抽象类");}};System.out.println(abstractClass.constInt);abstractClass.method(5);}}//运⾏结果/* 5 实例化抽象类*/ 在这个抽象类中我添加了⼀个实例属性,⼀个抽象⽅法,以及该抽象⽅法的重载实例⽅法,这些都是合法的。

在main⽅法中,直接对抽象类通过new操作符进⾏实例化,出乎意料的是,IDE直接提⽰了这种操作——这⾥⽣成了⼀个(Anonymous Inner)。

public abstract方法

public abstract方法

public abstract方法public abstract方法是面向对象编程中的一种方法,它具有特殊的功能和用途。

在本文中,我将详细介绍public abstract方法的定义、特点和使用场景。

我们来了解一下public abstract方法的定义。

在Java编程语言中,public abstract方法是一种特殊的方法,它具有以下特点:那么,为什么需要public abstract方法呢?public abstract方法的主要作用是定义一种方法的接口规范,而不关心具体的实现。

通过声明public abstract方法,可以使得子类或者实现类必须实现这些方法,以达到统一的接口规范。

在使用public abstract方法时,需要注意以下几点。

首先,public abstract方法不能有方法体,即不能包含具体的实现代码。

其次,public abstract方法必须被子类或者实现类重写或实现,否则会导致编译错误。

此外,如果一个类继承了抽象类,那么它必须实现所有的public abstract方法,否则仍然会导致编译错误。

public abstract方法的使用场景非常广泛。

首先,它可以用于定义接口。

接口是一种纯粹的抽象类型,其中所有的方法都是public abstract方法。

通过接口,可以定义一种规范,任何实现该接口的类都必须实现接口中定义的所有方法。

这样,可以达到一种面向接口编程的设计思想,提高代码的可扩展性和可维护性。

public abstract方法也可以用于定义抽象类。

抽象类是一种不能被实例化的类,其中可以包含具体的实现代码和public abstract方法。

通过抽象类,可以定义一些通用的方法,而将具体的实现交给子类去完成。

这样,可以实现代码的复用和扩展。

public abstract方法还可以用于回调函数的定义。

回调函数是一种常用的设计模式,通过定义public abstract方法,可以在某个事件发生时回调该方法,以实现特定的功能。

Java面向对象(二)习题

Java面向对象(二)习题

1、Java中用于定义接口的关键字是()A、importB、packageC、classD、interface2、以下关于abstract的说法,正确的是( )A、abstract只能修饰类B、abstract只能修饰方法C、abstract类中必须有abstract方法D、abstarct方法所在的类必须用abstract修饰3、下列哪种说法是正确的()A、私有方法不能被子类覆盖。

B、子类可以覆盖超类中的任何方法。

C、覆盖方法可以声明自己抛出的异常多于那个被覆盖的方法。

D、覆盖方法中的参数清单必须是被覆盖方法参数清单的子集。

4、关于类继承的说法,正确的是()A、Java 类允许多重继承B、Java接口允许多继承C、接口和类都允许多继承D、接口和类都不允许多继承5、关于抽象类,正确的是______。

A. 抽象类中不可以有非抽象方法B. 某个非抽象类的父类是抽象类,则这个子类必须重载父类的所有抽象方法C. 不能用抽象类去创建对象D. 接口和抽象类是同一个概念6、下列哪个类是由编译器自动生成对象的特殊类,是用于类操作?()A、Class类B、Thread类C、System类D、Object类7、下面关于继承的哪些叙述是正确的。

( )A、在java中只允许单一继承。

B、在java中一个类只能实现一个接口。

C、在java中一个类不能同时继承一个类和实现一个接口。

D、java的单一继承使代码更可靠。

8、抽象类A和抽象类B的定义如下:abstract class ex4_5_10_A {abstract int getinfo();}public class ex4_5_10 extends ex4_5_10_A {private int a = 0;public int getinfo() {return a;}public static void main(String args[]) {ex4_5_10 b = new ex4_5_10();System.out.println(b.getinfo());}}关于上述代码说明正确的是()。

Java面向对象课-抽象类和接口5

Java面向对象课-抽象类和接口5

的类如果不可以继承将没有任何意义。
JAVA 基础课程-抽象类和接口
继承抽象类
• 一个类继承抽象类后,必须重写其抽象方法,不同的子类可以有不同的实现。
JAVA 基础课程-抽象类和接口
抽象类的意义
• 抽象类的意义在于:
-为其子类提供一个公共的类型;
-封装子类中的重复内容(成员变量和方法); -定义有抽象方法,子类虽然有不同的实现,但该方法的定义是一致的。
JAVA 基础课程-抽象类和接口
实现接口
• 接口可以作为一种类型声明变量,一个接口类型的变量可以引用实现了该接口的类的对象;
• 通过该变量可以调用该接口中定义的方法(具体的实现类提供了方法的实现)。 Runner runner = new AmericanCurl();
JAVA 基础课程-抽象类和接口
JAVA 基础课程-抽象类和接口
课堂练习:银联支付接口实现 • 银联接口,用于描述银联统一制定的规则,该接口提供检测密码方法,取钱方法以及查询余额方法。 • 工商银行接口,用于描述工商银行发行的卡片功能,在满足银联接口的规则基础上,增加了在线支付 功能。 • 农业银行接口,用于描述中国农业银行发行的卡片功能,在满足银联接口的规则基础上,增加了支付 电话费的功能。另外,农行的卡的卡内余额,允许最多透支2000 • 实现工商银行接口和农业银行接口,并进行测试
JAVA 基础课程-抽象类和接口
JAVA 基础课程-抽象类和接口
抽象方法和抽象类
• 由abstract修饰的方法为抽象方法,抽象方法只有方法的定义,没有方法体实现,用一个分号结尾;
• 一个类中如果包含抽象方法,该类应该用abstract关键字声明为抽象类;
• 如果一个类继承了抽象类,必须重写其抽象方法(除非该类也声明为抽象类)。 abstract class Shape{ private double c; public Shape(double c){ this.c =c; } public Shape(){ } public abstract double area(); }

abstract类的特点

abstract类的特点

abstract类的特点
abstract类是一种特殊的类,它具有以下特点:
1. abstract类不能被实例化,即不能创建abstract类的对象。

只能通过继承abstract类来创建子类对象。

2. abstract类可以包含抽象方法和非抽象方法。

抽象方法是没有具体实现的方法,只有方法的声明,没有方法体。

非抽象方法是有具体实现的方法。

3. 子类继承abstract类时,必须实现所有的抽象方法。

如果子类没有实现所有的抽象方法,那么子类也必须被声明为abstract类。

4. abstract类可以有构造方法,用于初始化abstract类的成员变量。

5. abstract类可以有成员变量和成员方法,这些成员变量和成员方法可以被子类继承和访问。

6. abstract类可以被其他类继承,同样可以继承其他类。

abstract类的特点是不能被实例化,包含抽象方法和非抽象方法,子类必须实现所有的抽象方法。

abstract类可以作为其他类的父类,提供基础的实现和接口。

接口 方法 abstract

接口 方法 abstract

接口方法abstract
接口(interface)是一种抽象数据类型,它定义了一组方法(method)的规范,但没有提供方法的具体实现。

接口可以作为一种契约,规定了类应该提供哪些方法,而不关心方法是如何实现的。

方法(method)是一段执行特定任务的代码。

在面向对象编程中,方法是定义在类(class)中的,用于操作类的实例对象或其它类成员。

方法可以定义在接口中,也可以定义在类中。

抽象(abstract)是一种特殊的类或方法的修饰符,表示该类或方法不能被实例化或调用。

抽象类(abstract class)是一个不能被实例化的类,它提供了一组抽象方法的定义,子类必须实现这些方法。

抽象方法(abstract method)是一个没有实现体的方法,它只能存在于抽象类或接口中。

抽象方法必须被子类实现或在实现接口的类中提供具体实现。

Java之关键字abstract(抽象类与抽象方法)

Java之关键字abstract(抽象类与抽象方法)

Java之关键字abstract(抽象类与抽象⽅法)/** abstract关键字的使⽤* 1.abstract:抽象的* 2.abstract可以⽤来修饰的结构:类、⽅法** 3. abstract修饰类:抽象类* > 此类不能实例化* > 抽象类中⼀定有构造器,便于⼦类实例化时调⽤(涉及:⼦类对象实例化的全过程)* > 开发中,都会提供抽象类的⼦类,让⼦类对象实例化,完成相关的操作*** 4. abstract修饰⽅法:抽象⽅法* > 抽象⽅法只有⽅法的声明,没有⽅法体* > 包含抽象⽅法的类,⼀定是⼀个抽象类。

反之,抽象类中可以没有抽象⽅法的。

* > 若⼦类重写了⽗类中的所有的抽象⽅法后,此⼦类⽅可实例化* 若⼦类没有重写⽗类中的所有的抽象⽅法,则此⼦类也是⼀个抽象类,需要使⽤abstract修饰*/public class AbstractTest {public static void main(String[] args) {//⼀旦Person类抽象了,就不可实例化// Person p1 = new Person();// p1.eat();}}abstract class Creature{public abstract void breath();}abstract class Person extends Creature{String name;int age;public Person(){}public Person(String name,int age){ = name;this.age = age;}//不是抽象⽅法:// public void eat(){//// }//抽象⽅法public abstract void eat();public void walk(){System.out.println("⼈⾛路");}}class Student extends Person{public Student(String name,int age){super(name,age);}public Student(){}public void eat(){System.out.println("学⽣多吃有营养的⾷物");}@Overridepublic void breath() {System.out.println("学⽣应该呼吸新鲜的没有雾霾的空⽓");}}。

java基础之抽象类和抽象方法

java基础之抽象类和抽象方法

java基础之抽象类和抽象⽅法Java 抽象类在⾯向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是⽤来描绘对象的,如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。

抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员⽅法和构造⽅法的访问⽅式和普通类⼀样。

由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使⽤。

也是因为这个原因,通常在设计阶段决定要不要设计抽象类。

⽗类包含了⼦类集合的常见的⽅法,但是由于⽗类本⾝是抽象的,所以不能使⽤这些⽅法。

在 Java 中抽象类表⽰的是⼀种继承关系,⼀个类只能继承⼀个抽象类,⽽⼀个类却可以实现多个接⼝。

抽象类在 Java 语⾔中使⽤ abstract class 来定义抽象类。

如下实例:/* ⽂件名 : Employee.java */public abstract class Employee{private String name;private String address;private int number;public Employee(String name, String address, int number){System.out.println("Constructing an Employee"); = name;this.address = address;this.number = number;}public double computePay(){System.out.println("Inside Employee computePay");return 0.0;}public void mailCheck(){System.out.println("Mailing a check to " + + " " + this.address);}public String toString(){return name + " " + address + " " + number;}public String getName(){return name;}public String getAddress(){return address;}public void setAddress(String newAddress){address = newAddress;}public int getNumber(){return number;}}注意到该 Employee 类没有什么不同,尽管该类是抽象类,但是它仍然有 3 个成员变量,7 个成员⽅法和 1 个构造⽅法。

抽象方法必须在抽象类中

抽象方法必须在抽象类中

2、关于被私有访问控制符 private 修饰的成员变量,以下说法正确的是(

A.可以被三种类所引用:该类自身、与它在同一个包中的其他类、在其他包中的该类的子

B.可以被两种类访问和引用:该类本身、该类的所有子类
C.只能被该类自身所访问和修改
D.只能被同一个包中的类访问
3、关于被保护访问控制符 protected 修饰的成员变量,以下说法正确的是(
一、 判断题 1、 抽象方法必须在抽象类中,所以抽象类中的方法都必须是抽象方法。 2、 Final 类中的属性和方法都必须被 final 修饰符修饰。 3、 最终类不能派生子类,最终方法不能被覆盖。 4、 子类要调用父类的方法,必须使用 super 关键字。 5、 一个 Java 类可以有多个父类。 6、 如果 p 是父类 Parent 的对象,而 c 是子类 Child 的对象,则语句 c = p 是正确的。 7、 一个类如果实现了某个接口,那么它必须重载该接口中的所有方法。 8、 接口是特殊的类,所以接口也可以继承,子接口将继承父接口的所有常量和抽象方法。 9、 子类的域和方法的数目一定大于等于父类的域和方法的数目。 10、 所谓静态初始化器就是在构造函数之前加上 static 修饰符 11、 在 java 中,一个类可同时定义许多同名的方法,这些方法,这些方法的形式参数的个
C、 public static int main(String[ ] arg)D、public void main(String ar] x = new int[25];后,以下哪项说明是正确的(

A、x[24]为 0 B、x[24]未定义
C、x[25]为 0 D、x[0]为空
C. abstract 方法必须在 abstract 类中

abstract关键字用法

abstract关键字用法

abstract关键字用法
abstract关键字用法有以下几种:
1. 抽象类的声明:在类的声明前加上abstract,表示该类是抽象类,不能直接实例化,只能被继承。

2. 抽象方法的声明:在方法的声明前加上abstract,表示该方法是抽象方法,没有具体的实现,需要子类去实现。

抽象方法没有方法体,用分号代替。

3. 抽象属性的声明:在成员变量的声明前加上abstract,表示该成员变量是抽象属性,没有具体的实现,需要子类去实现。

4. 接口的声明:接口中的所有方法默认都是抽象方法,所有成员变量默认都是public、static、final类型,可以不用声明为abstract。

5. 抽象类的继承:一个非抽象类可以继承一个抽象类,但必须实现该抽象类的所有抽象方法。

总的来说,abstract关键字的作用是定义抽象类、抽象方法或抽象属性,通过继承和实现来完成具体的操作。

抽象方法 可以有方法体

抽象方法 可以有方法体

抽象方法可以有方法体在Java中,抽象方法是指在父类中声明但没有实现的方法。

抽象方法是通过abstract关键字进行声明的,并且没有方法体。

抽象方法只能存在于抽象类或接口中。

抽象方法的存在主要是为了让子类进行继承和实现。

子类在继承抽象类或实现接口时,必须实现父类或接口中的所有抽象方法。

这样,抽象方法就充当了一种约束,保证了子类的一致性和完整性。

由于抽象方法没有方法体,因此它没有具体的实现,只是定义了方法的签名。

抽象方法的特点是:1. 没有方法体:抽象方法没有具体的实现,只有方法的声明。

例如,在抽象类中声明一个抽象方法:javapublic abstract void methodName();2. 必须被子类实现:抽象方法必须在子类中被实现,否则子类也必须声明为抽象类。

子类通过实现抽象方法来完成对父类的扩展。

例如,一个抽象类Animal 中声明了一个抽象方法eat(),那么所有继承自Animal的子类都必须实现eat()方法。

3. 可以有参数:抽象方法可以有参数,用于传递数据。

参数的类型和数量可以任意。

例如,声明一个带有参数的抽象方法:javapublic abstract void methodName(int param1, String param2);4. 可以有返回值:抽象方法也可以有返回值,返回值的类型可以是任意类型。

例如,声明一个带有返回值的抽象方法:javapublic abstract int methodName();尽管抽象方法本身没有方法体,但是在抽象类中可以有普通方法(非抽象方法)。

这些普通方法可以有方法体,并且可以在抽象类被实例化时被调用。

例如,在抽象类Animal中可以有一个普通方法:javapublic void sleep() {System.out.println("Animal is sleeping.");}这个普通方法可以被Animal类的子类继承和使用,而不需要重新实现。

abstract

abstract
//接口的内容
}
7)接口可以定义变量来引用实现类的对象。(接口的多态)
接口多态的体现:
a.接口可以作为变量来引用对象
b.接口可以作为参数来引用对象。
c.接口可以作为返回值来引用对象。
3)抽象类中的抽象方法也需要使用 修饰,同时,
不能存在方法体。
抽象方法:使用abstract关键字修饰的方法,
不能有方法体。
4)抽象类中不一定有抽象方法。有无抽象方法对
3)抽象类可以被抽象类和具体类所继承。
类也可以被抽象类和具体类所继承。
2.JavaBean规范:
1)什么是JavaBean规范?
缩写方式: int i=10;
4)接口中的方法:
public abstract 返回值 方法名(参数列表);
缩写方式: public 返回值 方法名(参数列表);
修饰符 class 类名 implements 接口1,接口2{
//类体
}
d.接口的特性:
1)接口不能实例化。
2)接口中包含的全部方法都是抽象方法。全部属性都是常量.
this.idCard = idCard;
this.balance = balance;
}
public String getIdCard() {
return idCard;
}
(根据名词中存在相同行为,根据is-a 关系去建立,
根据系统的重点研究对象来确定)
(2)定义接口
将所有的行为在接口中定义出来,形成规范和约束。
(3)建立实现类并且实现接口。
d.面向接口编程好处:
public void setIdCard(String idCard) {
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如何扩展这些设计呢?譬如说为Triangle和Circle添加erase方法?
如果是class Shape这样的设计,很简单,只要
abstract class Shape{
puabstract void reDraw();
public void erase(){
window.clean();
}
}
所有相关的代码,你都要修改!即便他们都做同样的事情!
这样扩展实在是太麻烦了!
你也许和我想的一样,定义接口本身的目的就是告诉大家,任何实现此接口的类,都有自己的实现方法!
我们定义接口的目的是:你们的实现可以不一样,但是你们暴露的接口一定要一致
可以举java类库当中的一个设计,Thread
public void reDraw(){...}
}
只不过现在子类Triangle,Circle和Shape之间的关系就不是父子了。
这样设计其实违背了常理,因为在我们的观念中,Triangle和Circle本来就应该是一种Shape
而不应该是他们都遵守一定的操作方式(void draw(),void reDraw())
abstract修饰符用来修饰类和成员方法
1:用abstract修饰的类表示抽象类,抽象类位于继承树的抽象层,抽象类不能被实例化。
2:用abstract修饰的方法表示抽象方法,抽象方法没有方法体。抽象方法用来描述系统具有什么功能,但不提供具体的实现。
abstract规则:
1:抽象类可以没有抽象方法,但是有抽象方法的类必须定义为抽象类,如果一个子类继承一个抽象类,子类没有实现父类的所有抽象方法,那么子类也要定义为抽象类,否则的话编译会出错的。
2.在设计的时候就应该认识到,实例化Shape是没有意义的,因为Shape本身只是一种抽象。现在别人如果拿来就可以实例化了,这样的操作方式违背了当初设计的意愿。而且会存在潜在的危险。(当前的实现可能看不出危险)
那么,如果把Shape定义成Interface呢?
当然可以
Interface Shape{
window.clean();
}
}
class Circle implements Shape{
public void draw(){...}
public void reDraw(){...}
public void erase(){
Window window=WindowContainer.getCurrentWindow();
Java中的abstract方法和abstract类的问题
当知道一个类的子类将不同的实现某个方法时,把该类声明为抽象类很有用,可以共用相同的父类方法,不必再定义。
抽象类和抽象方法的关系:含有抽象方法的类一定是抽象类,抽象类里不一定含有抽象方法。
抽象类存在的意义是用来被继承的。一个类继承了一个抽象类,必须实现抽象类里面所有的抽象方法,否则,此类也是抽象类。
其次,从意义上讲,如果继承一个抽象类,那么抽象类和它的子类就有父子关系,即有类的层次关系(这关系到类的设计问题)。
接口,在我看来,是一种契约或者协议,是一层提供给另一层的接口(可以想象成OSI各层之间的关系)
在某一层中有多个类协作实现这个层的功能,通过接口暴露出去。但这些类之间会有层次关系(is a,has a)
2:抽象类没有构造方法,也没有抽象静态方法。但是可以有非抽象的构造方法
3:抽象类不能被实例化,但是可以创建一个引用变量,类型是一个抽象类,并让它引用非抽象类的子类的一个实例
4:不能用final修饰符修饰
Q:java里面有抽象类么?和接口的区别是什么?
A:java中有抽象类,用关键字abstract修饰。
public void reDraw(){...}
}
当然你可以这样设计
class Shape{
public void draw(){}
public void reDraw(){}
}
这样设计有2个不妥之处:
1.不符合逻辑。Shape是你针对具体的事物(Triangle,Circle)抽象出来的。它定义的方法应该到子类中去实现
package com.pamigo.shp;
abstract class Shape{
public abstract void draw();
public abstract void reDraw();
public void erase(){
doErase();
Window window=WindowContainer.getCurrentWindow();
如果你要设计一个线程类,该怎么办?
两种方法:
//通过继承Thread类来实现
class MyThread extends Thread{
public void run(){}//覆盖Thread的run方法
}
//通过实现Runnable接口来实现
class MyThread implements Runnable{
public abstract void reDraw();
}
class Triangle extends Shape{
public void draw(){...}
public void reDraw(){...}
}
class Circle extends Shape{
public void draw(){...}
Q:一个方法加abstract和不加abstract有什么区别?就是说不加有什么关系?加了又会怎样?
A:一方法要是加abstract,那么这个方法就是抽象的,须由子类去实现
抽象方法必须在抽象类当中,也就是说,一个类只要有一个方法是抽象的,那么这个类就必须是抽象类
抽象类里面的方法不一定要抽象的,也可以全都不是抽象的
void draw();
void reDraw();
}
class Triangle implements Shape{
public void draw(){...}
public void reDraw(){...}
}
class Circle implements Shape{
public void draw(){...}
}
}
package com.pamigo.clnt;
class User{
public static void main(String[] args){
Shape shp=new Triangle();
shp.draw();
shp.erase();
}
}
//注意我的权限修饰符
我想表达的意思就是,对外界来说,User只能看到Shape的erase方法。
erase方法必须要做Window的清除工作,但为了给子类提供机会做自己的清除工作,所以设计了
protected abstract void doErase();
因为是protected权限,所以User是看不见的。
不管是Circle还是Triangle,都会有自己的doErase方法。并且他们都会在用户调用shp.erase();时被正确的调用
window.clean();
}
protected abstract void doErase();
}
class Triangle extends Shape{
public void draw(){...}
public void reDraw(){...}
protected void doErase(){
2>.抽象方法:有方法名的定义,没有实现,(只定义了能做什么,没定义怎么做)抽象方法的好处是允许方法的定义和实现分开。abstract class Animal{ public abstract void eat(); }抽象类和抽象方法的关系:含有抽象方法的类一定是抽象类,抽象类里不一定含有抽象方法抽象类存在的意义是用来被继承的。一个类继承了一个抽象类,必须实现抽象类里面所有的抽象方法,否则,此类也是抽象类。abstract class Animal{ public void run(){} public abstract void sleep(); public abstract void eat(); } class Dog extends Animal{ public void sleep(){ System.out.println("Dog sleep."); } public void eat(){ System.out.println("Dog eat."); } } abstract class Cat extends Animal{ public void eat(){ System.out.println("Cat eat."); } }
并且不用关心Window是如何被清除的!
这类似于一种回调函数的方式,你可以这么认为。
==========================================================================
abstract作为修饰符,可以修饰类和方法。
1>.抽象类:不能手动创建对象(JVM可以创建抽象类的对象),但是可以声明抽象类型的引用. public class TestAbstract1{ public static void main(String[] args){ //Animal a=new Animal(); //error Animal a=null; a=new Dog(); } } abstract class Animal{ } class Dog extends Animal{ }
相关文档
最新文档