Day01.面向对象
方法的调用
-
静态方法
-
关键字 static,和类一起加载。
-
如果想在类里调用其它类的静态方法,则 类名.方法名(即可),如
-
public class Damo02 { public static void main(String[] args) { Student.say();//Student是另外的一个类 }
-
-
非静态方法
-
只有类实例化之后才存在
-
想要在本类中调用其它类的非静态方法,则必须在本类中将其他类实例化,之后才能调用非静态方法
-
public class Damo02 { //实例化类 new //对象类型 对象名 对象值 Student student = new Student(); student.say1(); } } -
可以看到,如果a()、b()方法都为静态方法,则此时可以a可以正常调用b;但如果b为非静态方法,则调用过程中会报错。这是因为在使用b方法的时候没有实例化对象,因此b方法实际上还不存在。而a由于是静态方法,伴随着类的加载已经生成了,所以不需要实例化也能存在和被调用。
![image-20210227141516596]()
![image-20210227141834196]()
-
-
形参和实参
- 形参是为了描述方法而存在的,并非实际参在的参数。调用方法后,实际参数传递给形式参数,从而调用方法。因此实际参数和形式参数类型需要一致。
-
值传递和引用传递
- 简单理解,值传递,传递的是数值,而原先的变量则不会改变;
- 引用传递,传递的是地址,形参和实参共用一个地址,所以对形参进行运算,实参也会产生变化。
-
this关键字
对象的创建与分析
-
类是一种抽象的数据类型,是对某一类事物整体描述/定义
- 用来描述/定义某一类具体的事物应该具备的特点和行为
- person类、pet类、cat类等
-
对象是抽象类的具体实例
-
使用new关键字创建对象
- 使用new关键字创建的时候,除了分配内存空间,还会给创建好的对象,进行默认的初始化,以及对类中构造器的调用。
- 类i中的构造器也称为构造方法,是在进行创建对象时必须调用的。并且构造器有以下两个特点:
- 必须和类的名字相同
- 必须没有返回类型,也不能写void
-
有参构造和无参构造
- 类中默认有无参构造方法,就是在new新建对象时,不给对象赋任何初值。
- 有参构造就是构造对象的同时,将类中的属性赋初值,这样对象中的属性就有一定的值。
- 如果在类中声明了有参构造,那就必须显示定义无参构造。
-
public class Student {//我们定义了一个学生类,并给出类中的属性和构造方法 //属性:字段 String name;//null int age;//0 //方法 public void study(){ System.out.println(this.name+"在学习"); } //无参构造 public Student(){ }; //有参构造 public Student(String name,int age){ this.name = name;//this指的就是本对象,即Student,this.name就是Student.name this.age = age; }; } -
public class Application {//这里是应用类,我们用学生类构造了两个学生对象student和student1,其中student是无参构造,student1是有参构造 public static void main(String[] args) { /*类是抽象的,我们已经定义了一个类,需要用到类中的东西, 就需要将其实例化(除了静态方法).实例化的方法就是 new */ //类实例化后会返回一个自己的对象 //student对象就是一个Student类的具体实例! Student student = new Student(); Student student1 = new Student("cq",10); } }

如何理解类与对象的关系
-
类,是抽象的一类事物,在类中要定义 类的属性 以及方法。
-
对象,是类的实体,具有类的属性和方法。对象是通过引用来操作的:栈---》堆
-
public class Pet{//类名为 Pet String name; int age;//name,age都是类的属性 public void shout(){//shout()是类的方法 System.out.println("叫了一声"); }; new Student(){ };//无参构造函数,用于构造尚未对属性赋值的对象,无参构造函数无须声明,但如果声明了有参构造函数,则必须对无参函数进行声明 new Pet(String name,int age){//参数用于对属性赋值 this.name = name; this.age = age; //this 即指构造出来的这个对象 }//有参构造函数,用于构造对属性赋值的对象。 } -
public class Application {//主类 public static void main(String[] args) { Pet dog = new Pet();//dog就是Pet类的一个对象,无参构造 Pet cat = new Pet("小宝",5)//有参构造 dog.name = "wangcai"; dog.age = 5; dog.shout(); System.out.println(dog.age); System.out.println(dog.name); } }注意:两个类必须在同一个package下才能直接调用Pet类,否则则需要加文件名
面向对象三大特性
-
封装
-
高内聚:即类的内部数据细节操作自己完成,不允许外部干涉;
-
低耦合:仅暴露少量的方法给外部使用;
-
我们通常应禁止直接访问一个对象中数据的实际表现,而通过操作接口来访问,这称为信息隐藏。
-
属性私有,set/get
//属性私有 private String name; private int age; //提供一些可以操作这个属性的方法 public getAge(){ return age; } public setAge(int age){ this.age = 3;//成员函数调用成员属性时,成员属性用“this.” }
-
-
继承
-
继承是类与类的关系,其中一个作为父类(基类),另一个作为子类(派生类),子类会继承父类中的所有属性和方法,同时还能拥有其它的属性和方法。
-
public class Student { String name;//null int age;//0 private boolean sex; public void study(){ System.out.println(this.name+"在学习"); } public Student(){}; public Student(String name,int age){ this.name = name; this.age = age; }; } -
public class goodStudent extends Student{//继承Student的所有 private int EnglishScore; private int MathScore; private int ChineseScore; public int GetSum(){ return this.ChineseScore+this.MathScore+this.EnglishScore; } public int GetSex(){//此处会报错,因为sex是基类的private对象,在继承时可以继承,但无法访问。 if(this.sex) return 1; else return 0; } } -
CTRL+H,可得树,可见在Student上仍然有Object类,实际上所有类都默认继承Object类,包括String
![image-20210227213743416]()
-
super:子类通过super来访问父类的同名属性或方法
![image-20210227231127479]()
-
-
多态:父类引用指向子类方法时,必须调用那些父类中存在的方法,如果子类中对该方法进行了重写,那么在运行时就会动态调用子类中的方法,这就是多态。
- 重写:
- 方法名必须相同
- 参数列表必须相同
- 修饰符范围可以扩大不能缩小
- 抛出的异常:范围,可以被缩小,不能被扩大
- 子类的方法和父类的方法体不同
- Father f1 = new Son();即父类引用指向子类对象
- f1只能使用Father类的方法,或者被Son重写的方法,Son独有的方法f1不行
- 多态是方法的多态
- 父类和子类,有联系 存在类型转换异常
- static private final 不能被实现
- 多态存在的三个必要条件
一、要有继承;
二、要有重写;
三、父类引用指向子类对象。 - https://www.cnblogs.com/liujinhong/p/6003144.html 更详细的多态博客
- 重写:





浙公网安备 33010602011771号