• 抽象类

    • 一个class定义了方法,但没有具体执行代码,这个方法就是抽象方法,抽象方法用abstract修饰。因为抽象类本身被设计成只能用于被继承,因此,抽象类可以强迫子类实现其定义的抽象方法,否则编译会报错。因此,抽象方法实际上相当于定义了“规范”。
    • 抽象方法的类都是抽象类,抽象类不全是抽象方法。
    • 面向抽象编程的本质就是:

      • 上层代码只定义规范(例如:abstract class Person);

      • 不需要子类就可以实现业务逻辑(正常编译);

      • 具体的业务逻辑由不同的子类实现,调用者并不关心。

  • 接口
    • 如果一个抽象类没有字段,且所有方法全部都是抽象方法,就可以把该抽象类改写为接口:interface。
    • 接口中属性默认public static final 修饰  方法默认public abstract修饰
    • 一个具体的class去实现一个interface时,需要使用implements关键字。
    • 一个类可以实现多个interface。
    • 一个interface可以继承自另一个interface。interface继承自interface使用extends,它相当于扩展了接口的方法。

      1 interface Hello {
      2 void hello();
      3 }
      4
      5 interface Person extends Hello {
      6 void run();
      7 String getName();
      8 }
  • 包
    • 在Java虚拟机执行的时候,JVM只看完整类名,因此,只要包名不同,类就不同。
    • 包没有父子关系。java.util和java.util.zip是不同的包,两者没有任何继承关系。
    • 位于同一个包的类,可以访问包作用域的字段和方法。不用public、protected、private修饰的字段和方法就是包作用域。
    • import

      • 直接写出完整类名 mr.jun.Arrays arrays = new mr.jun.Arrays();
      • 用import语句,导入Arrays,然后写简单类名。  
         1 // Person.java
        2 package ming;
        3
        4 // 导入完整类名:
        5 import mr.jun.Arrays;
        6
        7 public class Person {
        8 public void run() {
        9 Arrays arrays = new Arrays();
        10 }
        11 }
      • import static 包名 ,它可以导入一个类的静态字段和静态方法。

         1 package main;
        2
        3 // 导入System类的所有静态字段和静态方法:
        4 import static java.lang.System.*;
        5
        6 public class Main {
        7 public static void main(String[] args) {
        8 // 相当于调用System.out.println(…)
        9 out.println("Hello, world!");
        10 }
        11 }
      • 如果是简单类名,按下面的顺序依次查找:

        • 查找当前package是否存在这个class;

        • 查找import的包是否包含这个class;

        • 查找java.lang包是否包含这个class。

      •  因此,编写class的时候,编译器会自动帮我们做两个import动作:
        • 默认自动import当前package的其他class;

        • 默认自动import java.lang.*。

        • 自动导入的是java.lang包,但类似java.lang.reflect这些包仍需要手动导入。
        • 如果有两个class名称相同,例如,mr.jun.Arrays和java.util.Arrays,那么只能import其中一个,另一个必须写完整类名。
  • 内部类
    • 普通类有个最大的不同,就是Inner Class的实例不能单独存在,必须依附于一个Outer Class的实例。

       1 public class Main {
      2 public static void main(String[] args) {
      3 Outer outer = new Outer("Nested"); // 实例化一个Outer
      4 Outer.Inner inner = outer.new Inner(); // 实例化一个Inner
      5 inner.hello();
      6 }
      7 }
      8
      9 class Outer {
      10 private String name;
      11
      12 Outer(String name) {
      13 this.name = name;
      14 }
      15
      16 class Inner {
      17 void hello() {
      18 System.out.println("Hello, " + Outer.this.name);
      19 }
      20 }
      21 }
    • Inner Class和普通Class相比,除了能引用Outer实例外,还有一个额外的“特权”,就是可以修改Outer Class的private字段,因为Inner Class的作用域在Outer Class内部,所以能访问Outer Class的private字段和方法。(Inner Class除了有一个this指向它自己,还隐含地持有一个Outer Class实例,可以用Outer.this访问这个实例。)
    • 匿名内部类
      •   不需要在Outer Class中明确地定义这个Class,而是在方法内部,通过匿名类(Anonymous Class)来定义。

         1 public class Main {
        2 public static void main(String[] args) {
        3 Outer outer = new Outer("Nested");
        4 outer.asyncHello();
        5 }
        6 }
        7
        8 class Outer {
        9 private String name;
        10
        11 Outer(String name) {
        12 this.name = name;
        13 }
        14
        15 void asyncHello() {
        16 Runnable r = new Runnable() { //重写父类或者接口的方法
        17 @Override
        18 public void run() {
        19 System.out.println("Hello, " + Outer.this.name);
        20 }
        21 };
        22 new Thread(r).start();
        23 }
        24 }
    •   静态内部类
      •  1 public class Main {
        2 public static void main(String[] args) {
        3 Outer.StaticNested sn = new Outer.StaticNested(); //外部类无需实例化
        4 sn.hello();
        5 }
        6 }
        7
        8 class Outer {
        9 private static String NAME = "OUTER";
        10
        11 private String name;
        12
        13 Outer(String name) {
        14 this.name = name;
        15 }
        16
        17 static class StaticNested {
        18 void hello() {
        19 System.out.println("Hello, " + Outer.NAME);
        20 }
        21 }
        22 }
      • 用static修饰的内部类和Inner Class有很大的不同,它不再依附于Outer的实例,而是一个完全独立的类,因此无法引用Outer.this,但它可以访问Outer的private静态字段和静态方法。如果把StaticNested移到Outer之外,就失去了访问private的权限。
  • classpath和jar

    • classpath和jar
    • 图1
    • 图2 
  • 模块
  • 多态 
    • 在继承关系中,子类如果定义了一个与父类方法签名完全相同的方法,被称为覆写(Override)。
    • Java的实例方法调用是基于运行时的实际类型的动态调用,而非变量的声明类型。(多态)
    • public void runTwice(Person p) {
      p.run();
      p.run();
      }

      它传入的参数类型是Person,我们是无法知道传入的参数实际类型究竟是Person,还是Student,还是Person的其他子类,因此,也无法确定调用的是不是Person类定义的run()方法。

  • 覆写Object方法

    • toString():把instance输出为String;
    • equals():判断两个instance是否逻辑相等;Java equals方法学习
    • hashCode():计算一个instance的哈希值。
  • 在子类的覆写方法中,如果要调用父类的被覆写的方法,可以通过super来调用。
    class Person {
    protected String name;
    public String hello() {
    return "Hello, " + name;
    }
    } Student extends Person {
    @Override
    public String hello() {
    // 调用父类的hello()方法:
    return super.hello() + "!";
    }
    }
  • 方法标记为final。用final修饰的方法不能被Override:
  • 类本身标记为final。用final修饰的类不能被继承:
  • 用final修饰的字段(包括局部变量)在初始化后不能被修改。
    • 可以在构造方法中初始化final字段123

      1 class Person {
      2 public final String name;
      3 public Person(String name) {
      4 this.name = name;
      5 }
      6 }
  • 抽象类

    • 一个class定义了方法,但没有具体执行代码,这个方法就是抽象方法,抽象方法用abstract修饰。因为抽象类本身被设计成只能用于被继承,因此,抽象类可以强迫子类实现其定义的抽象方法,否则编译会报错。因此,抽象方法实际上相当于定义了“规范”。
    • 抽象方法的类都是抽象类,抽象类不全是抽象方法。
    • 面向抽象编程的本质就是:

      • 上层代码只定义规范(例如:abstract class Person);

      • 不需要子类就可以实现业务逻辑(正常编译);

      • 具体的业务逻辑由不同的子类实现,调用者并不关心。

  • 接口
      • 如果一个抽象类没有字段,且所有方法全部都是抽象方法,就可以把该抽象类改写为接口:interface。
      • 接口中属性默认public static final 修饰  方法默认public abstract修饰
      • 一个具体的class去实现一个interface时,需要使用implements关键字。
      • 一个类可以实现多个interface。
      • 一个interface可以继承自另一个interface。interface继承自interface使用extends,它相当于扩展了接口的方法。
  • 包
      • 在Java虚拟机执行的时候,JVM只看完整类名,因此,只要包名不同,类就不同。
      • 包没有父子关系。java.util和java.util.zip是不同的包,两者没有任何继承关系。
      • 位于同一个包的类,可以访问包作用域的字段和方法。不用public、protected、private修饰的字段和方法就是包作用域。
      • import

        • 直接写出完整类名 mr.jun.Arrays arrays = new mr.jun.Arrays();
        • 用import语句,导入Arrays,然后写简单类名。  
           1 // Person.java
          2 package ming;
          3
          4 // 导入完整类名:
          5 import mr.jun.Arrays;
          6
          7 public class Person {
          8 public void run() {
          9 Arrays arrays = new Arrays();
          10 }
          11 }
        • import static 包名 ,它可以导入一个类的静态字段和静态方法。

           1 package main;
          2
          3 // 导入System类的所有静态字段和静态方法:
          4 import static java.lang.System.*;
          5
          6 public class Main {
          7 public static void main(String[] args) {
          8 // 相当于调用System.out.println(…)
          9 out.println("Hello, world!");
          10 }
          11 }
        • 如果是简单类名,按下面的顺序依次查找:

          • 查找当前package是否存在这个class;

          • 查找import的包是否包含这个class;

          • 查找java.lang包是否包含这个class。

        •  因此,编写class的时候,编译器会自动帮我们做两个import动作:
          • 默认自动import当前package的其他class;

          • 默认自动import java.lang.*。

          • 自动导入的是java.lang包,但类似java.lang.reflect这些包仍需要手动导入。
          • 如果有两个class名称相同,例如,mr.jun.Arrays和java.util.Arrays,那么只能import其中一个,另一个必须写完整类名。

内部类

      • 普通类有个最大的不同,就是Inner Class的实例不能单独存在,必须依附于一个Outer Class的实例。

         1 public class Main {
        2 public static void main(String[] args) {
        3 Outer outer = new Outer("Nested"); // 实例化一个Outer
        4 Outer.Inner inner = outer.new Inner(); // 实例化一个Inner
        5 inner.hello();
        6 }
        7 }
        8
        9 class Outer {
        10 private String name;
        11
        12 Outer(String name) {
        13 this.name = name;
        14 }
        15
        16 class Inner {
        17 void hello() {
        18 System.out.println("Hello, " + Outer.this.name);
        19 }
        20 }
        21 }
      • Inner Class和普通Class相比,除了能引用Outer实例外,还有一个额外的“特权”,就是可以修改Outer Class的private字段,因为Inner Class的作用域在Outer Class内部,所以能访问Outer Class的private字段和方法。(Inner Class除了有一个this指向它自己,还隐含地持有一个Outer Class实例,可以用Outer.this访问这个实例。)
      • 匿名内部类
        •   不需要在Outer Class中明确地定义这个Class,而是在方法内部,通过匿名类(Anonymous Class)来定义。

           1 public class Main {
          2 public static void main(String[] args) {
          3 Outer outer = new Outer("Nested");
          4 outer.asyncHello();
          5 }
          6 }
          7
          8 class Outer {
          9 private String name;
          10
          11 Outer(String name) {
          12 this.name = name;
          13 }
          14
          15 void asyncHello() {
          16 Runnable r = new Runnable() { //重写父类或者接口的方法
          17 @Override
          18 public void run() {
          19 System.out.println("Hello, " + Outer.this.name);
          20 }
          21 };
          22 new Thread(r).start();
          23 }
          24 }
      •   静态内部类
        •  1 public class Main {
          2 public static void main(String[] args) {
          3 Outer.StaticNested sn = new Outer.StaticNested(); //外部类无需实例化
          4 sn.hello();
          5 }
          6 }
          7
          8 class Outer {
          9 private static String NAME = "OUTER";
          10
          11 private String name;
          12
          13 Outer(String name) {
          14 this.name = name;
          15 }
          16
          17 static class StaticNested {
          18 void hello() {
          19 System.out.println("Hello, " + Outer.NAME);
          20 }
          21 }
          22 }
        • 用static修饰的内部类和Inner Class有很大的不同,它不再依附于Outer的实例,而是一个完全独立的类,因此无法引用Outer.this,但它可以访问Outer的private静态字段和静态方法。如果把StaticNested移到Outer之外,就失去了访问private的权限。
  • classpath和jarclasspath和jar

Java学习_面向对象编程的更多相关文章

  1. Java学习之==>面向对象编程 Part2

    一.封装 封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别:将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结 ...

  2. JAVA学习:面向对象编程

    "算法+数据结构=程序"是一句经典名言,这句话很直接的说明了程序的本质:处理数据.产生结果.即便是最简单的HelloWorld程序,我们也可以将字符串"HelloWorl ...

  3. Java学习day7面向对象编程1-对象和类

    一.Java编程中对象和类的概念 1,什么是类? 答:类是客观存在的,抽象的,概念的东西. 2,什么是对象? 答:对象是具体的,实际的,代表一个事物.例如:车是一个类,汽车,自行车就是他的对象. 关于 ...

  4. Java学习之==>面向对象编程 Part1

    一.面向对象与面向过程 1.面向过程 角度是功能,以方法为最小单位,思考的是具体怎么做. 2.面向对象 角度是抽象,以类为最小单位,思考的是谁来做. 3.示例:“小明去上班” 面向过程 起床,刷牙洗脸 ...

  5. Java学习day9面向对象编程2-方法的可变个数的参数和方法的参数传递

    一.方法的可变个数的参数. 问题:我们能够打印的信息都是来源于方法的参数,也就是形参的传递.那如何要给方法传递不同的参数? .1.采用数组形参来定义方法 public static void test ...

  6. Java学习day8面向对象编程2-类的属性和方法

    一.类的属性 1.语法格式 修饰符 类型 属性名 = 初值 说明:修饰符private:该属性只能由该类的方法使用.在同一类内可见.使用对象:变量.方法. 注意:不能修饰类(外部类)    修饰符pu ...

  7. 0028 Java学习笔记-面向对象-Lambda表达式

    匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...

  8. Java基础-初识面向对象编程(Object-Oriented-Programming)

    Java基础-初识面向对象编程(Object-Oriented-Programming) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Java是一门面向对象的程序设计语言.那么什 ...

  9. 0030 Java学习笔记-面向对象-垃圾回收、(强、软、弱、虚)引用

    垃圾回收特点 垃圾:程序运行过程中,会为对象.数组等分配内存,运行过程中或结束后,这些对象可能就没用了,没有变量再指向它们,这时候,它们就成了垃圾,等着垃圾回收程序的回收再利用 Java的垃圾回收机制 ...

随机推荐

  1. sqli-labs-master less05 及 Burp Suite暴力破解示例

    一.首先测试显示内容 例:http://localhost/sqli-labs-master/Less-5/?id=1 http://localhost/sqli-labs-master/Less-5 ...

  2. EggJS 云原生应用硬核实战(Kubernetes+Traefik+Helm+Prometheus+Grafana),提供 Demo

    介绍 这是一个关于 Egg.js 应用上云️的示例,笔者所在的大前端团队的已应用于生产. CI/CD & DevOps & GitOps & HPA 等这里暂不做讨论,因为每一 ...

  3. Django之数据库--ORM

    一.建立数据库模型类 1.在model里创建模型类.(继承models.Model) from django.db import models # Create your models here. c ...

  4. vue绑定用户页面

    1.vue微博回调空页面 微博回调空页面为: http://127.0.0.1:8888/oauth/callback/ 1.1 页面路径 components\oauth.vue <templ ...

  5. [翻译自官方]什么是RDB和AOF? 一文了解Redis持久化!

    ​概述 本文提供Redis持久化技术说明,  建议所有Redis用户阅读. 如果您想更深入了解Redis持久性原理机制和底层持久性保证, 请参考文章 揭秘Redis持久化: http://antire ...

  6. 老猿学5G:3GPP和中国移动5G计费架构概览

    ☞ ░ 前往老猿Python博文目录 ░ 一.引言 老猿学5G这个专栏主要记录笔者因工作原因学习了解5G计费相关知识,文章按时间顺序循序渐进的介绍5G基础概念以及5G计费相关知识,该专栏前期已经完结, ...

  7. 记账本APP小升级

    增加了显示当月总收入和总支出的功能,增加了选择收支类型的功能,删去了删除账目后恢复的功能. 1.数据库的升级 1.entity 添加了一个收支类型的字段: package com.example.ca ...

  8. CobaltStrike 生成office宏病毒进行钓鱼攻击

    关于WORD宏: 在百度百科上有: 宏是一个批量处理程序命令,正确地运用它可以提高工作效率.微软的office软件允许用户自己编写,叫VBA的脚本来增加其灵活性,进一步扩充它的能力.如完打开word文 ...

  9. NodeService Ensure that Node.js is installed and can be found in one of the PATH directories

    今天发布NodeService到服务器,服务器环境是window server 2012 一直报错: [1] Ensure that Node.js is installed and can be f ...

  10. v-clickoutsides

    //点击目标元素外侧触发特定事件 使用 v-clickoutsides="clickHandler" import Vue from 'vue' Vue.directive('cl ...