面向对象编程--1、类和对象
1、面向对象编程的概念
- 万物都对象
- 什么是面向对象?
=》面向对象指以属性和行为的观点去分析现实生活中的事物。
- 什么是面向对象编程?
=》面向对象编程指先以面向对象的思想进行分析,然后使用面向对象的编程语言进行表达的过程。
=》有什么样的特征,有什么样的行为,先进行分析,然后采用一门面向对象的编程语言进行翻译的过程
- 什么是编程语言?
=》C语言是面向过程,C++即使面向过程也是面向对象,Java是一门纯粹的面向对象语言
- 什么是面向过程,怎么区分面向对象与面向过程?
=》比如老师需要讲课,而领导给老师布置讲课内容,而布置任务的具体时间,
为9点10分干什么,9点20分干什么,9点30分干什么。。。布置的是全天的详细计划的任务,
第一步,第二步。。。,此为面向过程
=》老师具备讲课的行为,同时具备讲课的实力,领导给老师布置讲课内容,通知今天需要讲课,
没有细分到全天任务,此为面向对象
2、类和对象的概念
- 什么是对象?
=》对象在JAVA语言中对象体现为内存空间中的一块存储区域
- 什么是类?
=》把对象具有相同特性和行为的多个对象共性的抽象描述。
比如人A和人B,有相同的性别,毛发,身高等属性,提取出来为一类。
=》在JAVA语言中体现为一种引用数据类型,里面包含描述特征,属性的成员变量以及描述行为的成员方法。
比如:姓名,年龄,取名叫成员变量,走路,吃饭取名为成员方法
- 类是用于构建对象的模板,对象的数据结构由定义它的类来决定
=》比如:类是设计图,对象是设计图造出来的产品。
3、类的定义
class 类名{
类体;
}
//注意:通常情况下,当类名由多个单词组成时,要求<<每个单词首字母都要大写>>
4、成员变量的定义
class 类名{
数据类型 成员变量名 = 初始值;
}
//注意:当成员变量由多个单词组成时,通常要求<<从第二个单词起每个单词的首字母大写(采用驼峰命名法)>>
5、对象的创建
new 类名();
//注意 A。当一个类定义完毕后,可以使用new关键字来创建该类的对象,这个过程叫做类的实例化
// B。创建对象的本质就是在内存空间的堆区申请一块存储区域,用于存放该对象独有特征信息。
- 创建出来的对象,在内存中申请了一块空间,没有记录名字,称为匿名对象。下次需要使用的时候找不,那么就需要使用引用型变量。
6、引用的定义
- 基本概念
=》A。使用引用数据类型定义的变量叫做引用型变量,简称为“引用”
=》B。引用变量主要用于记录对象在堆区中的内存地址信息,便于下次访问
- 语法格式
类名 引用变量名;
引用变量名.成员变量名;
=》带“名”的都需要遵行命名规则<<从第二个单词起每个单词的首字母大写(采用驼峰命名法)>>
Person p = new Person();
p.name="张飞";
System.out.println(p.name);
//p(申请一块栈区空间) (找)==》 Person 张飞(申请一块堆区空间)
//引用记录堆区中的地址
=》如上代码写完时存放在硬盘中的。CPU无法解析影片里面的代码。所以需要JVM(JAVA虚拟机)加载到内存中,然后CPU来读取。当JVM执行完毕后,代码会把它放在方法区中(字节码文件),程序执行的时候先执行main方法,main方法在栈区申请了一块栈区地盘。new一个对象会在堆区中申请一块堆区,等号的作用就是把堆区中的内存地址指向栈区地址。
7、成员方法的定义
class 类名{
返回值类型 成员方法名(形参列表){
成员方法体;
}
}
=》带“名”的都需要遵行命名规则<<从第二个单词起每个单词的首字母大写(采用驼峰命名法)>>
-
返回值类型的详解
=》返回值主要指从方法体内返回到方法体外的数据内容
=》返回值类型主要指返回值的数据类型,可以是基本数据类型,也可以是引用数据类型
=》数据类型: 一个字节是8位
基本数据类型 | 数值型 | 整数类型 | (byte 1字节、short 2字节、int 4字节、long 8字节) |
浮点类型 | (float 4字节、double 8字节) | ||
字符型 (char) 2字节(只能用单引号来表示) | |||
布尔型 (boolean) 1字节 | |||
引用数据类型 | 类 (class) | ||
接口 (interface) | |||
数组 |
Unicode是16位的
ASCII码是8位的
0:48
A:65
a:97
空格:32
换行:10
基本数据类型之间的转换
范围(最大值) 2^7-1 2^15-1 2^31-1 2^63-1 2^128-1 2^1024-1
1字节 2字节 4字节 8字节 4字节 8字节
byte - short - int - long - float - double
char - int
基本类型 | 字节数 | 包装类 | 最小值 | 最大值 |
byte | 1个 | java.lang.Byte |
Byte.MIN_VALUE -128(-2^7) |
Byte.MAX_VALUE 127(2^7-1) |
short | 2个 | java.lang.Short |
Short.MIN_VALUE -32768(-2^15) |
Short.MAX_VALUE 32767(2^15-1) |
int | 4个 | java.lang.Integer |
Integer.MIN_VALUE -2147483648(-2^31) |
Integer.MAX_VALUE 2147483647(2^31-1) |
long | 8个 | java.lang.Long |
Long.MIN_VALUE -9223372036854775808(-2^63) |
Long.MAX_VALUE 9223372036854775807(2^63-1) |
float | 4个 | java.lang.Float |
Float.MIN_VALUE 1.4E-45(-2^149) |
Float.MAX_VALUE 3.4028235e38(2^128-1) |
double | 8个 | java.lang.Double |
Double.MIN_VALUE 4.9E-324(-2^1074) |
Double.MAX_VALUE 1.7976931348623157E308(2^1024-1) |
1、48个关键字
abstract,assert,
boolean,break,byte,
case,catch,char,class,continue,
default,do,double,
else,enum,extends,
final,finally,float,for,
if,implements,import,int,interface,instanceof,
long,
native,new,
package,private,protected,public,
return,
short,static,strictfp,super,switch,synchronized,
this,throw,throws,transient,try,
void,volatile,
while
2、2个保留字
goto,const
3、3个特殊直接量
true,false,null
=》当返回的数据内容是66时,则返回值类型写int即可
=》当方法体中使用return关键字可以返回具体的数据内容并结束当前方法。
=》当返回的数据内容是66时,则方法体中写return 66;即可
=》当该方法不需要返回任何数据内容时,则返回值类型写void即可。
-
形参列表详解
=》形参参数主要用于将方法体外的数据内容带入到方法体内部
=》形式参数列表主要指多个形式参数组成的列表,语法格式如下:
数据类型 形参变量名1,数据类型 形参变量名2,...
=》当带入的数据内容是"hello"时,则形参列表写String s即可
void show(String s){}
=》当带入的数据内容是66和"hello“时,则形参列表写int i,String s即可
void show(int i,String s){}
=》若该方法不需要带入任何数据时,则形参列表位置啥也不写即可
void show(){}
-
方法体的详解
=》成员方法体主要用于编写描述该方法功能的语句块
=》成员方法可以实现代码的重用,简化代码,重复的代码需要提取为一个方法,减低代码量
-
方法的调用
=》引用变量名.成员方法名(实参列表);
=》实际参数列表主要用于对形式参数列表进行初始化操作,因此参数的个数,类型以及顺序都要完全一致
=》实际参数可以传递直接量,变量,表达式,方法的调用等。
/*
编程实现Person类的定义
*/
public class Person{
//数据类型 成员变量名 = 初始值;
String name; //用于描述姓名的成员变量
int age; //用于描述年龄的成员变量
//自定义成员方法实现所有成员变量的打印
//返回值类型 方法名称(形参列表) { 方法体 }
void show(){
System.out.println("我的姓名:"+name+",今年"+age+"岁");
}
public static void main(String[] args){
//声明Person类型的引用指向Person类型的对象
//数据类型(类名) 引用变量名 = new 类名();
Person p = new Person();
//引用变量名.成员变量名
p.name="zhangfei";
p.age=23;
//引用变量名.成员方法名(实参列表); 由于实参列表里面为空,所以什么都不用传递
//调用方法的本质就是根据方法名跳转过去执行方法体后再跳转回这个位置
p.show();
//实际参数是给形式参数进行赋值
p.setName("guanyu");
p.setAge(22);
p.setNameAge("liubei",20); //开发中不推荐此种方法
p.showArgument(); //无参 什么都不打印
p.showArgument("参数1"); //参数1
p.showArgument("参数1","参数2"); //参数1,参数2
p.showArgument2(1);
p.showArgument2(1,"参数1");
p.showArgument2(1,"参数1","参数2");
p.getName();
p.getAge();
}
//自定义成员方法实现将姓名修改为参数指定数值的行为
void setName(String s){
name = s;
}
//自定义成员方法实现将年龄修改为参数指定数值的行为
void setAge(int i){
age = i;
}
//自定义成员方法实现将姓名,年龄修改为参数指定数值的行为
void setNameAge(String s,int i){
name = s;
age = i;
}
//自定义成员方法实现可变长参数的使用
//参数是args,个数可变,类型是统一的,比如String
//可变长参数可以看着为一维数组
void showArgument(String... args){
for(int i=0;i<args.length;i++)
{
System.out.println("第"+i+"个数值为:"+args[i]);
}
}
//自定义成员方法实现可变长参数,可变长参数必须放在最后面,前面放一个int类型,如下
void showArgument2(int num,String... args){
System.out.println("num:"+num);
for(int i =0;i<args.length;i++)
{
System.out.println("第"+i+"个数值为:"+args[i]);
}
}
//可变型参数可以是int类型
void showArgument3(int... args){
}
//void showArgument4(int... args,int num){} //error
//放回类型 方法名(形参列表){ 返回方法体 }
String getName(){
return name;
}
String getAge(){
return age;
}
}
-
可变长参数
=》返回值类型 方法名(参数的类型...参数名)
=》方法参数部分指定类型的参数个数是可以改变的,也就是0~n个
=》一个方法的形参列表中最多只能声明一个可变长型参,并且需要放到参数列表的末尾
=》(代码如上,代码块)
-
无参有返回值类型
=》代码具体使用如上,代码块
String getName(){
return name;
}
String getAge(){
return age;
}
=》成员变量与局部变量有什么区别?
成员变量都是写在类体的内部,方法体的外部。作用从声明开始一直到类体结束
局部变量要么在方法体类,要不再大括号内。作用从方法体内开始一直到方法体内结束
声明位置不同,作用范围不同。
-
方法的传递过程
=》int max(int a,int b) {... ...} int a=5;int b=6; int res =m.max(5,6);
=》1、为main方法中的变量a,b,res分配空间并初始化
=》2、调用max方法,为max方法的形参变量ia,ib分配空间
=》3、将实参变量的数值赋值到形参变量的内存空间中
=》4、max方法运行完毕后返回,形参变量空间释放
=》5、main方法中的res变量得到max方法的返回值
=》6、main方法结束后释放相关变量的内存空间
-
传递参数注意事项
=》基本数据类型的变量作为方法的参数传递时,形参变量数值的改变通常不会影响到实参变量的数值,因为两个变量有各 自独立的内存空间。(基本数据类型里面存放的是数值)
=》引用数据类型的变量作为方法的参数传递时,形参变量指向内容的改变会影响到实参变量指向内容的数值,因为两个变 量指向同一块内存空间(引用数据类型里面存放的时地址)
/*
编译实现参数传递的测试
*/
public class ArgumentTest{
//自定义成员方法打印参数传入的整数数据
//int ia=ib=10;
void show(int ia){
ia=200;
System.out.println("show方法中:ia="+ia);//200
}
//自定义成员方法打印参数传入的数组内容
void show2(int[] arr){
arr[0]=200;
System.out.println("arr[0]="+arr[0]); //200
}
public static void main(String[] args){
//声明ArgumentTest类型的引用指向该类型的对象
ArgumentTest at = new ArgumentTest();
int ib=10;
at.show(ib);
System.out.println("main方法中,ib="+ib); //ib=10
int[] arr2=new int[10,20];
at.show2(arr2);
System.out.println("arr2[0]="+arr2[0]); //200
}
}
=》当引用数据类型的变量作为方法的参数传递时,若形参变量改变指向后再改变指定的内容,则通常不会影响到实参变量 指向内容的改变,因为两个变量指向不同的内存空间
/*
编译实现参数传递的测试
*/
public class ArgumentTest{
//自定义成员方法打印参数传入的整数数据
//int ia=ib=10;
void show(int ia){
ia=200;
System.out.println("show方法中:ia="+ia);//200
}
//自定义成员方法打印参数传入的数组内容
void show2(int[] arr){
arr=new int[2]; //加上改这行代码,相当于在堆区中又重新申请了一块内存空间
arr[0]=200;
System.out.println("arr[0]="+arr[0]); //200
}
public static void main(String[] args){
//声明ArgumentTest类型的引用指向该类型的对象
ArgumentTest at = new ArgumentTest();
int ib=10;
at.show(ib);
System.out.println("main方法中,ib="+ib); //ib=10
int[] arr2=new int[10,20];
at.show2(arr2);
System.out.println("arr2[0]="+arr2[0]); //10
}
}
-
内存结构之栈区
=》栈用于存放程序运行过程当中所有的局部变量。一个运行的JAVA程序从开始到结束会有很多次方法的调用
=》JVM会为每一个方法的调用再栈中分配一个对应的空间,这个空间称为该方法的栈帧。一个栈帧对应一个正在调用中的 方法,栈帧中存储了该方法的参数,局部变量等数据。
=》当某一个方法调用完成后,其对应的栈帧将被清除。
本文地址:https://blog.csdn.net/LuckyToXS/article/details/107572646
上一篇: 07:面向对象【4】
下一篇: 你应该掌握的几个面向对象的概念