【Java】匿名对象 , 继承 , 抽象类(一)

简介: 【Java】匿名对象 , 继承 , 抽象类

主要内容


  • 面向对象回顾
  • 匿名对象介绍
  • 面向对象特征 - 继承
  • 抽象类的使用
  • 模板设计模式

1 面向对象回顾


  • 面向对象的核心思想是什么 ?
  • 用代码来模拟现实生活中的事物 , 比如学生类表示学生事物 , 对象表示的就是具体的学生 , 有了类就可以描述万千世界所有的事物了
  • 现有的类还是先有的对象 ?
  • 对象是根据类创建出来的 , 所有现有的类 , 再有对象
  • Java类的创建 ?
  • 类名建议使用大驼峰命名法 , 每个单词首字母需要大写
  • Java规定 , 一个Java文件中可以定义多个类 , 但是只能有一个类使用public修饰 , public修饰的类名需要和java文件名保持一致
  • 按照规范 , 实际工作之时 , 建议一个Java文件中只能有一个类
类中的组成成分 ?
  • 1 成员变量
  • 2 成员方法
  • 3 构造方法
  • 4 内部类(后面学)
  • 5 代码块(后面学)
  • image.png
  • 创建对象所使用的关键字 ?
  • new关键字
  • 创建对象的格式 ?
  • 类名 对象名 = new 类名(参数列表);
  • 调用对象的成员 ?
  • 调用成员变量 : 对象名.成员变量名
  • 调用成员方法 : 对象名.成员方法名(参数)
  • 定义构造方法的格式 ?
  • 修饰符 类名(参数){ … }
  • 定义构造方法的特点 ?
  • 没有返回值 , 连void都没有
  • 方法名与类名相同
  • 构造方法可以进行重载定义
  • 构造方法的作用 ?
  • 空参构造 : 初始化对象的数据为默认值
  • 有参构造 : 初始化对象时 , 为对象的属性赋值
  • 面向对象三大特征是什么 ?
  • 封装 , 继承 , 多态
  • 封装的思想及其作用 ?
  • 思想 : 把实现细节隐藏 , 对外提供公共的访问方式
  • 作用 : 提高代码的安全性 , 提高代码的复用性
  • 封装的步骤 ?
  • 把成员变量进行private修饰
  • 提供对应的setter和getter方法
  • this关键字的含义 ?
  • this代表的是本类对象的引用
  • 在构造方法中 , this代表的是new的对象
  • 在成员方法中 , this代表的是调用此方法的对象
  • this关键字的作用 ?
  • 主要用于区分局部变量和成员变量同名的问题

2 匿名对象介绍


  • 什么是匿名对象 ?
  • 没有变量接收的对象 , 称作为匿名对象
  • 匿名对象的使用 ?
  • 直接使用匿名对象调用方法
  • 匿名对象作为方法传参
  • 匿名对象作为方法的返回值
  • 代码实现
package com.itheima.anonymous;
/*
    匿名对象 :
        没有对象名接收的对象 , 称作为匿名对象
        有对象名接收的对象 , 称作有名对象
    注意 : 一般使用一次的对象 , 我们可以采用匿名对象
    匿名对象的使用 :
        1 使用匿名对象直接调用方法
        2 使用匿名对象作为方法的传参
        3 使用匿名对象作为方法的返回值
 */
public class Demo1 {
    public static void main(String[] args) {
//        Student s = new Student();
//        s.study();
//        1 使用匿名对象直接调用方法
        new Student().study();
//        Student s2 = new Student();
//        useStudent(s2);
//        2 使用匿名对象作为方法的传参
        useStudent(new Student());
    }
    public static void useStudent(Student s) {
        s.study();
    }
    public static Student getStudent() {
//        Student s = new Student();
//        return s;
        // 3 使用匿名对象作为方法的返回值
        return new Student();
    }
}
class Student {
    public void study() {
        System.out.println("学生学习...");
    }
}
代码实践:注册案例
package com.itheima.anonymous;
import java.util.ArrayList;
import java.util.Scanner;
/*
    需求 :
        1 创建用户(User)对象 , 对象数据采用键盘录入而来
        2 用户(User)包含的属性 :
            用户名   (username)
            手机号码 (phonNumber)
            登录密码 (password)
            确认密码 (confirm)
            电子邮箱 (email)
            性别     (sex)
            出生日期 (birthday)
        3 如果登录密码和确认密码不一致 , 重新输入
        4 把用户(User)对象 ,添加到ArrayList集合中 , 打印集合对象即可
 */
public class Demo2 {
    public static void main(String[] args) {
        // 创建集合对象
        ArrayList<User> list = new ArrayList<>();
        // 创建键盘录入对象 , 录入用户的数据
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名:");
        String username = sc.nextLine();
        System.out.println("请输入手机号码:");
        String phoneNumber = sc.nextLine();
        System.out.println("请输入登录密码:");
        String password = sc.nextLine();
        System.out.println("请输入确认密码:");
        // 如果登录密码 , 和确认密码不一致 , 需要重新输入确认密码
        String confirm;
        while (true) {
            confirm = sc.nextLine();
            if (password.equals(confirm)) {
                break;
            } else {
                System.out.println("您输入的登录密码和确认密码不一致, 请重新输入...");
            }
        }
        System.out.println("请输入电子邮箱:");
        String email = sc.nextLine();
        System.out.println("请输入性别:");
        String sex = sc.nextLine();
        System.out.println("请输入出生日期:");
        String birthday = sc.nextLine();
        // 把用户对象添加到集合中
        list.add(new User(username, phoneNumber, password, confirm, email, sex, birthday));
        // 遍历集合
        for (int i = 0; i < list.size(); i++) {
            // 获取集合中的用户对象
            User u = list.get(i);
            System.out.println(u.getUsername() + "---" + u.getPhonNumber() + "---" + u.getPassword() 
            + "---" + u.getConfirm()  + "---" + u.getEmail() + "---" + u.getSex() + "---" + u.getBirthday() );
        }
    }
}
package com.itheima.anonymous;
// 用户类
public class User {
    private String username;
    private String phoneNumber;
    private String password;
    private String confirm;
    private String email;
    private String sex;
    private String birthday;
    public User() {
    }
    public User(String username, String phonNumber, String password, String confirm, String email, String sex, String birthday) {
        this.username = username;
        this.phoneNumber = phonNumber;
        this.password = password;
        this.confirm = confirm;
        this.email = email;
        this.sex = sex;
        this.birthday = birthday;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPhonNumber() {
        return phoneNumber;
    }
    public void setPhonNumber(String phonNumber) {
        this.phoneNumber = phonNumber;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getConfirm() {
        return confirm;
    }
    public void setConfirm(String confirm) {
        this.confirm = confirm;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public String getBirthday() {
        return birthday;
    }
    public void setBirthday(String birthday) {
        this.birthday = birthday;
    }
}

3 继承


3.1 为什么学习继承 ?

  • 继承是将多个类的相同属性和行为抽取到单独一个类中,那么多个类无需再定义这些共性属性和行为,只要继承这个单独类即可继承这些属性和行为了
  • 多个类称为子类(派生类),单独的这个类称为父类(基类 或超类)

3.2 继承的格式 ?

  • 使用关键字extends进行连接子类与父类
  • 举例 : public class Student extends People{ … }

3.3 继承的好处 ?

  • 提高代码的复用性
  • 提高代码的维护性
  • 让类与类产生了关系(继承关系) , 是多态的前提
package com.itheima.extends_demo;
/*
    学生类 : 姓名(name) , 课程名称(course) , 所在班级(className)  , 查看课表(lookForm) , 填写反馈数据(write)
    老师类 : 姓名(name) , 课程名称(course) , 部门名称(department) , 查看课表(lookForm) , 发布试题(release)
    设计 : 把学生类 和 老师类的共性内容抽取到一个单独的类中(Person),存储共性内容
    父类 : 姓名(name) , 课程名称(course) ,  查看课表(lookForm)
 */
public class ExtendsDemo1 {
    public static void main(String[] args) {
        Student s = new Student();
        s.setName("张三");
        s.setCourse("Java");
        s.setClassName("三年二班");
        s.lookForm();
        s.write();
    }
}
package com.itheima.extends_demo;
/*
    此类定义的是子类的共性成员
 */
public class Person {
    private String name;
    private String course;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getCourse() {
        return course;
    }
    public void setCourse(String course) {
        this.course = course;
    }
    public void lookForm(){
        System.out.println("查看课表");
    }
}
package com.itheima.extends_demo;
/*
    子类只需要定义自己特有的成员 , 共性的成员需要抽取到父类中
 */
public class Student extends Person{
    private String className;
    public String getClassName() {
        return className;
    }
    public void setClassName(String className) {
        this.className = className;
    }
    public void write(){
        System.out.println("填写反馈数据");
    }
}
package com.itheima.extends_demo;
/*
    子类只需要定义自己特有的成员 , 共性的成员需要抽取到父类中
 */
public class Teacher extends Person {
    private String department;
    public String getDepartment() {
        return department;
    }
    public void setDepartment(String department) {
        this.department = department;
    }
    public void release() {
        System.out.println("发布试题....");
    }
}


相关文章
|
3月前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
367 0
|
3月前
|
Java Go 开发工具
【Java】(9)抽象类、接口、内部的运用与作用分析,枚举类型的使用
抽象类必须使用abstract修饰符来修饰,抽象方法也必须使用abstract修饰符来修饰,抽象方法不能有方法体。抽象类不能被实例化,无法使用new关键字来调用抽象类的构造器创建抽象类的实例。抽象类可以包含成员变量、方法(普通方法和抽象方法都可以)、构造器、初始化块、内部类(接 口、枚举)5种成分。抽象类的构造器不能用于创建实例,主要是用于被其子类调用。抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类abstract static不能同时修饰一个方法。
236 0
|
5月前
|
缓存 安全 Java
Java反射机制:动态操作类与对象
Java反射机制是运行时动态操作类与对象的强大工具,支持获取类信息、动态创建实例、调用方法、访问字段等。它在框架开发、依赖注入、动态代理等方面有广泛应用,但也存在性能开销和安全风险。本文详解反射核心API、实战案例及性能优化策略,助你掌握Java动态编程精髓。
|
5月前
|
存储 人工智能 JavaScript
Java从作用域到对象高级应用​
本内容详细讲解了JavaScript中的作用域类型(函数作用域、块作用域、全局作用域)、作用域链、垃圾回收机制、闭包、变量提升、函数参数、数组方法、内置构造函数、对象高级知识、原型链、对象赋值、深浅拷贝、递归、异常处理及this指向等内容,全面覆盖JS核心概念与编程技巧。
64 0
|
6月前
|
存储 Java
Java对象的内存布局
在HotSpot虚拟机中,Java对象的内存布局分为三部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。对象头包含Mark Word、Class对象指针及数组长度;实例数据存储对象的实际字段内容;对齐填充用于确保对象大小为8字节的整数倍。
131 0
|
7月前
|
安全 Java API
Java 抽象类与接口在 Java17 + 开发中的现代应用实践解析
《Java抽象类与接口核心技术解析》 摘要:本文全面剖析Java抽象类与接口的核心概念与技术差异。抽象类通过模板设计实现代码复用,支持具体方法与状态管理;接口则定义行为规范,实现多态支持。文章详细对比了两者在实例化、方法实现、继承机制等方面的区别,并提供了模板方法模式(抽象类)和策略模式(接口)的典型应用示例。特别指出Java8+新特性为接口带来的灵活性提升,包括默认方法和静态方法。最后给出最佳实践建议:优先使用接口定义行为规范,通过抽象类实现代码复用,合理组合两者构建灵活架构。
220 2
|
Java
Java——抽象类和接口
抽象类是一种不能被实例化的类,至少包含一个抽象方法(无实现体的方法),常用于定义一组相关类的共同特征,并强制子类实现特定方法。抽象方法不能被 `static` 或 `final` 修饰,且必须被重写。 接口则是一个完全抽象的类,用于规范类的行为。接口使用 `interface` 关键字定义,不能实例化,并且类与接口之间是实现关系。 内部类是在一个类内定义的类,分为成员内部类、静态内部类、局部内部类和匿名内部类。成员内部类可被修饰符修饰,静态内部类只能访问外部类的静态成员,局部内部类定义在方法内,匿名内部类则隐藏了名字,直接通过 `new` 关键字定义并实现接口或继承类。
119 5
Java——抽象类和接口
Java基础(13)抽象类、接口
本文介绍了Java面向对象编程中的抽象类和接口两个核心概念。抽象类不能被实例化,通常用于定义子类的通用方法和属性;接口则是完全抽象的类,允许声明一组方法但不实现它们。文章通过代码示例详细解析了抽象类和接口的定义及实现,并讨论了它们的区别和使用场景。
196 2