类与对象的关系
类的定义:类是对某一事物的抽象描述
对象的定义:对象用于表示现实中该类事物的个体
例如:人 —-类
人—–类的对象有:小韩、小石、小李、小张
例如人都有姓名、年龄、性别等特征,还有学习、工作、购物等行为。
在Java中,人这个类,可以将姓名、年龄、性别等公有特征写成是人—-类的变量 name、age、sex
将学习、工作、购物等行为写成是人—-类的方法 learn、work、shopping ,毕竟不是每一个人都有学习、工作、购物等行为。
对象的创建于使用
对象创建:
类名 对象名称 = new 类名();
对象使用:
对象名称.变量名(成员变量)
对象名称.方法名称(成员方法、构造方法)
对象创建会占用两块内存区域,栈内存和堆内存
Person p =new Person();
栈内存:用于存放基本类型的变量和对象的引用变量 (Person p)。
堆内存:用户存放由new创建的对象和数组(new Person())。
new 类名().对象成员:这种方式是在通过new关键字创建实例对象的同时就访问对象的某个成员,并且在创建后只能访问其中某一个成员,而不能像对象引用那样可以访问多个对象成员。同时。由于没有对象引用的存在,在完成某一个对象成员的访问后,该对象就会变成垃圾对象。所以,在实际开发中,创建实例对象时多数会使用对象引用。
成员变量:类的成员变量也被称作类的属性,它主要用于描述对象的特征。例如,一个人的基本属性特征有姓名、年龄、性别、职业、住址等信息,在类中要使用姓名、年龄等信息时,就需要先将它们声明(定义)为成员变量。
成员变量:类中定义的变量被称作成员变量。
局部变量:方法内部定义的变量被称作局部变量。
成员方法:也被称为方法,它主要用于描述对象的行为。一个人的基本行为特征有吃饭、睡觉、运动等。
修饰符:public、protected、private,有静态修饰符static,还有最终修饰符final。
返回类型:如果不需要返回值,可以使用void关键字。
参数类型:用于限定调用方法时传入参数的数据类型。
return 关键字:用于结束方法以及返回方法指定类型的值,当方法的返回值类型为void时,return及其返回值可以省略。
返回值:被return语句返回的值,该值会返回给调用者。
访问控制符:访问控制级别由小到大 private(私有) 、default 、protected 、public(公共)
类的封装: 是指将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象的内部信息,而是通过该类所提供的方法来实现对内部信息的操作访问。
Java 在类中的成员变量设置成 private 成员变量,就需要生成对应的get和set方法。
方法的重载和递归:
方法重载:一个类中,创建多个相同方法名的方法,相同名方法中传入不同的参数,在调用相同方法时,传入不同参数来调用不同方法。
例如:
方法一:add(int x, int y) //1.实现两个整数相加
方法二:add(int x, int y, int z) //2.实现三个整数相加
方法三:add(double x, double y) //3.实现两个小数相加
//针对不同求和情况方法的调用
int sum1=add(1,2)
int sum2=add(3,4,7)
double sum3=add(0.2,5.3)
方法递归: 方法的递归是指在一个方法的内部调用自身的过程。递归必须要有结束条件,不然就会陷入无限递归的状态,永远无法结束调用。
方法递归案例:https://blog.csdn.net/qq_45871890/article/details/124223672
构造方法:
构造方法需同时满足以下三个条件:
1、方法名与类名相同
2、在方法名的前面没有返回值类型的声明
3、在方法中不能使用return语句返回一个值,但是可以单独写return语句来作为方法的结束。
无参构造方法
public 类名(){
}
有参构造方法
public 类名(int a){
age=a;
}
构造方法的重载:
与普通方法一样,构造方法也可以重载,在一个类中可以定义多个构造方法,只要每个构造方法的参数类型或参数个数不同即可。在创建对象时,可以通过调用不同的构造方法来为不同的属性进行赋值。
案例:
class Person{
//声明两个成员变量
String name;
int age;
//定义一个有参构造方法
public Person(int a){
age=a;
}
//第一两个有参构造方法,且两个参数类型不一样
public Person(String n,int a){
name=n;
age=a;
}
//定义普通方法,调用成员变量
public void speak() {
system.out.println("我今年"+age+"岁了!");
}
public void say() {
system.out.println("我叫"+name+","今年"+age+"岁了!");
}
}
public class Example10{
public static void mian(String[] args){
//创建一个对象,调用构造方法
类名 对象名称=new 类名();
Person p1=nwe Person(18);
Person p2=new Person("张三",32);
//对象调用普通方法
p1.speak();
p2.say();
}
}
注:构造方法不能封装 ,不能将修饰符public修改成private。
this 关键字:通过this关键字调用成员变量,解决与局部变量名称冲突问题。
例如:
class Person {
int age; //成员变量
public Person(int age){ //有参构造方法 局部变量age
this.age=age; //将局部变量age的值赋值给成员变量age
}
}
通过this关键字调用成员、构造方法。
注意:this可以调用成员变量,不能调用局部变量; this也可以调用成员方法,但是在普通方法中可以省略this,在构造方法中不允许省略,必须是构造方法的第一条语句,而且在静态方法当中不允许出现this关键字。
例如:
class Person {
public Person(){
system.out.println("无参的构造方法被调用了...");
}
public Person(int age){
this(); //调用无参的构造方法
system.out.println("有参的构造方法被调用了...");
}
}
public class Examplell{
public static void main(String[] args){
Person p =new Person(18); //实例化Person对象
}
}
使用this调用类的构造方法时,应注意以下几点:
1、只能在构造方法中使用this调用其他的构造方法,不能在成员方法中使用。
2、在构造方法中,使用this调用构造方法的语句必须是该方法的第一条执行语句,且只能出现一次。
3、不能在一类的两个构造方法中使用this互相调用。
(1)this能出现在实例方法和构造方法中;
(2)this的语法是“this.”和“this()”;
(3)this不能出现在静态方法中;
(4)this大部分情况下是可以省略的;
(5)this.什么时候不能省略呢?
答:在区分局部变量和实例变量时不能省略。例如:
Public void setName(String name){
this.name = name;
}
(6)this()只能出现在构造方法的第一行,通过当前的构造方法去调用“本类”中的对应的构造方法,目的是:代码复用。
static 关键字:static是修饰符,如:成员变量,成员方法,以及代码块等,被static修饰的成员具备一些特殊性。
静态变量使用如下方法访问:类名.变量名静态变量
例如:声明静态变量
class Student{
static String schoolName; // 声明静态变量 schoolName
}
public class Example12{
public static void main(String[] args){
Student stu1= new Student(); // 创建第一个学生对象
Student stu2= new Student(); // 创建第二个学生对象
Student.schoolName="清华大学"; // 为静态变量赋值
//分别输出两个学生对象的信息
System.out.println("我是"+stu1.schoolName+"的学生");
System.out.println("我是"+stu2.schoolName+"的学生");
}
}
注意:static关键字只能用于修饰成员变量,不能用于修饰局部变量,否则编译会报错。
静态方法
如果想要使用类中的成员方法,就需要先将这个类实例化,而在实际开发时,开发人员有时会希望在不创建对象的情况下就可以调用某个方法,这种情况就可以使用静态方法。
静态方法需要在类定义的方法前加上 static 关键字即可。在使用时,静态方法可以通过两种方式访问。
方式一:类名.方法
方式二:实例对象名.方法
注意:在一个静态方法中只能访问用static修饰的成员,原因在于没有被static修饰的成员需要先创建对象才能访问,而静态方法在被调用时可以不创建任何对象。
静态代码块
在java类中,使用一对大括号包围起来的若干行代码被称为一个代码块,用static关键字修饰的代码块称为静态代码块。
static {
.
.
.
}
静态代码块在类第一次使用时才会被加载,并且只会加载一次。