新闻详情

新闻详情

首页 / 资讯中心 / 详情

复习篇-继承和接口

发布时间:2026/6/11 18:34:34
复习篇-继承和接口
1如果父类中的方法用private修饰子类无法继承。2子类并不是父类的子集子类通常比父类的内容多3一个JAVA类只可能直接继承自一个父类这种限制称为单一继承single inheritance,多重继承也存在用接口实现。4子类并不能继承父类的构造方法但是父类的构造方法子类可以调用使用super关键字后面会讲到。定义(修饰符)class subclassName extands superclassName{}子类继承下来的是父类所有可访问的方法和可访问的数据域。像是所有被 : public 、protected 、default即默认修饰符可以不显式使用所修饰的数据域和方法都可以被继承下来在子类里都可以直接调用。Java 单继承一个类只能直接继承一个父类所有类直接 / 间接继承 Object。1.子类和父类在同一包中同包下父类以下修饰符成员子类可直接访问public任意访问protected同包 子类默认不写修饰符包访问权限同包可访问 private 私有成员无论是否同包子类都不能直接访问只能通过父类 public/protected 方法读写。2.子类和父类不在同一包中不同包时规则收紧public正常继承、直接访问protected可以继承只能在子类内部访问不能通过父类对象访问---这句话是说 protected// 父类class Person {protected int age;}// 子类class Student extends Person {public void test() {age 18; // ✅ 可以子类内部能访问}}class Test {public static void main(String[] args) {Person p new Person();p.age 18; // ❌ 不行不能通过父类对象访问}}一句话protected 只能在子类里面用外面不能用。---默认包权限、private完全无法继承访问构造方法不能继承子类构造默认先调用父类构造· 创建子类对象时优先执行父类构造方法再执行子类构造。· 隐藏代码子类构造第一行默认有 super();调用父类无参构造。· 如果父类没有无参构造只写了有参构造子类必须手动写 super(实参) 调用父类有参构造否则编译报错。class Father {// 只有有参构造public Father(String name) {}}class Son extends Father {public Son() {// 必须写不写报错super(张三);}}· 执行顺序父类静态代码块 → 子类静态代码块 → 父类构造代码块 → 父类构造方法 → 子类构造代码块 → 子类构造方法。子类定义和父类同名成员变量称为变量隐藏子类范围内直接写变量名优先使用子类自己的变量。想访问父类被隐藏变量super.变量名。区分变量隐藏只看名字和修饰符、类型无关和方法重写区分开。class Father{ int num 10; }class Son extends Father{int num 20; // 隐藏父类numvoid show(){System.out.println(num); // 20 子类System.out.println(super.num); //10 父类}}方法重写子类重写父类同名方法实现子类特有逻辑是多态核心。· 方法名、参数列表、返回值协变必须和父类一致· 子类方法访问权限不能比父类更严格父 public子类不能 private· 父类private/final/static方法不能重写· 推荐加注解 Override编译器校验是否合法重写。· 重载同类同名不同参数· 重写父子类同名同参数。super 代表父类对象引用仅在子类中使用· super(参数) 必须放在子类构造方法第一行· 作用主动调用父类有参构造解决父类无无参构造报错问题· 不能和 this() 同时存在this () 调用本类其他构造也要求第一行。· super.成员变量访问父类被隐藏的同名变量· super.方法名()调用父类被重写的方法class Father{void say(){System.out.println(父类说话);}}class Son extends Father{Overridevoid say(){super.say(); // 调用父类原方法System.out.println(子类说话);}}final 修饰三种内容语义不可修改、不可变更防止被继承、被修改final 类final class 类名特点不能被继承没有子类场景工具类如 String、Math防止子类篡改内部逻辑。final 方法final 返回值 方法名(){}特点子类无法重写该方法场景核心通用逻辑不允许子类覆盖修改。final 常量final 修饰基本类型变量值不能修改final 修饰引用类型变量地址不能改但对象内部属性可以改规范static final 全局常量变量名全大写下划线分隔 MAX_AGE局部 final 变量必须声明时赋值。final int AGE 18;final Student s new Student();s.name 张三; // 允许对象内容可变s new Student(); // 报错引用地址不可变修饰符一、访问修饰符4 个作用控制谁能访问public公开谁都能访问protected子类 同包能访问默认不写同包能访问private私有只有自己能访问二、非访问修饰符常用 5 个作用控制特性、行为static静态属于类不属于对象final最终不可修改abstract抽象没有方法体native本地方法调用系统底层synchronized线程安全多线程用三、最常用、必须记住的组合public static final 常量public static 静态方法public final 不能继承的类 / 不能重写的方法private final 私有常量public abstract 抽象方法向上转型父类类型 引用名 new 子类()// 父类class Animal{}// 子类class Dog extends Animal{}// 向上转型Animal a new Dog();形象理解把小狗Dog向上包装成通用动物Animal对外只暴露动物的通用能力隐藏小狗独有的功能。1.引用是父类类型只能调用父类中定义过的变量 / 方法子类独有的方法直接调用会编译报错。2.如果父类的方法被子类重写程序运行时实际执行子类重写后的代码。向下转型子类类型 变量名 (子类类型) 父类引用;Animal a new Dog(); // 向上转型Dog d (Dog) a; // 向下转型多态同一个行为不同对象不同实现三个前提存在继承 / 实现关系方法重写父类引用指向子类对象向上转型。运行机制编译看左边父类运行看右边子类· 编译阶段检查父类是否有该方法· 运行阶段实际执行子类重写后的代码。同一个动作cry()动物不同表现不一样狗汪汪、猫喵喵、鸡咯咯这就是多态。完整多态案例abstract class Animal{abstract void cry();}class Dog extends Animal{Override void cry(){System.out.println(汪汪);}}class Cat extends Animal{Override void cry(){System.out.println(喵喵);}public class Test{public static void main(String[] args) {// 多态写法向上转型Animal a1 new Dog();Animal a2 new Cat();a1.cry(); // 汪汪a2.cry(); // 喵喵}}abstract· 抽象类abstract class 类名不能 new 创建对象只能做父类配合向上转型使用。· 抽象方法abstract 返回值 方法名(); 没有方法体必须放在抽象类 / 接口中· 规则包含抽象方法的类必须是抽象类普通子类继承抽象类必须重写所有抽象方法子类也是 abstract 抽象类则可以不重写· 抽象类可以有普通变量、普通方法、构造方法、静态方法。用abstract修饰没有方法体只有方法声明必须放在抽象类 / 接口中// 抽象类动物模板abstract class Animal{String name;// 普通构造public Animal(String name){this.name name;}// 抽象方法没有方法体强制子类重写叫声abstract void cry();// 普通方法所有动物通用void eat(){System.out.println(name 在吃东西);}}// 普通子类必须重写所有抽象方法class Dog extends Animal{public Dog(String name){super(name);}Overridevoid cry() {System.out.println(name 汪汪汪);}}接口关键字interface代表行为规范、能力标准· 不能实例化没有构造方法。· 成员变量只能是常量public static final必须初始化不可修改。· JDK7 及以前全部是抽象方法实现类必须重写所有抽象方法。· 解决 Java 单继承局限一个类只能继承一个父类但可以实现多个接口拓展能力。运行// 定义唱歌能力接口interface Sing{void singSong();}// 定义跑步能力接口interface Run{void fastRun();}// 实现多个接口重写全部抽象方法class Student implements Sing, Run{Overridepublic void singSong() {System.out.println(学生唱歌);}Overridepublic void fastRun() {System.out.println(学生快跑);}}// 接口回调接口多态向上转型public class Test{public static void main(String[] args) {Sing s new Student(); // 接口引用指向实现类向上转型s.singSong();//学生唱歌}}import语句当你要使用不在当前包的其他类时用import把外部类引入当前文件不用每次写一长串完整包名。 语法分两种精准导入单个类import 包名.类名;通配符导入整个包所有类import 包名.*;Demo 类test 包跨包调用 Student必须 importpackage test;//表示Demo在test这个包下面package com.test;Demo在com这个包下面的test这个包下面// 导入自定义person包里的Student类import person.Student;public class Demo {public static void main(String[] args) {Student s new Student();s.study();}}1. java.util.Scanner → 键盘输入最常用作用接收用户输入数字、字符串import java.util.Scanner;2. java.util.ArrayList → 动态数组集合作用存一堆数据比数组好用import java.util.ArrayList;3. java.util.Arrays → 数组工具作用数组排序、转字符串import java.util.Arrays;4. java.util.Date → 日期时间作用获取当前时间import java.util.Date;5. java.util.Random → 随机数作用生成随机数import java.util.Random;6. java.io.* → 文件读写作用读取文件、写入文件import java.io.*;二、最常用万能写法导入整个工具包如果你不想一个个记直接写import java.util.*;
网站建设 高端定制 企业官网