java-廖雪峰笔记-面向对象

本文深入讲解Java面向对象的各个方面,包括构造方法、方法重载、继承、多态、抽象类和接口、静态字段和方法、包、作用域、类路径和jar。详细阐述了类与对象的关系、字段和方法的访问控制、实例化过程、方法定义和调用,以及如何通过继承和多态实现代码复用。此外,还讨论了构造方法的作用、方法的重载和覆盖、super关键字的使用,以及final、protected等访问修饰符的意义。最后,介绍了模块系统如何增强代码的封装和依赖管理。
摘要由CSDN通过智能技术生成

抽象概念——类(class)——对象模板
具体——实例(instance)——对象实例

定义class:

class Person {
   
    public String name;
    public int age;
}

字段(field)描述一个类的特征
类把一组数据汇聚到一个对象上,实现数据封装
public修饰字段,表示该字段可被外界访问

创建实例:
new 根据模板创造对象实例
Person ming = new Person();
访问实例变量可以用变量.字段

方法

为防止外界直接操作内部字段(field),使用private修饰

class Person {
   
    private String name;
    private int age;
}

此时可使用方法(method)使外部代码间接修改field
调用方法语法:实例变量.方法名(参数);

定义方法:

修饰符 方法返回类型 方法名(方法参数列表) {
   
    若干方法语句;
    return 方法返回值;
}

方法返回值通过return语句实现,返回类型设为void时可省略return

private方法内部调用
方法可以封装一个类的对外接口,调用方不需要知道也不关心Person实例在内部到底有没有age字段

this变量:始终指向当前实例(具体对象)
命名没有冲突时可以省略
局部变量和字段重名时,局部变量优先级高,此时指向字段用this

方法参数用于接收传递给方法的变量值
可变参数类型...定义,相当于数组类型,如:

class Group {
   
    private String[] names;

    public void setNames(String... names) {
   
        this.names = names;
    }
}
//可变参数定义
Group g = new Group();
g.setNames("Xiao Ming", "Xiao Hong", "Xiao Jun"); // 传入3个String
g.setNames("Xiao Ming", "Xiao Hong"); // 传入2个String
g.setNames("Xiao Ming"); // 传入1个String
g.setNames(); // 传入0个String

麻烦之处:
调用方可以传入null,但在此为一个空数组
调用方需要自己先构造String[]

参数绑定
调用方把参数传递给实例方法时,调用时传递的值会按参数位置一一绑定

计算完毕方法返回值后,改变传入参数
基本类型的为复制,不影响
引用类型的会影响

public class Main {
   
    public static void main(String[] args) {
   
        Person p = new Person();
        String bob = "Bob";
        p.setName(bob); // 传入bob变量
        System.out.println(p.getName()); // "Bob"
        bob = "Alice"; // bob改名为Alice
        System.out.println(p.getName()); // "Bob"还是"Alice"?
    }
}

class Person {
   
    private String name;

    public String getName() {
   
        return this.name;
    }

    public void setName(String name) {
   
        this.name = name;
    }
}

为何是Bob而不是Alice的解释:
String bobthis.name = name;时,是将字符串的地址赋给字段地址,变内容时为直接改变地址,原地址不变,而String[] bob时,fullname[0] = "Bart"是将指向地址内的内容改变

构造方法

一个类没有定义构造方法,编译器会自动为我们生成一个默认构造方法,无参数,无执行语句

class Person {
   
    public Person() {
   
    }
}

可定义既无参数的构造方法,又有参数的构造方法
没有在构造方法中初始化字段时,字段为默认类型
也可直接定义字段时初始化

构建对象实例时先初始化字段,再执行构造字段代码进行初始化

多构造方法

class Person {
   
    private String name;
    private int age;

    public Person(String name, int age) {
   
        this.name = name;
        this.age = age;
    }

    public Person(String name) {
   
        this.name = name;
        this.age = 12;
    }

    public Person() {
   
    }
}

通过new操作符调用的时候,编译器通过构造方法的参数数量、位置和类型自动区分

重载方法

也依据方法参数输入识别

继承

extends

class Person {
   
    private String name;
    private int age;

    public String getName() {
   ...}
    public void setName(String name) {
   ...}
    public int getAge() {
   ...}
    public void 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
廖雪峰 Java 教程 Java教程 Java快速入门 Java简介 安装JDK 第一个Java程序 Java代码助手 使用IDE 使用IDE练习插件 Java程序基础 Java程序基本结构 变量和数据类型 整数运算 浮点数运算 布尔运算 字符和字符串 数组类型 流程控制 输入和输出 if判断 switch多重选择 while循环 do while循环 for循环 break和continue 数组操作 遍历数组 数组排序 多维数组 命令行参数 面向对象编程 面向对象基础 方法 构造方法 方法重载 继承 多态 抽象类 接口 静态字段和静态方法 包 作用域 classpath和jar 模块 Java核心类 字符串和编码 StringBuilder StringJoiner 包装类型 JavaBean 枚举类 BigInteger BigDecimal 常用工具类 异常处理 Java的异常 捕获异常 抛出异常 自定义异常 使用断言 使用JDK Logging 使用Commons Logging 使用Log4j 使用SLF4J和Logback 反射 Class类 访问字段 调用方法 调用构造方法 获取继承关系 动态代理 注解 使用注解 定义注解 处理注解 泛型 什么是泛型 使用泛型 编写泛型 擦拭法 extends通配符 super通配符 泛型和反射 集合 Java集合简介 使用List 编写equals方法 使用Map 编写equals和hashCode 使用EnumMap 使用TreeMap 使用Properties 使用Set 使用Queue 使用PriorityQueue 使用Deque 使用Stack 使用Iterator 使用Collections IO File对象 InputStream OutputStream Filter模式 操作Zip 读取classpath资源 序列化 Reader Writer PrintStream和PrintWriter 日期与时间 基本概念 Date和Calendar LocalDateTime ZonedDateTime DateTimeFormatter Instant 最佳实践 单元测试 编写JUnit测试 使用Fixture 异常测试 条件测试 参数化测试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值