面向对象编程(oop)
面向对象编程(oop)
-
初识面向对象(先有类再有对象)
-
面向对象是框架
本质:以类的方式组织代码,以对象形式封装数据
抽象:抽取出相似的部分
-
面向过程是流程
- 属性+方法=类(类是抽象的,必须实例化)
public String st(){ return "hello"; } //除了void以外的其他类大多都有返回值 public void ms(){ return; } //void没有返回值,如果写return直接为return;就可以
-
-
方法回顾和加深
return a>b ? a:b; // a>b吗,成立则返回a,否则就返回b
修饰符:public,private,static等
break:跳出switch循环,结束整个循环
return:表示方法结束
Continue:方法暂时性的结束
参数列表:(参数类型,参数名)(... 可变常参数)
抛出异常:throw
分屏:右击项目标签——点击split right(左右进行分屏)
-
对象的创建分析
-
两个静态类可以相互调用,两个不同类型的类进行调用需要转换new如下:
public static void main(String[] args) { // static是实例化的 public void main(String[] args) { // 没有经过实例化的(类值不存在) d1 D1=new d1(); //实例化的类不能调用没实例化的类,两个都没实例化的类可以相互调用,new可转实例化 new d1().say() D1.say
package oop; public class d2 { public static void main(String[] args) { // 静态类是经过实例化的,没有实例化的类在调用的时候需要new new d1().say(); //new一个d1调用d1里面的say属性值 } } package oop; public class d1 { public void say(){ // 非静态的类没有经过实例化, System.out.println("说话ba"); } } 说话ba
- 形参
int[] a={1,5,9,3,4,7,8}; public static void s(int[] a){
- 值传递(传值给形参)
public static void main(String[] args) { int a=5; System.out.println(a); d3.change(a); // 调用change方法 System.out.println(a); } public static void change(int a){ a=10; } 5 5
- 引用传递(传地址给形参)
package oop; public class d1 { public static void main(String[] args) { change l = new change(); // 调用的class.change中的值 System.out.println(l.name); // 值返回null d1.c(l); // 调用new change()--值是null,但change g的值为"秦江" System.out.println(l.name); //返回具体地址为"秦江" } public static void c(change g){ g.name="秦江"; } } class change{ String name; // String默认值是null } null 秦江 package oop; public class d3 { public static void main(String[] args) { dog a = new dog(); System.out.println(a.name); // 输出的是a对象下面name的值 } } class dog{ String name="hello"; }
package oop; public class Application { public static void main(String[] args) { Student a=new Student(); Student b=new Student(); a.name="小红"; a.age=18; b.name="大明"; b.age=90; System.out.println(a.name); System.out.println(a.age); System.out.println(b.name); System.out.println(b.age); } } package oop; public class Application { public static void main(String[] args) { Student a=new Student(); Student b=new Student(); a.name="小红"; a.age=18; b.name="大明"; b.age=90; System.out.println(a.name); System.out.println(a.age); System.out.println(b.name); System.out.println(b.age); } } 小红 18 大明 90
- 创建与初始化对象
- 必须和类的名字相同
- 必须没有返回值,也不能写void
- 使用new方法的时候必须要有构造器
- 用来初始化值(一旦使用了无参构造就不要删除了,让它空着)
package oop; public class Application { public static void main(String[] args) { person s=new person(); // 在person类中新建了一个对象 System.out.println(s.name); } } package oop; public class person { String name; public person(){ // 无参构造,实例化初始化对象的值(构造器) this.name="nihao"; } } nihao
package oop; public class Application { public static void main(String[] args) { person s=new person("kaungshen"); // 在person类中新建了一个对象 System.out.println(s.name); } } package oop; public class person { String n; public person(){ // 无参构造,实例化初始值 } public person(String name){ // 在无参基础上进行有参构造的时候,无参构造不可删 this.n=name; } } kaungshen
属性的定义:修饰符 属性类型 属性名 = 属性值
对象的创建和使用:
- 要有new,构造器: person K1=new person( ) ;
- 对象的属性 : K1.name=" " ;
- 对象的方法:K1.sleep( ) ;
类:
- 静态属性:属性
- 动态行为:方法
-
-
面向对象的三大特征
-
封装:将一个东西封存起来
-
“高内聚,低耦合”
高内聚:内部数据自己完成,不允许外部干涉
低耦合:仅需要少量的方法给外部使用
-
属性私有(privte),get--获取/set--设置 ( )
-
package oop; import java.util.Arrays; public class Student { //名字 private String name; // private 私有化 // 学号 private int id; // 性别 private char sex; public String getName(){ return this.name; } public void setName(String name){ this.name=name; } }
public class Student { //名字 private String name; // private 私有化 // 学号 private int id; // 性别 private char sex; private int age; public int getAge() { return age; } public void setAge(int age) { if (age<100) { this.age = age; }else { this.age=3; } } public String getName(){ return this.name; } public void setName(String name){ this.name=name; } public Student() { this.name = name; this.age = age; } } package oop; public class Application { public static void main(String[] args) { Student s1=new Student(); // 在person类中新建了一个对象 s1.setName("nihao"); s1.setAge(9000); System.out.println(s1.getName()); System.out.println(s1.getAge()); } } 3
-
继承:子类继承父类(java单继承,有多态)如果存在继承关系,父类中的class不能加public
public class Student extends person { // person是父类,student是子类 }
object是祖宗类
extends : 表示继承 相当于 is a
super:指向父类的字符串
- super调用父类的构造方法,必须在构造方法的第一个
- super只能出现在sout的上方
- super和this不能同时出现
-
this:调用子类对象
super:父类对象的引用
-
前提:1. this没有继承也可以使用
2.super只能在继承条件下使用
-
this( ) :默认调用的本类构造
super( ) :默认调用父类构造
package oop; public class Student extends person { private String say="nihao"; public void hi(String say) { System.out.println(say); // nihao System.out.println(this.say); // hhhh System.out.println(super.say); // 说了一句话 } } package oop; public class person { protected String say="说了一句话"; } package oop; public class Do { public static void main(String[] args) { Student Student = new Student(); Student.say("hhhh") } }
父子类代码调用及运行:
package d5.oop; public class Student extends Person { // 子类代码 public Student() { System.out.println("Student"); } } package d5.oop; // 父类代码 class Person { public Person() { System.out.println("person"); } } package d5.oop; // 运行代码 class Do { public static void main(String[] args) { Student student = new Student(); } } person student
- super--可以调private值(必须放在子类,放sout上面,构造参数最好有参无参都写,this跟super不能同时出现)
public Student(String A) { super(); // 不管是super还是this都要放在System.out.println的前边 this.B=A; System.out.println("nihao"); }
- 不加static字符类之间的调用 **注:person中的class前面不能加public ** (进行重写了)
package d5.oop; public class Student extends Person { public void hello(){ System.out.println("nihao"); } } class S{ public void hello(){ System.out.println("hhj"); } } package d5.oop; // 运行代码 public class Do { public static void main(String[] args) { Student a=new Student(); a.hello(); S b = new S(); b.hello(); Person m = new Student(); // 父类的引用指向子类 m.hello(); } } package d5.oop; class Person { public void hello(){ System.out.println("lll"); } } nihao hhj nihao
- 加static字符之间的调用(没有进行重写)
package d5.oop; public class Student extends Person { public static void hello() { System.out.println("iiii"); } } class S{ public void hello(){ System.out.println("hhj"); } } package d5.oop; public class Do { public static void main(String[] args) { Student a=new Student(); a.hello(); S b = new S(); b.hello(); Person m = new Student(); m.hello(); } } package d5.oop; class Person { public static void hello(){ System.out.println("lll"); } } iiii hhj lll
注:有静态类的时候调用的是类的方法,没有静态类的时候调用的是对象的方法
在运用构造器的时候要么调用父类--super,要么调用子类--this
this:指向子类的字符串
-
多态:不同的人有不同的表现形态
方法重写是方法名参数列表都不变(方法重写不等于方法重载)[重写是方法的重写,与属性值无关]
方法重载是方法名不变参数列表改变[重载是复用]
重写 : (快捷键:alt+enter override)
- 方法名必须相同
- 参数列表想同
- 方法体不同
- 修饰符范围可以扩大但不能缩小 :public>protected>default>private
- 抛出异常只能缩小不能扩大 : ClassNotFandException—>Exception
-

-
在重写时如果两个类方法不一样则不能进行重写,不能调用子类独有的方法(如上图)
-
- 多态:
-
多态是方法的多态,属性没有多态
-
父类和子类有联系如果内部方法不同也是不能相互转换
-
存在的条件:继承关系,方法需要重写,父类的引用指向子类对象
-
不能进行重写赋值 (没有多态) :
static方法属于类,不属于实例 final 在常量池里面(断子绝孙) private 方法
instanceof :类型转换(强制转换,自动转换)
-
判断一个对象是什么类型
-
输出: true true true false
- System.out.println(x instanceof y); // 看x跟y之间是否存在父子关系,存在返回true,否则返回false
- 强制转换:** * **(只能父类的引用指向子类的对象,不能子类的引用指向父类)父类—子类
Person a=new Student(); // 高转低 Student a1 = (Student) a; // 将person强转Student类型 父类 子 ((Student)a).go(); //强制转化为Student类型并调用Student类中的go方法 Student m=new Student() Person k=m; // 从低到高 k.hello(); // 低转高时,子类已经继承了父类的所有,删去子类后可以转向父类。高转低时,需要重新开辟属于子类的空间,进行强制转换
-
static关键字:(输出的时候最先输出)
package d5.oop; public class Student{ static { System.out.println("静态代码块");//静态代码块(最先执行) 静态类代码 } public Student() { System.out.println("构造方法");//构造代码块(最后执行) 构造的无参 } public static void main(String[] args) { new Student(); } { System.out.println("匿名代码块");//匿名代码块(第二个执行的) 赋初始值 } } 静态代码块 匿名代码块 构造方法 package d5.oop; public class Student{ static { System.out.println("静态代码块");//静态代码块(最先执行) } public Student() { System.out.println("构造方法");//构造代码块(最后执行) } public static void main(String[] args) { new Student(); System.out.println("代码块");//匿名代码块(第二个执行的) } } 静态代码块 构造方法 代码块 // 注意匿名代码块跟运行下的代码块输出顺序不一样
在调用构造无参函数的时候一定要先new一个一个无参函数
-
抽象类 和 接口(类是单继承,接口是多继承)
package d5.oop; public abstract class Student{ // 抽象类 public abstract void doSomething(); // 抽象方法 }
- abstract:抽象类中可以写普通方法
抽象方法必须在抽象类中
不能new只能靠子类去实现约束 (存在构造器)
存在意义:节省代码的开发
Person:抽象
Student:接口
teacher : 类
- 接口(接口里面的方法可以不写public):
impement : 一个类要实现一个接口 (重写)
interface:定义一个接口
在接口里面定义常量必须定义静态常量如:public static final int j=33;
接口不能被实例化,接口中没有构造方法
通过implements可以实现多个接口,实现多个接口的同时必须要将接口进行重写
package d5.oop; public interface teacher { void time(); } package d5.oop; public class UserSeverletmp implements Student,teacher { @Override public void add(String name) { } @Override public void delete(String name) { } @Override public void update(String name) { } @Override public void query(String name) { } @Override public void time() { } } package d5.oop; public interface Student{ void add(String name); void delete(String name); void update(String name); void query(String name); }
- 在接口中定义一个常量:
package d5.oop; public interface teacher { public static final int j=33; void time(); }
- 内部类及oop实战
- 成员内部类:
package d9; public class Outer { private int id=6952256; // 内部类可以获得外部类的私有属性 public void out(){ System.out.println("这是外部类的方法"); } public class Inper{ // 在public后面不可以加static,否则将不能调用私有属性 public void in(){ System.out.println("这是内部类的方法"); } public void getID(){ System.out.println(id); } } } package d9; public class hello { public static void main(String[] args) { Outer outer = new Outer(); Outer.Inper inper = outer.new Inper(); inper.in(); inper.getID(); } } 这是内部类的方法 6952256 // ** 一个java类文件只能有一个public文件,但是可以有多个class文件**
- 静态内部类:
public class User { private String name; private int age; // 封装静态内部类的 Builder实例 public static class Builder { private String name; private int age; public Builder setName(String name) { this.name = name; return this; } } }
- 局部内部类:
package d5.oop; public class teacher { public void hello(){ class in{ public void i(){ } } } }
- 匿名内部类:
package d5.oop; public class teacher { public static void main(String[] args) { apple apple = new apple(); // 有名字的初始化类 new apple().eat(); // 没有名字的初始化类 new UserService(){ // 创建一个新类的时候必须要在调用之前重新new一个对象 @Override public void hello() { } }; } } class apple{ public void eat(){ System.out.println("1"); } } interface UserService{ // 创建接口的时候必须要进行重写 void hello(); } 1 // 创建接口的时候必须要进行重写,创建一个新类的时候必须要在调用之前重新new一个对象
-
重点:alt+insert(生成构造器),alt+enter(自动导入包,纠正错误)
声明类的关键词:class
声明接口的关键词:interface
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?