面向对象编程
object oriented programming (OOP)
面向对象编程与面向过程编程的区别
具体案例
-
把大象装进冰箱
-
面向过程编程语言
- 分析出解决问题的步骤,把步骤一步步实现,面向对象编程语言更关注执行的过程
-
1.开门(){}
-
2.装大象(){}
-
3.关门(){}
-
面向对象编程语言
- 先对整体进行分类,根据不同类的细节在进行深入处理。
-
冰箱类{
开门()
关门()
}
大象类{
}
面向对象编程与面向过程编程是相辅相成的,不具有完全替代性
类
三个常见的成员
-
属性filed 负责静态特征(数据)
- 例如 int id ;
id则为一个静态特征,也就是数据
- 例如 int id ;
-
方法method 负责动态行为(对数据的操作)
public void study(){ System.our.println("正在学习!") }
该方法为一个静态变量。
-
构造器constructor 负责初始化对象
成员变量的默认值
整型: 0
浮点型: 0.0
字符型: '\u0000'
布尔型: false
所有引用类型: null
类的定义
- 类:类是一个模板,它描述一类对象的行为和状态。
- 对象:对象是类的一个实例,有状态和行为。例如,一条狗是一个对象,它的状 态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等
- 定义一个类的基本格式
[修饰符] class 类名{ 0到多个构造器 0到多个成员变量 0到多个方法 0到多个初始化块 }
- 修饰符可以写public final abstract或者不写,java类名要用大驼峰写法。一个java源文件(也就是文件后缀名为.java的文件)可以写多个类,但是里面只能有一个用public修饰的class;
代码实现
public class test {
//静态特征(数据)int id;String sname;int score;int age;computer computer;void study() {
System.out.println("我正在学习!使用的电脑是:" + computer.brand);}public static void main(String[] args){
computer c1=new computer();c1.brand="游侠G5";c1.price=8000;computer c2=new computer();c2.brand="机械革命";c2.price=7000;testHello n1=new testHello ();n1.id=2080;n1.sname="马牛逼";n1.age=18;n1.computer=c2;n1.study();}
}
构造方法(构造器)Constructor
构造方法的核心作用
- 用于对象的初始化,Java通过new关键字来调用构造器
声明格式
[修饰符] 类名 (形参列表){
//n个语句
}
构造方法的四个要点
- 构造器通过new关键字调用;
- 构造器虽然有返回值,但是不能定义返回值的类型(返回值的类型肯定是本类),不能再构造器里使用return返回某个值。
- 如果没有定义构造器,则编译器会自动定义一个无参的构造器(方法) 如果已定义 则编译器不会自动添加。
- 构造器的方法名必须和类名一致;
代码实现
/** *描述二维空间的一个点 */
public class Point {
double x;double y;public Point (double _x, double _y){
//构造器x = _x;y = _y;}public static void main(String[] , args){
Point p1 = new Point(_x:3.0,_y:4);System.out.println(p1.x);}
}
创建对象4步和构造方法调用之间的关系
- 分配对象空间,并将对象的成员对象初始化为0或空
- 执行属性值的显示初始化
int x = 100
- 执行构造方法,初始化对象
- 返回对象的地址,给相关的变量
构造方法的重载
构造方法与普通方法一样,可以进行重载
/**** 模拟网站的账户(用于测试构造方法的重载)*/
public class User {
int id;String uname;//用户名String pwd; //密码User(){
}public User(int _id){
//创建构造器1id = _id;}public User(int _id,String _uname,String _pwd){
//创建构造器2id = _id;uname = _uname;pwd = _pwd;}public static void main(String[] args) {
//调用构造器2User u1 = new User(); //调用无参构造器User u2 = new User(1001);//调用构造器1User u3 = new User(1002,"马牛逼","12321");}}
this的本质
本质
- this 的本质就是当前对象的地址
- 普通方法中,this总是指向调用该方法的对象
- 构造方法中,this总是指向正要初始化的对象
代码示例
/**** this 的用法*/
public class User2 {
int id;String name;String pwd;public User2(){
//定义无参构造器}public User2(int id,String name){
System.out.println("正在要初始化的对象"+this);//得到对象的地址//id = id 用法错误 如果想要吧id赋值给 代码第四行的id 必须使用thisthis.id = id;this.name = name;}public User2(int id,String name ,String pwd){
this(id , name ); //调用了重载的构造器,这种调用必须位于构造方法的的第一行。this.pwd = pwd;}public void login(){
System.out.println("要登陆:"+this.name+" 密码是:"+this.pwd);}public static void main(String[] args) {
User2 u = new User2(101,"马牛逼");u.login();User2 u3 = new User2(102,"马牛逼","123456");System.out.println(u3.pwd);System.out.println( u3.name);}
}
Static关键字
核心用法
-
用static声明的变量为静态成员变量,也为类变量,有以下特点:
-
从属于类,只有一份,在类被载入时被显示格式化
-
一般使用 “类名.类属性/方法” 来调用
-
在static 方法中不可直接访问非static 成员
? //静态方法属于类 不属于对象
-
代码实现
public class TestStatic {
int id;static String company = "大公司";static int companyId = 0;static {
System.out.println("类被初始化时调用");companyId = 111222;}//静态方法static void printCompany(){
//System.out.println(this); 在static方法里不能访问非static成员System.out.println(company);}void login(){
System.out.println("登陆");}public static void main(String[] args) {
TestStatic.printCompany(); //直接调用static 不用new对象TestStatic t1 = new TestStatic();t1.login();TestStatic t2 = new TestStatic();t2.login();}
}
static初始化模块
- 构造方法用于对象的初始化
- 静态初始化块,用于类的初始化操作
- 可以初始化static属性
- 在静态初始化块中不能直接访问非static成员。
代码块
在类中或者方法中,使用{}括起来的一段代码,就称它是代码块。
代码块分为:局部代码块、初始化代码块、静态代码块三种
-
代码块的声明方式类似于一个没有名称的方法体,代码分实例块和静态块
-
实例块:本质上放到构造方法当中执行的,因此每次创建对象的时候,都会执行初始化代码块; 可以通过反编译查看
{
?
//任何符合语法的Java代码
}
-
静态块: 静态代码块在加载字节码时就会自动调用,在主方法之前执行的。只执行一次,先于main方法。
static{、
?
//任何符合语法的Java代码
}
-