零基础java自学流程-Java语言进阶41

559 篇文章 0 订阅
546 篇文章 0 订阅

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() {
            @Override
            public void method(int a) {
                System.out.println("实例化抽象类");
            }
        };
        System.out.println(abstractClass.constInt);
        abstractClass.method(5);
    }
}

//运行结果
/*
  5
  实例化抽象类
*/

在这个抽象类中,我添加了一个实例属性、一个抽象方法和该抽象方法的重载实例方法,所有这些都是合法的。

在main方法中,使用new操作符直接实例化抽象类,IDE会意外地直接提示该操作符——生成一个Anonymous Inner类。

下面是关于匿名内部类需要了解的一些事情:

一个特殊的局部内部类,没有类名,没有类关键字,也没有extends和implements关键字的修改。

匿名内部类不能是抽象的(也就是说,不能有抽象方法),必须实现其抽象超类或接口的所有抽象方法。

因为没有类名,匿名内部类只能使用一次,通常是为了简化代码编写。

使用匿名内部类的先决条件是继承父类或实现接口。

new操作符用于指定继承哪个父类或实现哪个接口。(事实上,new直接调用构造函数。New是一个非常酷的操作符),然后通过直接定义类主体(实现某些方法)来构建新类的实例。

因此,在上面的代码中,我生成了一个新的匿名内部类的实例,它继承了AbstractClass,实现了父类的抽象方法方法,将实例赋值给AbstractClass,并从实例调用新方法(int 5)方法。

二、抽象类与抽象方法

  抽象方法只有方法声明,没有方法体的方法。它将由子类(可能是抽象类,也可能是非抽象类)进行实现。

  通过上面空的抽象类的方法可知,拥有一个抽象方法并不是构建一个抽象类充分必要条件。

  那么,一个有抽象方法的普通类是合法的吗?大概率是不合法的,因为如果这样的设计是合法的又有什么意义呢?

  实际上,如果我们在一个非抽象类中定义一个抽象方法,IDE会提示:

  “Abstract method in non-abstract class”

  而如果我们一定要运行如下所示的一段错误代码: 

public class AbstractTest {

    public abstract void test();

    public static void main(String[] args) {
        
    }
}

编译器的错误信息是:

错误:Java: AbstractTest不是抽象的,并且没有覆盖biguo classConstruct。abstract test()中的抽象方法

所以抽象方法只能存在于抽象类中。

抽象方法可以是静态的吗?

在接下来的测试中,我想到了一个有趣的问题。抽象类中的抽象方法可以是静态的吗?

错误:Java:无效的修饰符组合:抽象和静态。错误:Java:无效的修饰符组合:abstract和static

public abstract class AbstractTest {
 //非法的修饰符组合
    public static abstract void test();

    public static void main(String[] args) {
        
    }
}

静态成员方法意味着可以(在类内部或通过类)使用它们,而不需要实例化。但是,也可以从实例中访问它,并且没有错误,但是IDE会发出警告,因为它违反了静态的设计语义;

抽象方法意味着没有方法主体,也就是说,只有一个需要由子类实现的方法声明。

我们需要意识到我们可以在抽象类中拥有静态方法。例如,如果我们把main方法放在一个抽象类中,我们的程序就可以从它运行。

在这种情况下,静态抽象方法的组合对这个抽象类没有任何意义。因为它没有方法主体,所以不能被类使用。

允许这样一个“静态抽象”方法是完全可以接受的,因为在一个非抽象子类中,实现抽象方法的子方法仍然是静态的,即子类的类方法。

这个语句有一点意义,但它仍然没有解决的是“静态抽象”方法对父类的“静态”语义的违背

静态方法可以被子类覆盖吗?

答案是:静态方法不能被子类覆盖。(包括重写定义)

但是!实际上,我们可以在子类中重新定义与它的静态父方法test()完全相同的方法。

package biguo.classConstruct;

public class AbstractTest {

    public static  void test(){
        System.out.println("This is AbstractTest's static test!");
    }

    public static  void print(){
        System.out.println("This is AbstractTest's static print!");
    }

    public static void main(String[] args) {
        AbstractTest.test();
        AbstractTestSon.test();
        AbstractTestSon.print();
        System.out.println();

        AbstractTestSon abstractTestSon=new AbstractTestSon();
        abstractTestSon.print();
        abstractTestSon.test();
    }
}

class AbstractTestSon extends AbstractTest{
    public static void test(){
        System.out.println("This is AbstractTest-Son's static test!");
    }
}


//输出
/*
This is AbstractTest's static test!
This is AbstractTest-Son's static test!
This is AbstractTest's static print!

This is AbstractTest's static print!
This is AbstractTest-Son's static test!
*/

通过输出结果可以看到:父类中未被子类重写的static方法是可以被子类及其对象访问到的,但是被子类重写过的方法,则子类及其对象只能调用自己的方法了。

  为什么这种情况不能叫做子类“重写”了父类的方法呢,而是叫”方法隐藏(method hidding)“?

因为,方法重写(Overriding)是OOP语言的一种特性,在Java中,它是实现“运行时多态”一种方式!!而父类子类的相同签名的同名方法的情况,there won’t be any run-time polymorphism。

4. 抽象类的继承

如果抽象父类不能实现所有的抽象方法,则派生自抽象父类的子类也必须声明为抽象。

抽象类可以定义可以被构造函数中的子类调用的构造函数。

可声明为抽象的非抽象类的子类。

五、定与抽象的矛盾

最后一个关键字可以修改类、方法和变量。

最终修改的类不能派生;最后一个修饰符方法禁止重写子类。

由此可见,定义性和抽象性是不相容的


想要系统学习JAVA推荐JAVA300集

Java300集零基础适合初学者视频教程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 韩顺平的《零基础30天学会Java》课件是一套系统而又实用的教学材料。这套课件以初学者为主要对象,强调零基础入门,并通过30天的学习程,全面而有条理地介绍了Java编程语言基础知识和应用技巧。 《零基础30天学会Java》课件的特点之一是逻辑清晰。作者将Java学习过程划分为不同的段,每天的学习内容都有明确的目标和自测题,帮助学习者系统地掌握所学知识。同时,课件中的例子和实战项目贴近实际应用,有助于理解和巩固概念。 其次,课件内容详尽且易于理解。韩顺平老师以简明的语言和图文并茂的方式,解释了Java的基本语法、常用类库、面向对象编程等重要概念。每一部分都有大量的示例代码和实践项目,让学习者能够动手实践,并且从中积累经验。 此外,该课件注重实践与实用。通过大量的案例和项目实践,学习者能够快速掌握Java编程的常见应用场景,例如图形界面编程、网页开发和数据库操作等。这种实践导向的学习方式可以培养学习者的编程实力和解决实际问题的能力。 总而言之,《零基础30天学会Java》课件是一套针对初学者设计的优质教学材料。其逻辑清晰、内容详尽且易于理解,注重实践与实用,能够帮助学习者快速掌握Java编程的基本知识和技巧。无论是在学校学习还是自学过程中,这套课件都是一份有价值的参考资料。 ### 回答2: 韩顺平的《零基础30天学会Java》课件是一套帮助初学者快速入门Java编程的教材。这套课件以通俗易懂的方式讲解了Java基础知识和常用编程技巧,并通过大量的实例和练习帮助学员巩固所学内容。 课件内容涵盖了Java的基本语法、数据类型、流程控制、面向对象编程、异常处理、文件操作等方面的知识。每个知识点都有配套的示例代码和详细的解释,帮助学员理解并掌握相关概念和技巧。 《零基础30天学会Java》课件的特点在于它的简洁明了和循序渐的教学方式。韩顺平老师注重培养学员的实际编程能力,因此课件中的每个例子都非常实用,并且通过逐步增加难度的方式帮助学员逐步提高自己的编程能力。 此外,课件还包含了丰富的练习题和编程实践,让学员可以在实际操作中巩固所学知识并提高编程技能。通过反复练习,学员能够更加深入地理解Java编程思想,掌握常见的编程技巧和解决问题的方法。 总之,韩顺平的《零基础30天学会Java》课件是一套很好的教学资料,适合零基础的学员入门Java编程。通过系统学习和实践,学员能够在短时间内掌握Java基础知识和编程技巧,为一步提升自己的编程能力奠定良好的基础。 ### 回答3: 《韩顺平零基础30天学会Java课件》是一套由韩顺平编写的培训资料,旨在为零基础的学习者提供一种快速掌握Java编程技能的方法。 该课件以初学者的视角出发,采用了简单易懂的语言和生动具体的案例,帮助学习者快速理解和掌握Java编程的基本概念和语法。 课件内容通常包括以下方面: 1. Java语言基础知识:介绍Java编程语言的特点、发展历史、环境配置等,为学习者建立起对Java的整体认识。 2. Java核心技术:讲解Java语言的基本语法、数据类型、运算符等,帮助学习者打下扎实的编程基础。 3. 面向对象编程:引导学习者了解面向对象的思想和编程方法,包括类、对象、继承、封装、多态等概念和应用。 4. Java常用类库:介绍Java中常用的类库,如集合类、IO类、异常处理等,为学习者提供编程的基础工具。 5. GUI编程:帮助学习者掌握Java的图形用户界面编程方法,包括Swing和AWT等相关知识。 通过《韩顺平零基础30天学会Java课件》,学习者可以在较短的时间内系统地学习和掌握Java编程的基本技能。韩顺平老师讲解深入浅出,注重实践练习,为学习者提供了一个快速入门的平台,帮助他们尽快掌握Java编程,提升编程能力。 这套课件适用于零基础的学习者,尤其适合那些想要从事软件开发、移动应用开发等相关岗位的求职者。不仅可以作为自学的教材,也可以作为培训机构的教学资料。无论是自学还是参加培训课程,学习者都可以通过该课件迅速掌握Java编程技能,为自己的职业发展打下坚实的基础

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值