面向对象
面向过程(POP)
面向过程POP(Process-Orientd-Programming)函数是面向过程的核心。什么东西都是自己一步一步的去实现。强调的是系统的数据被加工处理的过程,数据仅仅作为输入和输出存在,在程序设计中主要以函数或者过程为程序的基本组织方式。
–从头到尾是一个实施者,执行者
–主要考虑怎么做
–最小单位:函数
–以过程和步骤为主
面向对象(OOP)-一种思维方式
面向对象(Object Oriented Programming)是一对象为中心。它是一种思维方式。面向对象是把一项工程看成是一个个的对象组成,这些对象之间的相互关系,构成了整个项目。类和对象是构成面向对象的程序的主体。思想特点:在于,它是一种符合我们思想习惯的思想,可以将复杂的事情简单化,将我们从执行者变味了指挥者,角色发生了改变。我们更多的事情是创建对象,使用对象,指挥对象去做事情。
–更多的是一个指挥者,调度者
–主要考虑谁能做,谁去做
–最小单位:以类/对象为主
–以对象为主
三大基本特征
encapsulation(封装),inheritance(继承),polymorphism(多态)
类
具有相同或者相似特征的个体的聚合,叫做类。
类的构成
核心:属性和方法
–属性也叫成员变量、全局变量;不能放在方法之后,因为识别不到
–方法也叫函数
类的定义
修饰符 class(关键字:) 类名{
成员变量;<----它有什么?
成员方法;<----它能做什么?
}
例:
public class Mobile{//手机
//尺寸 颜色 品牌 价格 —》转换为代码
String size = “7*8”;
String colo r = “蓝色”;
String brand = “voiv”;
int price;
// 能 玩游戏 发短信 打电话 拍照 ----》转化为代码
public void playGame(){
System.out.print(“玩游戏”)
}
}
获取属性
对象名.属性名
System.out.print(m.size)
注意
static 使用在用于同一个类中可以调用(类没有static,方法有static)
其他类想要使用static修饰的方法,则这个方法的类要加修饰符static.
对象
集合中的一个 个体
先有类在有对象
创建对象
1.类名 对象名 = new 类名();
Mobile m = new Mobile();//当前对象是m
–对象的创建是依据构造函数
–对象又叫实例
–同一个类创建的不同对象具有相同属性和方法
2.类名 对象名1 = new 类名();
类名 对象名2 = 对象名1;
- 对象名2没有在堆中创建新的属性,而是将指针指向对象1的堆
使用对象调用方法
对象名.方法名();
m.playGame();
对象存储和分布
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CKz2auZe-1676889606375)(G:\Java-栈\Java面向对象\对象创建方式图.PNG)]
修改属性值
根据创建的对象,我们可以自己修改对象的属性值
对象名.属性 = 属性值;<--------可能出现属性值的不合法
匿名对象
- 应用场景
当这个对象时临时性的,或者说这个对象只用一次;后面就不用了
-
写法
new 类名();
-
可以用其他变量接收
int max = new 类名().getMax();
NUll
1.类 对象名 = null;
- 这个对象名只在栈中,堆中没有对应的属性和对象
- 用这个对象名调用属性或方法时报错:空指针异常
2.类 对象名 = new 类();
对象名 = null;
- 这个是剪断 栈和堆的指针,堆中有对应的属性和对象
- 使用时报错:空指针异常
修饰符
protected 受保护的
public 公共的
private 私有的、私人的、私密的<—仅仅在这个类中是可见的,可使用。不能直接修改、使用。
-
private的使用
1.用private修饰类的属性,也就是属性私有化
2.为私有化的属性提供对应的一组方法,getXXX和setXX用于获取或修改属性
3.任何要访问类中的私有属性的 类都要通过getXX和setXXX方法,这两个方法就是外部类访问该类私有属性的入口。
---->体现了面向对象的第一大特征–封装
封装的好处:安全
-
间接修改的方法–约定俗成
-
public void set属性(属性类型 属性名){
this.属性名 = 属性名
}
-
public void set属性(属性类型 名字){
属性名 = 名字
}
-
-
间接获取的方法–约定俗成
-
public 属性类型 get属性( ){
return 属性名;
}
-
-
快捷方法–iDEA或Eclipse
- Generate–>Getter
- Generate–>Setter
关键字
this
概念
当前对象–把形式参数(属性名)的值传递给 当前对象的属性
-
写法
this.属性名 = 属性名;
-
应用场景1
//当前对象是 其他类 中创建私有属性的类的对象在使用set方法时
public void set属性(属性类型 属性名){
//就近原则–属性值修改不了,左边靠近参数中的属性名
属性名 = 属性名
}
-
应用场景2
类中的方法互调,在构造函数中的使用
public User(String name){
this(name,6000);//一定在这个构造函数的第一行位置,不然会报错
}
public User(String name,String password){
this.name = name;
this.passwrod = password;
}
-
应用场景三
this.方法名() 表示当前对象的方法
this 用法小结
- this.属性
- 当构造器 或 方法有局部变量与实例变量同名时,用于区分局部变量和实例变量。若构造器 或 方法中么有局部变量与实例变量同名时,可以不加 this
- this.方法
- 表示调用当前对象的其他方法,通常情况下,省略 this
- this() 或 this(参数列表)
- 用于调用本类的其他构造方法,必须写在构造器的首行,要避免递归调用格式:this(); 或 this(实参列表);
static
概念
- 静态的
- 主要用于修饰类的属性 和 方法,实现类的静态属性和静态方法的共享
static 的引入
无论是否产生了对象 或 无论产生了多少对象的情况下,某些特点给的数据在内存空间里只有一份。
静态属性
- 写法
- static 属性类型 属性名
- 访问或调用
- 类名.属性名
静态方法
-
写法
-
public static 返回类型 max(){
}
-
-
访问或调用
- 类名.方法名 ;/类名.max();
静态代码块
-
写法
-
static{
}
-
-
使用
- 随着类初始化开始初始化
- 只执行一次
- 在构造函数之前就执行了
静态和实例
范围
- 静态属于类范围,是类对象和类属性
- 实例属于对象范围,是实例对象和实例属性
存放位置
- 静态–方法区,一旦创建一直存在,随着类的加载而加载,在创建对象之前。浪费空间,不常用
- 实例–堆
生命周期
- 静态–长
- 实例–短
访问
- 使用类名或对象(不推荐),
- 在静态方法中只能调用静态变量和静态方法,不能使用非静态方法和变量,因为:被静态变量修饰的变量或方法,随着类的加载而加载了;在对象创建前,就已经存在与方法区;所以不能使用非静态的方法或变量。
- 不能this关键字使用,因为this表示当前对象,使用静态方法时,对象还未创建。
- 静态调用,不需要创建对象实例
- 实例调用,一档要创建对象实例
常见的错误情形
静态属性和静态方法可以使用类名和对象引用,在静态方法中只能访问静态变量和静态方法,不能访问非惊天成员属性和方法,不可以使用this 和 super 关键字。
注意事项
- 在static 方法内部只能 访问 static 属性和static 方法,不能访问类的实例变量和成员方法:即非static属性 和 非 static方法
- static 修饰的方法不能被重写,或者说不会被覆盖。因为 静态方法时类方法,是属于类的,它和对象无关
- static 方法内部不能有 this 和super
- 建议使用 类名.静态成员 访问静态变量和方法
native
- 原生的,本地的
- 看到这个关键字 它的代码实现可能是C/c++等编写的
native 关键字常用于标注方法 方法是原生函数。也就是说:这个方法是用C/C++等非Java语言实现的,并且被编译成了DLL,由Java去调用。被native 修饰的方法通常与硬件和设备的底层紧密相关。
native 声明的方法,对于调用者而言可以把它当作和其他Java方法一样使用。native方法可以返回任何Java类型,而且同样可以进行异常处理
构造函数
构造---->与new 一起建造(创建) 对象创建的方法
----->对 对象的属性进行初始化或者进行初始化的工作
构造函数的特点
- 方法名 与 类名保持一致
- 没有返回值类型,连void都没有(如果一个方法名与类型一直,并含有返回类型,这在java语法上是合法的,不过回报警告,此时该方法不被Java认做构造方法,则只将其当做普通的成员方法)
- 没有返回值,可以只写一个return
- 若一个类中没有显式的提供任何构造器时,系统回为其提供一个默认的无参构造器
- 若一个类中显式声明了任何构造器,那么系统不再为其提供默认的无参构造器
类的构造函数
1.在没有创建的情况下,类中是有默认的构造函数
2.本质上来将就是一个函数,但是,它又非常特殊
3.只要创建对象,必会调用构造函数,会默认调用构造函数
public 类名(){//无返回类型 这里应该是隐式返回类的对象
System.out.println(“这是构造函数”)
}
注意
1.void 才是没有返回值
2.如果一个类里面,你没有 写任何构造函数:那么存在一个默认的无参构造函数
3.你可以选择手动写默认的无参构造函数
4.如果你自己没有手动把那个默认的无参构造函数给写出来而且写了其他有参构造函数。那么:原本的那个默认的无参构造函数将会被覆盖。也就是说,原本那个无参构造函数被重载(重写)
5.永远把无参构造函数写出来
6.构造函数没有返回值,但可以写一个return ,却没有意义
自定义构造函数–有参数
//对象创建时,就给子定义构造中书写的属性赋值,还可以用setXXX方法修改。
public 类名(参数类型 参数名1,参数类型 参数名2){
this.属性名 = 参数名1;
this.属性名 = 参数名2;
}
- 也就是给属性初始化
工具生成构造函数
- Generate–>constructor–>选择属性(参数)
构造函数的重载
在一个类中可以定义多个搞糟函数,这称为构造函数重载。在运行时,JVM根据调用参数决定执行哪一个构造函数
构造函数 与 普通函数的区别
- 普通函数用于定义对象应该具备的功能。构造函数用于定义对象的初始化内容
- 构造函数是在对象简历时由JVM调用。普通函数是对象简历后,调用该函数时才会执行
- 普通寒素可以多次调用,构造函数就在函数创建时调用
- 构造函数的函数名要与类型一样,而普通函数的函数只要符合标识符的命名规则即可
- 构造函数没有返回类型
使用自定义类创建数组
类名[] 数组名 = {};
例:
Student s1 = new Student();//创建对象
s1.setName(“小李”);//设置值
Student s2 = new Student();
Student s3 = new Student();
Student[] students = {s1,s2,s3};//创建数组
Studetn stu = students[0];//使用
stu.getName();//获取名字
for(int i=0;i<students.length;i++){//遍历类数组
Student stu2 = studetns[i];
System.out.print(stu.getName+" ");
}
main 函数
什么是main 函数
- 整个程序的r入口
字段解释
-
punlic 公共的,权限最大
-
static 静态的,不需要创建对象,类名使用
-
void 无返回值,它是程序的入口不需要返回值
-
String[] args 接收调用main函数传进来的参数
- args 不为null
= new Student();
Student s3 = new Student();
Student[] students = {s1,s2,s3};//创建数组
Studetn stu = students[0];//使用
stu.getName();//获取名字
for(int i=0;i<students.length;i++){//遍历类数组
Student stu2 = studetns[i];
System.out.print(stu.getName+" ");
}
main 函数
什么是main 函数
- 整个程序的r入口
字段解释
-
punlic 公共的,权限最大
-
static 静态的,不需要创建对象,类名使用
-
void 无返回值,它是程序的入口不需要返回值
-
String[] args 接收调用main函数传进来的参数
- args 不为null