2026/6/1 11:12:12
网站建设
项目流程
自创字 网站,应用中心安卓版下载,北京做网站,网站开发实战asp制作视频目录
一、this关键字
1. 理解this
2. this练习
二、继承性
2.1 继承性的理解
2.1.1 多层继承
2.2 继承性的使用练习
2.2.1 练习1
2.2.2 练习2
2.3 方法的重写
2.4 super关键字
2.4.1 子类对象实例化
三、多态性
3.1 多态性的理解
3.2 向下转型与多态练习
四、O…目录一、this关键字1. 理解this2. this练习二、继承性2.1 继承性的理解2.1.1 多层继承2.2 继承性的使用练习2.2.1 练习12.2.2 练习22.3 方法的重写2.4 super关键字2.4.1 子类对象实例化三、多态性3.1 多态性的理解3.2 向下转型与多态练习四、Object类4.1 clone()4.2 equals()4.3 toString()一、this关键字1. 理解this在声明一个属性对应的setXxx方法时如果形参名与属性名相同可以使用this来区分它们。使用this修饰的变量表示属性而不带this的变量表示形参。this可调用的结构:成员变量、方法、构造器理解:当前对象(在方法中调用时)或当前正在创建的对象(在构造器中调用时)**注意**如果方法的形参与对象的属性同名了我们必须使用this. 进行区分。使用this.修饰的变量即为属性(或成员变量)没有使用this.修饰的变量即为局部变量。this调用构造器格式: “this (形参列表)”我们可以在类的构造器中调用当前类中指定的其它构造器要求:this (形参列表) 必须声明在当前构造器的首行结论: this (形参列表) 在构造器中最多声明一个如果一个类中声明了n个构造器则最多有n- 1个构造器可以声明有 this (形参列表) 的结构2. this练习Account-Customer-Bank 练手UML类图//Account类 public class Account { private double balance; public Account(double init_balance){ this.balance init_balance; } public double getBlance(){ return balance; } //存钱 public void deposit(double amt){ if (amt 0) { balance amt; System.out.println(成功存入 amt); } } //取钱 public void withdraw(double amt){ if (amt amt amt 0) { balance - amt; System.out.println(成功取出 amt); }else{ System.out.println(余额不足); } } } //Customer类 public class Customer { private String firstname; private String lastname; private Account account; public Customer(){ } public Customer(String f,String l){ this.firstname f; this.lastname l; } public String getFirstname(){ return firstname; } public String getLastname(){ return lastname; } public Account getAccount(){ return account; } public void setAccount(Account acctount){ this.account acctount; } } //Bank类 public class Bank { private Customer[] customers; private int numberOfCustomer; public Bank(){ customers new Customer[10]; } public void addCustomer(String f,String l) { Customer cust new Customer(f,l); customers[numberOfCustomer] cust; } public int getNumberOfCustomer() { return numberOfCustomer; } public Customer getCustomer(int index){ if (index 0 || index numberOfCustomer) { return null; } return customers[index]; } } //测试 public class BankTest { public static void main(String[] args) { Bank bank new Bank(); bank.addCustomer(备,刘); bank.addCustomer(权,孙); bank.getCustomer(0).setAccount(new Account(1000)); bank.getCustomer(0).getAccount().withdraw(900); System.out.println(账户余额为 bank.getCustomer(0).getAccount().getBlance()); } }二、继承性2.1 继承性的理解图示代码角度自上而下定义一个类A在定义另一个类B时功能上两者相似则考虑B继承于A。自下而上定义了类B,C,D且类B,C,D有类似的属性和方法则将相同的属性与方法抽取封装到类A中让B,C,D继承于类A。类B,C,D中相似的功能删除。基本概念继承InheritanceJava通过extends关键字实现类之间的继承关系。子类Subclass可以继承父类Superclass的字段和方法。基本格式class A{//属性、方法}class B extends A{}继承性的好处继承的出现减少了代码冗余提高了代码的复用性。继承的出现更有利于功能的扩展。继承的出现让类与类之间产生了‘is-a’的关系为多态的使用提供了前提。继承描述事物之间的所属关系这种关系是: is-a 的关系。可见父类更通用、更一般子类更具体。图示代码// 子类Cat // 父类Animal class Animal { // 属性 protected String name; protected int age; // 构造函数 public Animal(String name, int age) { this.name name; this.age age; } // 方法获取动物信息 public void info() { System.out.println(宠物名: name , 年龄: age); } } class Cat extends Animal { public Cat(String name, int age) { super(name, age); // 调用父类构造函数 } // 子类特有方法抓老鼠 public void catchMouse() { System.out.println(name 抓老鼠 ); } } // 子类Dog class Dog extends Animal { public Dog(String name, int age) { super(name, age); // 调用父类构造函数 } // 子类特有方法看家 public void guardHome() { System.out.println(name 看家护院 ); } } public class Test { public static void main(String[] args) { // 创建 Cat 对象 Cat cat new Cat(汤姆, 3); cat.info(); // 输出: Name: Whiskers, Age: 3 cat.catchMouse(); // 输出: Whiskers is catching a mouse. // 创建 Dog 对象 Dog dog new Dog(杰森, 5); dog.info(); // 输出: Name: Buddy, Age: 5 dog.guardHome(); // 输出: Buddy is guarding the home. } }结果解释由于继承性子类获取父类中声明的所有属性和方法但封装性影响子类并不能直接调用父类中声明的属性或方法。子类不是父类的子集而是对父类的 “扩展”不要为了继承而继承要判断是否有is a的关键。默认的父类没有直接说明其父类则默认继承java.lang.Object2.1.1 多层继承图示**概念**直接父类间接父类格式class A{}class B extends A{}class C extends B{}补充java中子父类的概念是相对的java中一个父类可以声明多个子类但一个子类只能有一个父类。2.2 继承性的使用练习2.2.1 练习1代码://定义子父类 public class ManKind { private int sex; private int salary; public ManKind(){} public ManKind(int salary,int sex ){ this.salary salary; this.sex sex; } public int getSalary() { return salary; } public void setSalary(int salary) { this.salary salary; } public void setSex(int sex) { this.sex sex; } public int getSex() { return sex; } public void manOrWoman() { if (sex 1) { System.out.println(I am man); }else if (sex 0) { System.out.println(I am woman); } } public void employed(){ if (salary 0) { System.out.println(I no job); } if (salary ! 0) { System.out.println(I have a job); } } } class Kids extends ManKind{ private int yearsOld; public Kids(){ } public Kids(int yearsOld){ this.yearsOld yearsOld; } public Kids(int salary,int sex){ setSex(sex); setSalary(salary); } public void setYearsOld(int yearsOld) { this.yearsOld yearsOld; } public int getYearsOld() { return yearsOld; } public void printAge(){ System.out.println(I am yearsOld years old); } } //代码测试 public class KidsTest { public static void main(String[] args) { Kids kid new Kids(); kid.setSalary(100); kid.setSex(1); kid.setYearsOld(10); kid.employed(); kid.manOrWoman(); kid.printAge(); } }结果2.2.2 练习2代码public class Circle { private double radius; public Circle(){ this.radius 1; } public void setRadius(double radius) { this.radius radius; } public double getRadius() { return radius; } public double findArea(){ return 3.14 * radius * radius; } } public class Cylinder extends Circle { private double length; public Cylinder(){ this.length 1; } public void setLength(double length) { this.length length; } public double getLength() { return length; } public double findVolume(){ return findArea() * getLength(); } } //测试 public class Test { public static void main(String[] args) { Cylinder cy new Cylinder(); cy.setRadius(2.3); cy.setLength(1.4); System.out.println(圆的面积 cy.findArea()); System.out.println(圆柱的体积 cy.findVolume()); } }结果2.3 方法的重写1 为什么需要方法的重写子类继承父类后获取父类中声明的所有方法。但父类中的方法不太适用于子类此时子类要对从父类中继承的方法进行覆盖。2.方法重写是什么子类对父类继承过来的方法进行覆盖覆写的操作。3.方法重写遵循的规则父类被重写的方法与子类重写的方法的方法名和形参列表必须相同。子类重写的方法的权限修饰符不小于父类被重写的方法的权限修饰符。父类中private类的方法不能被子类重写关于返回值类型父类被重写的方法的返回值为void子类重写的方法的返回值也要是void父类被重写的方法的返回值为基本数据类型 / 引用数据类型子类重写的方法的返回值也必须与被重写的方法的返回值相同 或 是被重写的方法的返回值的子类。4.使用举例// 父类Animal class Animal { public void sound() { System.out.println(Animal makes a sound); } } // 子类Dog class Dog extends Animal { Override public void sound() { // 重写父类的 sound 方法 System.out.println(狗 汪汪叫); } } // 子类Cat class Cat extends Animal { Override public void sound() { // 重写父类的 sound 方法 System.out.println(猫 喵喵叫); } } public class Main { public static void main(String[] args) { Animal myDog new Dog(); // 父类引用指向子类对象 Animal myCat new Cat(); // 父类引用指向子类对象 myDog.sound(); // 输出: Dog barks myCat.sound(); // 输出: Cat meows } }方法的重载与重写的区别重载“两同一不同”-编译时多态重写继承以后子类覆盖父类中同名同参数的方法-运行时多态2.4 super关键字super关键字用于引用父类的属性、方法以及构造函数。1.当子类重写了父类的方法时可以使用super来调用父类中的被重写的方法。class Parent { void display() { System.out.println(This is the Parent class.); } } class Child extends Parent { void display() { System.out.println(This is the Child class.); } void show() { super.display(); // 调用父类的display方法 display(); // 调用子类的display方法 } } public class Main { public static void main(String[] args) { Child child new Child(); child.show(); } }2.super调用属性尤其是在子类中有同名属性的情况下。class Parent { String name Parent; void show() { System.out.println(Name: name); } } class Child extends Parent { String name Child; void show() { System.out.println(Name: name); System.out.println(Parent Name: super.name); // 访问父类的属性 } } public class Main { public static void main(String[] args) { Child child new Child(); child.show(); } }3.调用父类的构造器以及方法和属性// 定义一个父类 Parent class Parent { String name; // 父类构造函数 Parent(String name) { this.name name; System.out.println(调用父类父类名称 this.name); } // 父类方法 void display() { System.out.println(调用父类的display()方法); } } // 定义一个子类 Child 继承 Parent class Child extends Parent { String name; // 子类中也有一个同名属性 // 子类构造函数 Child(String childName) { super(张良); // 调用父类构造函数 this.name childName; // 初始化子类的属性 System.out.println(子类的名称 this.name); } // 重写父类方法 Override void display() { super.display(); // 调用父类的 display 方法 System.out.println(现在是子类覆盖后自己的display()方法); } // 显示父类和子类的名字 void showNames() { System.out.println(子类名: this.name); System.out.println(父类名: super.name); // 访问父类属性 } } // 主类 public class Test { public static void main(String[] args) { Child child new Child(张三); // 创建 Child 类的实例 child.display(); // 调用子类的 display 方法 child.showNames(); // 调用显示名字的方法 } }结果2.4.1 子类对象实例化图解三、多态性3.1 多态性的理解1.理解一种事物的多种形态。例女朋友说“我想养一个宠物”则宠物就可以理解为猫狗仓鼠兔子等等。多态性的使用前提:要有类的继承关系要有方法的重写多态的适用性:适用于方法不适用于属性。2. Java中 多态性的体现:子类对象的多态性:父类的引用指向子类的对象。( 或子类的对象赋给父类的引用)比如:Person p2 new Man();// 定义一个父类 Animal class Animal { public void sound() { System.out.println(Animal makes a sound); } } // 定义一个子类 Dog 继承 Animal class Dog extends Animal { Override public void sound() { System.out.println(Dog barks); } } // 定义另一个子类 Cat 继承 Animal class Cat extends Animal { Override public void sound() { System.out.println(Cat meows); } } public class Main { public static void main(String[] args) { // 创建 Animal 类型的引用指向 Dog 对象 Animal myDog new Dog(); myDog.sound(); // 输出Dog barks // 创建 Animal 类型的引用指向 Cat 对象 Animal myCat new Cat(); myCat.sound(); // 输出Cat meows } }多态性的应用:虚拟方法调用在多态的场景下调用方法时。 编译时认为方法是左边声明的父类的类型的方法(即被重写的方法)执行式实际执行的是子类重写父类的方法。简称为:编译看左边运行看右边。多态性的好处与弊端好处: 极大的减少了代码的冗余不需要定义多个重载的方法。弊端: 在多态的场景下我们创建了子类的对象也加载了子类特有的属性和方法。但是由于声明为父类的引用,导致我们没有办法直接调用子类特有的属性和方法。3.2 向下转型与多态练习图示向下转型其实就是使用强转符代码体现// 定义一个父类 class Animal { void makeSound() { System.out.println(动物的叫声); } } // 定义一个子类 class Dog extends Animal { void makeSound() { System.out.println(汪汪汪); } } // 另一个子类 class Cat extends Animal { void makeSound() { System.out.println(喵喵喵); } } public class Test { public static void main(String[] args) { // 父类引用指向子类对象 Animal myDog new Dog(); Animal myCat new Cat(); // 运行时多态性 myDog.makeSound(); // 输出: 汪汪汪 myCat.makeSound(); // 输出: 喵喵喵 // 向下转型 if (myDog instanceof Dog) { Dog dog (Dog) myDog; // 安全的向下转型 dog.makeSound(); // 输出: 汪汪汪 } if (myCat instanceof Cat) { Cat cat (Cat) myCat; // 安全的向下转型 cat.makeSound(); // 输出: 喵喵喵 } // 尝试错误的向下转型会抛出 ClassCastException try { Dog dog (Dog) myCat; // 错误的向下转型 dog.makeSound(); } catch (ClassCastException e) { System.out.println(使用错误的向下转型报错: e.getMessage()); } } }结果实战练习**场景**假设我们正在开发一个图形处理系统需要绘制不同的形状圆形、矩形等同时实现对这些形状的面积计算。// 抽象类 Shape abstract class Shape { public abstract double area(); // 抽象方法计算面积 } // 圆形类 class Circle extends Shape { private double radius; public Circle(double radius) { this.radius radius; } Override public double area() { return Math.PI * radius * radius; } } // 矩形类 class Rectangle extends Shape { private double width; private double height; public Rectangle(double width, double height) { this.width width; this.height height; } Override public double area() { return width * height; } } // 形状处理类 class ShapeProcessor { public void printArea(Shape shape) { System.out.println(面积: shape.area()); } public void identifyShape(Shape shape) { if (shape instanceof Circle) { Circle circle (Circle) shape; // 向下转型 System.out.println(这是一个圆形半径为: circle.radius); } else if (shape instanceof Rectangle) { Rectangle rectangle (Rectangle) shape; // 向下转型 System.out.println(这是一个矩形宽度为: rectangle.width and height: rectangle.height); } else { System.out.println(Unknown shape); } } } // 主类 public class PolymorphismExample { public static void main(String[] args) { Shape circle new Circle(5); Shape rectangle new Rectangle(4, 6); ShapeProcessor processor new ShapeProcessor(); processor.printArea(circle); // 计算并打印圆的面积 processor.identifyShape(circle); // 识别圆的类型 processor.printArea(rectangle); // 计算并打印矩形的面积 processor.identifyShape(rectangle); // 识别矩形的类型 } }结果四、Object类要明确java.lang.Object 因为可以自己命名一个叫Object的类任何一个java类不包括Object类 都直接或间接的继承于Object类Object类称为java类的根父类。Object类声明的结构没有声明属性提供一个空参的构造器重点关注Object类中声明的方法图示4.1 clone()clone() 方法用于创建一个对象的副本。为了使用此方法类必须实现 Cloneable 接口并重写 clone() 方法。默认情况下Object的 clone() 方法是浅拷贝。class Person implements Cloneable { private String name; private int age; public Person(String name, int age) { this.name name; this.age age; } // Getter和Setter方法 public String getName() { return name; } public int getAge() { return age; } Override protected Object clone() throws CloneNotSupportedException { return super.clone(); // 浅拷贝 } } public class CloneExample { public static void main(String[] args) { try { Person person1 new Person(Alice, 30); Person person2 (Person) person1.clone(); // 克隆person1 // 修改person2的属性 System.out.println(Before change:); System.out.println(person1: person1.getName() , person1.getAge()); System.out.println(person2: person2.getName() , person2.getAge()); person2.age 31; // 这里是为了示例实际应提供set方法 System.out.println(After change:); System.out.println(person1: person1.getName() , person1.getAge()); System.out.println(person2: person2.getName() , person2.getAge()); } catch (CloneNotSupportedException e) { e.printStackTrace(); } } }4.2 equals()任何数据范围都可以使用子类说明情况自定义的类在没有重写Object中equals()方法的情况下调用的就是Object类中声明的equals()比较两个对象的引用地址是否相等或是否指向了堆空间中同一个对象实例对于String、File、Date和包装类等都重写了Object类中的equals()方法用于比较两个对象的实体内容是否相等。如何重写手动实现调用IDEA自动实现IDEA使用快捷键AltInest即可代码实现class Person { private String name; private int age; public Person(String name, int age) { this.name name; this.age age; } Override public boolean equals(Object obj) { if (this obj) return true; // 引用相等 if (obj null || getClass() ! obj.getClass()) return false; // 类型检查 Person person (Person) obj; // 类型转换 return age person.age name.equals(person.name); // 属性比较 } } public class Test { public static void main(String[] args) { Person person1 new Person(张三, 30); Person person2 new Person(张三, 30); Person person3 new Person(李四, 25); // 比较内容 System.out.println(person1.equals(person2)); // 输出 true System.out.println(person1.equals(person3)); // 输出 false } }结果问题“”和equals()方法的区别1.操作符比较的是两个对象的引用内存地址即它们是否指向同一个对象。对于基本数据类型比较的是它们的值。使用场景对于基本数据类型比较它们的实际值。对于对象类型比较它们的引用是否相同。2. equals() 方法equals()方法用于比较两个对象的内容是否相等通常会覆盖Object类中的equals()方法来实现自定义的比较逻辑。使用场景equals()适用于需要内容比较的场景。尤其是在处理自定义对象时通常会重写equals()方法以提供自定义的比较逻辑。默认的equals()方法来自Object类与的行为相同比较的是对象的引用。注意事项对称性如果a.equals(b)为 true那么b.equals(a)也必须为 true。传递性如果a.equals(b)和b.equals(c)都为 true那么a.equals(c)也必须为 true。一致性如果没有修改对象的内容多次调用a.equals(b)必须返回相同的结果。非空性对于任何非空引用aa.equals(null)应该返回 false。4.3 toString()toString()方法返回对象的字符串表示通常是类名后跟符号和对象的哈希码十六进制表示基本格式public String toString() {return getClass().getName() “” Integer.toHexString(hashCode());}IDEA使用快捷键AltInest即可代码举例public class Person { private String name; private int age; public Person(String name, int age) { this.name name; this.age age; } Override public String toString() { return Person{name name , age age }; } }Java开发的就业市场正在经历结构性调整竞争日益激烈传统纯业务开发岗位如仅完成增删改查业务的后端工程师的需求特别是入门级岗位正显著萎缩。随着企业技术需求升级市场对Java人才的要求已从通用技能转向了更深入的领域经验如云原生、微服务或前沿的AI集成能力。这也导致岗位竞争加剧在一、二线城市求职者不仅面临技术内卷还需应对学历与项目经验的高门槛。大模型为核心的AI领域正展现出前所未有的就业热度与人才红利2025年AI相关新发岗位数量同比激增543%单月增幅最高超过11倍大模型算法工程师位居热门岗位前列。行业顶尖人才的供需严重失衡议价能力极强跳槽薪资涨幅可达30%-50%。值得注意的是市场并非单纯青睐算法研究员而是急需能将大模型能力落地于复杂业务系统的工程人才。这使得具备企业级架构思维和复杂系统整合经验的Java工程师在向“Java大模型”复合人才转型时拥有独特优势成为企业竞相争夺的对象其薪资天花板也远高于传统Java岗位。说真的这两年看着身边一个个搞Java、C、前端、数据、架构的开始卷大模型挺唏嘘的。大家最开始都是写接口、搞Spring Boot、连数据库、配Redis稳稳当当过日子。结果GPT、DeepSeek火了之后整条线上的人都开始有点慌了大家都在想“我是不是要学大模型不然这饭碗还能保多久”先给出最直接的答案一定要把现有的技术和大模型结合起来而不是抛弃你们现有技术掌握AI能力的Java工程师比纯Java岗要吃香的多。即使现在裁员、降薪、团队解散的比比皆是……但后续的趋势一定是AI应用落地大模型方向才是实现职业升级、提升薪资待遇的绝佳机遇如何学习AGI大模型作为一名热心肠的互联网老兵我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。因篇幅有限仅展示部分资料需要点击下方链接即可前往获取2025最新版CSDN大礼包《AGI大模型学习资源包》免费分享**一、2025最新大模型学习路线一个明确的学习路线可以帮助新人了解从哪里开始按照什么顺序学习以及需要掌握哪些知识点。大模型领域涉及的知识点非常广泛没有明确的学习路线可能会导致新人感到迷茫不知道应该专注于哪些内容。我们把学习路线分成L1到L4四个阶段一步步带你从入门到进阶从理论到实战。L1级别:AI大模型时代的华丽登场L1阶段我们会去了解大模型的基础知识以及大模型在各个行业的应用和分析学习理解大模型的核心原理关键技术以及大模型应用场景通过理论原理结合多个项目实战从提示工程基础到提示工程进阶掌握Prompt提示工程。L2级别AI大模型RAG应用开发工程L2阶段是我们的AI大模型RAG应用开发工程我们会去学习RAG检索增强生成包括Naive RAG、Advanced-RAG以及RAG性能评估还有GraphRAG在内的多个RAG热门项目的分析。L3级别大模型Agent应用架构进阶实践L3阶段大模型Agent应用架构进阶实现我们会去学习LangChain、 LIamaIndex框架也会学习到AutoGPT、 MetaGPT等多Agent系统打造我们自己的Agent智能体同时还可以学习到包括Coze、Dify在内的可视化工具的使用。L4级别大模型微调与私有化部署L4阶段大模型的微调和私有化部署我们会更加深入的探讨Transformer架构学习大模型的微调技术利用DeepSpeed、Lamam Factory等工具快速进行模型微调并通过Ollama、vLLM等推理部署框架实现模型的快速部署。整个大模型学习路线L1主要是对大模型的理论基础、生态以及提示词他的一个学习掌握而L3 L4更多的是通过项目实战来掌握大模型的应用开发针对以上大模型的学习路线我们也整理了对应的学习视频教程和配套的学习资料。二、大模型经典PDF书籍书籍和学习文档资料是学习大模型过程中必不可少的我们精选了一系列深入探讨大模型技术的书籍和学习文档它们由领域内的顶尖专家撰写内容全面、深入、详尽为你学习大模型提供坚实的理论基础。书籍含电子版PDF三、大模型视频教程对于很多自学或者没有基础的同学来说书籍这些纯文字类的学习教材会觉得比较晦涩难以理解因此我们提供了丰富的大模型视频教程以动态、形象的方式展示技术概念帮助你更快、更轻松地掌握核心知识。四、大模型项目实战学以致用当你的理论知识积累到一定程度就需要通过项目实战在实际操作中检验和巩固你所学到的知识同时为你找工作和职业发展打下坚实的基础。五、大模型面试题面试不仅是技术的较量更需要充分的准备。在你已经掌握了大模型技术之后就需要开始准备面试我们将提供精心整理的大模型面试题库涵盖当前面试中可能遇到的各种技术问题让你在面试中游刃有余。因篇幅有限仅展示部分资料需要点击下方链接即可前往获取2025最新版CSDN大礼包《AGI大模型学习资源包》免费分享