抽象类中不能有private的成员_009抽象类,接口,类间关系,Object类,内部类

009-抽象类,接口,类间关系,Object类,内部类

  • (1)抽象类

  • (2)接口

  • (3)接口和抽象类的区别

  • (4)类之间的关系

  • (5)is-a、is-like-a、has-a

  • (6)Object类

  • (7)Object类里的方法

  • (8)==和equals()方法

  • (9)包

  • (10)import

  • (11)JDK常用开发包

  • (12)访问控制权限

  • (13)内部类

(1)抽象类

  • 在Java中采用abstract关键字定义的类就是抽象类,采用abstract关键字定义的方法就是抽象方法。
  • 抽象的方法只需在抽象类中,提供声明,不需要实现。
  • 如果一个类中含有抽象方法,那么这个类必须定义成抽象类;如果一个类是抽象的,并不要求有抽象方法。(即抽象类中可以没有抽象方法)
  • 如果这个类是抽象的,那么这个类被子类继承,抽象方法必须被重写。如果在子类中不复写该抽象方法,那么必须将此类再次声明为抽象类。
  • 抽象的类是不能实例化的。
  • 抽象类不能被final修饰。
  • 抽象方法不能被final修饰,因为抽象方法就是被子类实现的。

(2)接口

  • 在Java中接口采用interface声明
  • 接口中的方法默认都是public abstract的,不能更改
  • 接口中的变量默认都是public static final类型的,不能更改,所以必须显示的初始化
  • 接口不能被实例化,接口没有构造函数的概念
  • 接口之间可以继承,但接口之间不能实现
  • 接口中的方法只能通过类来实现,通过implements关键字
  • 如果一个类实现了接口,那么接口中所有的方法必须实现
  • 一个类可以实现多个接口,采用逗号隔开(间接实现了多继承)
  • 接口的作用:
  1. 采用接口明确的声明了它所能提供的服务;
  2. 解决了Java单继承问题;
  3. 实现了可接插性(重点)

(3)接口和抽象类的区别

  • 接口描述了方法的特征,不给出实现,一方面解决Java的单继承问题,实现了强大的可接插性;
  • 抽象类提供了部分实现,抽象类是不能实例化的,抽象类的存在主要是可以把公共的代码移植到抽象类中;
  • 面向接口编程,而不要面向具体编程(面向抽象编程,而不要面向具体编程);
  • 优先选择接口(因为继承抽象类后,此类将无法再继承,所以会丧失此类的灵活性)

(4)类之间的关系

  1. 泛化关系:类和类之间、接口和接口之间的继承关系。

    public class A{}
    public class B extends A{}

    public interface C{}
    public interface D extends C{}
  2. 实现关系:类对接口的实现。

    public interface E{}
    public class F implements E{}
  3. 关联关系:类与类之间的连接,一个类可以知道另一类的属性和方法,在Java语言中使用成员变量体现。

    public class S学生{
        private 班级 班级;
    }
    public class 班级{}
  4. 聚合关系:是关联关系的一种,是较强的关联关系,是整体和部分的关系,如:汽车和轮胎,它与关联关系不同,关联关系的类处在同一个层次上,而聚合关系的类处在不平等的层次上,一个代表整体,一个代表部分,在Java语言中使用实例变量体现。

    public class 汽车{
        private 轮胎集合 轮胎;
    }
    public class 轮胎{
        private 汽车 汽车;
    }
  5. 合成关系:是关系的一种,比聚合关系强的关联关系,如:人和四肢,整体对象决定部分对象的生命周期,部分对象每一时刻只与一个对象发生合成关系,在Java语言中使用实例变量体现。

    public class 人{
        private 四肢集合 四肢;
    }
    public class 四肢{
        private 人 人;
    }
  6. 依赖关系:依赖关系是比关系关系弱的关系,在Java语言中体现为返回值,参数,局部变量和静态方法的调用。

    public class Test{
        public static void main(String[] args){
            Person person = new Person();
        }
    }
    class Person{
    }

(5)is-a、is-like-a、has-a

  • is-a

    public class A{}
    public class B extends A{}
  • is-like-a

    public interface I{}
    public class A implements I{}
  • has-a

    public class A{
        private B b;
    }
    class B{
       
    }

(6)Object类

  • Object类是所有Java类的根基类
  • 如果在类的声明中未使用extends关键字指明其基类,则默认基类为Object类

(7)Object类里的方法

  • toString():返回该对象的字符串表示。通常toString方法会返回一个“以文本方式表示”此对象的字符串,Object类的toString方法返回一个字符串,该字符串有类名加标记@和此对象哈希码的无符号十六进制表示组成,源码如下

    getClass().getName()+'@'+Integer.toHexString(hashCode())

    在进行String与其他类型数据的连接操作时,如:System.out.println(student);,它自动会调用该对象的toString()方法。用户自定义类建议重写toString()方法

  • finalize():

    垃圾回收器(GC),主要有以下特点:

    当垃圾回收器将要收集某个垃圾对象将会调用finalize,建议不要使用此方法,因为此方法的运行时间不确定,是否运行也不确定,如果执行此方法出现错误,程序不会报告,仍然继续运行。

  1. 当对象不再被程序使用时,垃圾回收器将会将其回收;
  2. 垃圾回收是在后台运行的,我们无法命令垃圾回收器马上回收资源,但是我们可以告诉他,尽快回收资源(System.gc()和Runtime.getRuntime().gc());
  3. 垃圾回收器在回收某个对象的时候,首先会调用该对象的finalize方法;
  4. GC主要针对堆内存
  5. 单例模式的缺点

(8)==和equals()方法

  • 等号 “==”:等号可以比较基本类型和引用类型,等号比较的是值,特别是比较引用类型,比较的是引用的内存地址。
  • equals()方法一般比较的是引用对象具体的内容,String类已经重写了equals方法,用户自定的类默认使用Object类的equals()方法比较的是值,建议重写equals()方法,从而达到比较引用对象里面的内容的目的。

(9)包

  • 包其实就是目录,特别是项目比较大,java文件特别多的情况下,我们应该分目录管理,在java中称为分包管理,包名称通常采用小写。
  • 包最好采用小写字母
  • 包命名一般采用公司网站的逆序
  • 除了注释以外,package必须放到所有语句的第一行

(10)import

  • 采用import关键字引入需要使用的类
  • 可以采用 * 通配符引入包下的所有类,不建议使用(不明确)

(11)JDK常用开发包

  • java.lang,此包Java语言标准包,使用此包中的内容无需import
  • java.sql,提供了JDBC接口类
  • java.util,提供了常用工具类
  • java.io,提供了各种输入输出流

(12)访问控制权限

java访问级别修饰符主要包括:private、protected和public,可以限定其他类对该类、属性和方法的使用权限。

修饰符类的内部同一个包里子类任何地方
private
default
protected
public

注意以上对类的修饰符只有public和default,内部类除外。

(13)内部类

内部类:一个类的内部定义的类,称为内部类。

可分为:

  • 实例内部类

    • 实例内部不能定义static成员,只能定义实例成员。
    • 创建实例内部类,外部类的实例必须已经创建;(要用它的话,它的外部类的实例必须已经创建)
    • 实例内部类会持有外部类的引用;
  • 局部内部类

    • 局部内部类是在方法中定义的,它只能在当前的方法中使用。和局部变量的作用一样,局部内部类和实例内部类一致,不能包含静态变量。

    • 局部变量,在局部内部类中使用必须采用final修饰。

      public class Test{
          private int a = 100;
          //局部变量,在局部内部类中使用必须采用final修饰。
          public void method(final int temp){
              class Inner{
                  int i1=10;
                  //可以访问外部类的成员变量
                  int i2=a;
                  
                  int i3=temp;
              }
          }
      }
  • 静态内部类

    • 静态内部类可以定义静态变量和实例变量。
    • 静态内部类不会持有外部的类的引用,创建时可以不用创建外部类;
    • 静态内部类可以访问外部的静态变量,如果访问外部类的成员变量必须通过外部类的实例访问。
  • 匿名内部类

    • 是一种特殊的内部类,该类没有名字。

6640ab1816c987e11b10e692a6a23157.png

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值