java基础-不同的类与接口

参考文章:

  1. 接口相关:https://blog.csdn.net/qq_19782019/article/details/80259836
  2. 默认方法:https://www.cnblogs.com/sidesky/p/9287710.html

1.抽象类

  1. 定义:作为一个不能实例化,只能作为父类被继承的类,抽象类其实就是从多个具体的类中抽象出来的,具有更高层次的抽象。

  2. 特点:

  • 抽象的方法只作声明,不包含实现,可以看成没有实现的虚函数。
  • 抽象类不可以被实例化
  • 抽象类不是必须需要抽象方法,也就是你可以在抽象类中写任何普通的方法,但是一旦你的类中包含了抽象方法,则这个类必须是抽象类,否则会报错。
  • 具体派生类必须重写基类的抽象方法
  • 抽象的派生类可以不覆盖抽象的父类的抽象方法,如果不覆盖,其具体的派生类也必须覆盖这些方法。

2. 接口

  1. 定义:接口可以理解为一种特殊的类,里面全部是由全局常量和公共的抽象方法所组成。接口是解决Java无法使用多继承的一种手段,但是接口在实际中更多的作用是制定标准的。或者我们可以直接把接口理解为100%的抽象类,既接口中的方法必须全部是抽象方法。(JDK1.8之前可以这样理解,JDK1.8后出现了默认方法,便于解耦
  2. 特点:
  • 不可实例化
  • 一个类可以实现多个接口
  • 一个接口可以继承多个接口
  • 接口里的属性字段是默认public static final修饰的,接口的方法都是==public abstract ==修饰的。
  1. 注意点:
  • 接口的标识用法: 虽然接口内部定义了一些抽象方法,但是并不是所有的接口内部都必须要有方法,比如Seriallizable接口

3.抽象类与接口的区别

  1. 接口的特点:
  • 接口只能包含方法声明

  • 接口的成员包含方法,属性,索引器,事件

  • 接口中不能包含变量,字段,构造和构析函数,静态方法。

  • jdk8后可以添加默认方法

默认方法相关

  1. 作用:为了使接口和实现类的耦合度降低
  2. 继承:
  • 接口默认方法的继承分三种情况(分别对应上面的 InterfaceB 接口、InterfaceC 接口和 InterfaceD 接口):
  • 不覆写默认方法,直接从父接口中获取方法的默认实现。
  • 覆写默认方法,这跟类与类之间的覆写规则相类似。
  • 覆写默认方法并将它重新声明为抽象方法,这样新接口的子类必须再次覆写并实现这个抽象方法。
    https://blog.csdn.net/u010003835/article/details/76850242
  • .默认方法例子
interface InterfaceA {
    default void foo() {
        System.out.println("InterfaceA foo");
    }
}

class ClassA implements InterfaceA {
}

public class Test {
    public static void main(String[] args) {
        new ClassA().foo(); // 打印:“InterfaceA foo”
    }
}
  1. 抽象和接口区别
  • 抽象类可以拥有构造方法

  • 抽象类可以有普通方法成员

  • 抽象类可以包含静态方法

  • 一个类可以实现多个接口,只能继承一个类

  • 如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现。在抽象类的子类中实现接口中方法

  1. 相同点
  • 都可以被继承(类继承类,接口可以继承接口)
  • 都不可以被实例化
  • 都可以包含方法声明
  • 派生类必须实现未实现的方法

4. 各种修饰符

4.1final 修饰符
  • 修饰类:不能被继承
  • 修饰方法:不能被重写
  • 修饰变量:初始化赋值,则不可以被改变。
4.2static修饰符

1.与实例对象的区别

  • 在程序运行时:实例对象属于某个对象的属性,必须创建了实例对象,其中的实例变量才会分配空间,才能使用这个实例变量,静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只有程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,然后直接使用。

  • 内存的区别:
    静态变量位于方法区,被类的所有实例共享,静态变量可以直接通过类名进行访问,其生命周期取决于类的生命周期。
    实例变量取决于类的实例,每创建一个实例,jvm就会为实例变量分配一次内存,实例变量位于堆区中,其生命周期取决于实例的生命周期。

  • 方法声明为static时,具体有如下限制:
    1):只能调用static方法和使用static属性
    2):不能使用关键字this或super
    3):static代码块将被只执行一次。

首先Java的static类只能是静态内部类。如果在外部类声明为static,程序会编译通不过
静态内部类不能访问外部类的实例成员,只能访问外部类的类成员
其次,主要了解下static内部类与普通内部类的区别是什么,以及static内部类的作用是什么,详见下表:

在这里插入图片描述

4.3. 访问修饰符

https://www.nowcoder.com/test/question/done?tid=27458807&qid=56132#summary(很全面)

  • public:共有访问。对所有的类都可见。
  • protected:保护型访问。对同一个包可见,对不同的包的子类可见
  • default:默认访问权限。只对同一个包可见,注意对不同的包的子类不可见
  • private:私有访问。只对同一个类可见,其余都不见。

5.内部类

作用:

  1. 内部类提供了更加好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类
  2. 内部类成员可以直接访问外部类的私有数据,因为内部类被当成其外部类的成员,同一个类可以相互访问,但外部类不能访问内部类的实现细节,例如内部类的成员变量
  3. 匿名内部类适用于创建那些仅需要一次适用的类

6.匿名内部类

参考文章:https://blog.csdn.net/hellocsz/article/details/81974251

举三个例子,分别说明没有使用匿名内部类,和使用匿名内部类实现接口和抽象类的情况

//定义一个抽象类
abstract class Person {
    public abstract void eat();
}

//定义一个接口类
interface Person1 {
    public void eat();
}

class Child extends Person {
    public void eat() {
       System.out.println("eat something");
    }
}

public class Demo {
    public static void main(String[] args) {
   /**
	一.不使用匿名内部类
	必须继承类或实现接口
	*/
        Person p = new Child();
        p.eat();
	/**
	二,实现接口
	*/
	Person1 p1 = new Person1() {
            public void eat() {
                System.out.println("eat something");
            }
        };
        p1.eat();
	
	/**
	三,实现类
	*/
		Person p = new Person() {
            public void eat() {
                System.out.println("eat something");
            }
        };
        p.eat();
    }
}

7. 父子类构造函数的调用顺序

首先是父类的静态变量,然后是子类的静态变量,然后是父类非静态变量,父类构造函数,子类非静态变量,子类构造函数

package com.web;
/**
 * 功能说明:TODO
 *
 * @date 2019年5月8日
 * @author 马琳-君子自强,脚踏实地积累
 * @email 1217575485@qq.com
 *
 */
public class Abc {
    public static void main(String[] args) {
        SubClass subClass = new SubClass();
        System.out.println(subClass.field);
    }
}

class ParentClass {
    static String a="静态父类成员";

    static void get(){
        System.out.println("加载父类静态代码块");
    }

    String field = "父类变量";

    public ParentClass() {
        System.out.println("加载父类构造方法");
    }
}

class SubClass extends ParentClass {
    static String a="静态子类成员";

    static void get(){
        System.out.println("加载父类静态代码块");
    }


    String field = "子类变量";

    public  SubClass(String field) {
        System.out.println("加载子类构造方法2");
    }
    public SubClass( ) {
        System.out.println("加载子类构造方法");

    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用介绍 9-2 StringBuffer和String Builder 9-3 Rintime的使用 9-4 日期简介 9-5 java程序国际化的实现 9-6 Random和Math 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分 10-8 自定义异常 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现 11-4 List接口实现 11-5 Map接口 11-6 Collections 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合的同步问题 12-6 用Timer调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注型 16-3 自定义标注型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值