文章目录
前言:
还在学习走的过程中
水平有限,不足之处望请斧正。
1.类和对象的基本概念
类:
- 抽象的概念集合,表示的是一个共性的产物,类之中定义的是属性(指事物的特征) 和行为(方法)指事物能执行的操作
- 类是对象的数据类型,类是具有相同属性和行为的一组对象的集合
对象:
- 对象是一种个性的表示,表示一个独立的个体,每个对象拥有自己独立的属性,依靠属性来区分不同对象。
- 是能够看得到摸的着的真实存在的实体
**简单理解:**类是对象的模板,对象是类的实例。类只有通过对象才可以使用,而在开发之中应该先产生类,之后再产生对象。类不能直接使用,对象是可以直接使用的。
2.类与对象的定义和使用
类的定义步骤:
①定义类
②编写类的成员变量
③编写类的成员方法
1.创建类的语法:
public class 类名 {
// 成员变量
的数据类型 变量1;
…
// 成员方法
方法1;
}
代码示例:
public class Person {
//定义属性
String name ; //姓名
int age ; //年龄
String sex ; //性别
//定义方法
public void print() {
System.out.println("姓名:" + name + ",年龄:" + age + "性别" + sex) ;
}
}
2. 创建具体的对象:
-
对象的产生格式:
-
(1)格式一:声明并实例化对象
类名称 对象名称 = new 类名称 () ;
-
格式二:先声明对象,然后实例化对象:
类名称 对象名称 = null ; 对象名称 = new 类名称 () ;
-
-
调用成员的格式:
- 对象名.成员变量 : 表示调用类之中的属性;
- 对象名.成员方法() : 表示调用类之中的方法。
代码示例:(创建一个Person 类的对象)
public class Test {
public static void main(String[] args) {
//创建一个实例化对象
Person per1 = new Person();
//通过对象来调用实例变量、成员方法
per1.name = "张三";
per1.age = 18;
per1.sex = "女";
per1.print();
Person per2 = new Person();
per2.print();
}
}
输出结果:
姓名:张三,年龄:18 性别女
姓名:null,年龄:0 性别null
注意:
- 在Java中一个源文件(*.java)只可以存在一个主类(public class)
- 类中定义的成员变量都有默认值
3. Java中的访问修饰符
修饰符 | 当前类 | 同一个包 | 不同包但为父子关系 | 不同包且不是父子关系 |
---|---|---|---|---|
private | √ | ╳ | ╳ | ╳ |
default(默认) | √ | √ | ╳ | ╳ |
protected | √ | √ | √ | ╳ |
public | √ | √ | √ | √ |
1.public ( 公共权限): public可以修饰类,成员变量,构造方法,方法。被public修饰的成员,可以在任何一个类中被调用,不管同包或不同包,是权限最大的一个修饰符。
2. protected : protected可以修饰成员变量,构造方法,方法成员, 不能修饰外部类。被protected修饰的成员,能在定义它们的类中,同包的类中被调用。 如果有不同包的类想调用它们,那么这个类必须是定义它们的类的子类。
3. default (默认权限): 类,成员变量,构造方法,方法都能够使用默认权限,即无需写任何关键字。默认权限即同包权限,同包权限只能由本类中以及同包的类中访问。
**4. private (私有权限): ** private可以修饰成员变量,方法, 不能修饰外部类 。被private修饰的成员,只能在定义它们的类中使用,在其他类中不能调用。
4. 封装
概念
将类的某些信息隐藏在类的内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的访问和操作。
成员变量private,提供对应的getXxx()/setXxx()方法
目的
- 提高安全性
- 提高重用性
4.1 封装的实现步骤
- 修改属性的可见性设为(private)
- 创建getter/setter方法(用于属性的读写(通过这两种方法对数据进行获取和设定,对象通过调用这两种发方法实现对数据的读写)
- 在getter/setter方法中加入属性控制语句(对属性值的合法性进行判断)
代码示例:
public class Person {
//定义属性
private String name ; //姓名
private int age ; //年龄
private String sex ; //性别
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
//定义方法
public void print() {
System.out.println("姓名:" + name + " 年龄:" + age + " 性别 " + sex) ;
}
}
5.构造方法
5.1 构造方法的基本概念及作用
定义:就是类构造对象时调用的方法,主要用来实例化对象。构造方法分为无参构造方法、有参构造方法
-
作用: 创建对象
例如 : Person per = new Person () ;
-
格式:
public class 类名(){ //无参构造 修饰符 类名(){ }; //含参构造 修饰符 类名( 变量类型 变量名 , 变量类型 变量名 ...) { }; }
-
功能: 完成对象数据的初始化
5.2 注意事项
- 构造方法的方法名必须与类名一致
- 构造方法没有返回值类型 ,同时返回类型不能写void (无需申明返回值类型)
- 构造方法不是编程人员调用的而是有虚拟机自动调用给成员变量进行初始化
- 构造方法有两种分为 无参构造和有参构造
- 无参构造:初始化的对象时,成员变量的数据均采用默认值。
- 有参构造:在初始化对象的时候,同时可以为对象进行赋值。
- 任何类定义出来,默认就自带了无参数构造器,一旦定义了有参数构造器,无参数构造器就没有了,此时就需要自己写无参数构造器了
- 构造方法可以重载;
- 建议无论是否使用,都手工书写无参数构造方法
6.This关键字
用途:
- this调用本类中的属性,也就是类中的成员变量;
- this调用本类中的其他方法;
- this调用本类中的其他构造方法,调用时要放在构造方法的首行。
应用一: 通过this关键字可以明确的访问一个类的成员变量,解决成员变量与局部变量名称冲突问题。
public class Person {
private String name ;
private int age ;
//无参构造
public Person(){
}
//含参构造
public Person(String name , int age ){
this.name = name ;
this.age = age ;
}
/*
在Person类构造方法中局部变量(构造函数中的参数变量)和成员变量相同 , this 表示当前对象
this.name = name 表示一个赋值语句 .等号左边表示当前对象所具有的变量name , 等号右边的name 表示参数传递过来的数值;
如果写成 name = name 则根据就近原则会把 局部变量(构造函数中的参数变量)赋值给自己,无法对成员变量进行赋值
*/
}
应用二:让类中一个方法,访问该类里的另一个方法
public class Dog (){
//定义一个 jump 方法
public void jump (){
System.out.println("正在执行jump方法");
}
// 定义一个run()方法,run()方法需要借助jump()方法
public void run() {
this.jump();
System.out.println("正在执行 run 方法");
}
/*
当程序调用 run( ) 方法时,一定会提供一个 Dog 对象,
因此需要在 run() 方法中调用jump方法,通过 this 关键字就可以满足这个要求。
this 可以代表任何对象,当 this 出现在某个方法体中时,它所代表的对象是不确定的,但它的类型是确定的,它所代表的只能是当前类的实例。
只有当这个方法被调用时,它所代表的对象才被确定下来,谁在调用这个方法,this 就代表谁。
*/
}
注意:对于 static 修饰的方法而言,可以使用类来直接调用该方法,如果在 static 修饰的方法中使用 this 关键字,则这个关键字就无法指向合适的对象。所以,static 修饰的方法中不能使用 this 引用。并且 Java 语法规定,静态成员不能直接访问非静态成员。
在现实世界里,对象的一个方法依赖于另一个方法的情形很常见,例如,吃饭方法依赖于拿筷子方法,写程序方法依赖于敲键盘方法。这种依赖都是同一个对象两个方法之间的依赖。因此,Java 允许对象的一个成员直接调用另一个成员,可以省略 this 前缀。也就是说,将上面的 run( ) 方法改为如下形式也完全正确。大部分时候,一个方法访问该类中定义的其他方法、成员变量时加不加 this 前缀的效果是完全一样的。
public void run() {
jump();
System.out.println("正在执行run方法");
}
应用三:this( )访问构造方法
使用 this( ) 调用构造方法给 name 赋值,Student 类的代码如下所示:
public class Student {
String name;
// 无参构造方法(没有参数的构造方法)
public Student() {
this("张三");
}
// 有参构造方法
public Student(String name) {
this.name = name;
}
// 输出name和age
public void print() {
System.out.println("姓名:" + name);
}
public static void main(String[] args) {
Student stu = new Student();
stu.print();
}
}
输出结果为:
姓名:张三
注意:
- this( ) 不能在普通方法中使用,只能写在构造方法中。
- 在构造方法中使用时,必须是第一条语句。
7. 成员变量和局部变量的区别
区别 | 成员变量 | 局部变量 |
---|---|---|
类中位置不同 | 类中,方法外 | 方法内,方法的参数 |
初始化值不同 | 有默认初始值 | 没有初始值,使用之前需要赋值 |
内存位置不同 | 堆内存 | 栈内存 |
生命周期不同 | 随着对象的创建而存在,随着对象的的消失而消失 | 随着方法的调用而存在,随着方法的运行结束而消失 |
作用域 | 整个类中有效 | 当前方法中有效 |
今天的分享就到这里了,期待与你共同进步!
如有不足欢迎留言指正 !