Java面向对象(类、方法重载、this关键字)
一、什么是对象
程序员眼里的面向对象思想:
- 一切客观存在的食物都是对象,即:“万物皆对象”
- 任何对象一定具有自己的特征和行为(即:属性和方法)
- 特征: 称为属性,一般为名词,代表对象有什么
- 行为: 称为方法,一般为动词,代表对象能做什么
- 现实中的对象多数来自于“模板”,而程序中的对象也不例外也具有相应的“模板”
对象的创建:
public class classDemo1 {
public static void main(String[] args) {
Dog myDog = new Dog(); //基于Dog类创建对象
myDog.breed = "萨摩"; //访问属性:对象名.属性名 = 值; //赋值
myDog.age = 2;
myDog.sex = "公";
myDog.furColor = "白色";
System.out.println(myDog.breed + "\t" + myDog.age + "\t" + myDog.sex + "\t" + myDog.furColor);
// 访问属性:对象名.属性名; //取值
myDog.eat( );
myDog.sleep( );
// 调用方法:对象名.方法名( );
}
}
对象创建过程:
public class demo {
public static void main(String[] args) {
Student1 s = new Student1(); // new Student1(); 触发对象创建
}
}
class Student1{ //1.内存中开辟空间
String name; //2.为各个属性赋予初始值
int age; //3.执行构造方法中的代码
String sex; //4.[将对象的地址赋值给变量]
double score;
public Student1(){
System.out.println("Student() Executed");
}
}
对象中的内存分布:
存储对象的变量中保存对象的地址,通过变量中的地址访问对象的属性和方法
二、什么是类
什么是类?
类(Class)是面向对象程序设计实现信息封装的基础
类的定义:
public class Dog{
String breed; //品种 属性:通过变量表示,又称实例方法,又称实例变量。
int age; //年龄 语法:数据类型 属性名;
String Sex; //性别 位置:类的内部,方法的外部。
String furColor; //毛色
public void eat(){ //方法:通过函数表示,又称实例方法
System.out.println("eating..."); //语法:
} // public 返回值类型 方法名(形参){
public void sleep(){ // //方法的主体
System.out.println("sleeping..."); //}
}
}
三、类的组成
- 属性: 比如:学生的属性有姓名、性别、出生年月、家庭住址、电话等
- 比如: 学生的行为(也就是方法)有学习、打游戏、看电影等
类与对象的关系:
- 类: 定义了对象具有的特征和行为,类是对象的模板
- 对象: 拥有多个特征和行为的实体,对象是类的实例
实例变量:
- 思考:之前学习局部变量时,要求先赋值再使用,否则编译错误。对于实例变量而言,未赋值并不会编译错误,能否直接访问?
public class classDemo1 {
public static void main(String[] args) {
Dog myDog = new Dog(); //基于Dog类创建对象
// 实例变量的默认值: 整数:0 小数:0.0 字符:\u0000 (空格) 布尔:False 其他:null
// 省略赋值语句
System.out.println(myDog.breed + "\t" + myDog.age + "\t" + myDog.sex + "\t" + myDog.furColor);
// 运行结果: null 0 null null
}
}
实例变量与局部变量的区别:
| 种类 | 局部变量 | 成员变量 |
|---|---|---|
| 定义位置 | 方法或方法内的构造当中 | 类的内部,方法的外部 |
| 默认值 | 无默认值 | 字面值与数组相同 |
| 适用范围 | 从定义行到包含其构造结束 | 本类有效 |
| 命名冲突 | 不允许重名 | 可与局部变量重名,局部变量优先 |
实例方法:
实例方法包含两部分: 方法的声明和方法的实现
- 方法的声明:
- 代表对象能做什么
- 组成: 修饰符、返回值类型和方法名(形参列表)
- 方法的实现:
- 代表对象怎么做: 即如何实现对应的功能
- 组成:{}
四、方法重载
什么是方法的重载?
- 一个类中定义多个相同名称的方法
- 要求:
- 方法名称相同
- 参数列表不同(类型、个数、顺序)
- 与访问修饰符、返回值无关
- 好处: 屏蔽使用差异、灵活、方便
注意:只是参数不同并不能构成方法的重载。
- 有些情况下,对象的同一种行为可能存在多种实现过程。
- 例如:人对象的eat行为,吃饭,吃药和嚼口香糖的过程就存在差异。
public class Person{
public void eat(食物 a){
//食物放入口中
//咀嚼
//咽下
}
public void eat(药物 b){
//药物放入口中
//喝水
//咽下
}
public void eat(口香糖 c){
//口香糖放入口中
//咀嚼
//吐出
}
}
五、构造方法
什么是构造方法呢?
- 类中的特殊方法,主要用于创建对象
- 特点:
- 名称与类名完全相同
- 没有返回值类型
- 创建对象时,触发构造方法的调用,不可通过句点手动调用
注意:如果没有在类中显示定义构造方法,则编译器默认提供无参构造方法
构造方法的重载:
构造方法也可以重载,遵循重载规则
public class demo {
public static void main(String[] args) {
// Student1 s = new Student1();
new Student1();
new Student1("tom");
new Student1("jack", 20);
// 创建对象时,根据传入参数,匹配对应的构造方法。
}
}
class Student1{
String name;
int age;
String sex;
double score;
public Student1(){
System.out.println("Student1() Executed");
}
public Student1(String name){
System.out.println("Student1(String name) Executed");
}
public Student1(String name,int age){
System.out.println("Student1(String name,int age) Executed");
}
}
/*
输出结果:
Student1() Executed
Student1(String name) Executed
Student1(String name,int age) Executed
*/
默认构造方法:
public class demo {
public static void main(String[] args) {
Student1 s = new Student1(); //编译错误:无参构造方法未定义
}
}
class Student1{
String name; //在类中,如果没有显示定义构造方法,则编译器默认提供无参构造方法。
int age;
String sex;
double score;
public Student1(String n, int a, String s, double sc){
//如果已经手动添加有参构造方法,则无参构造方法不在默认提供,可更具需求自行添加。
}
}
构造方法为属性赋值:
public class demo {
public static void main(String[] args) {
Student1 s = new Student1("tom", 20,"male", 98.5); //创建对象的同时,将值传入构造方法
System.out.println(s.name + "\t" + s.age + "\t" + s.sex + "\t" + s.score);
}
}
class Student1{
String name; //tom 20 male 98.5
int age;
String sex;
double score;
public Student1(String n, int a, String s, double sc){
name = n;
age = a;
sex = s;
score = sc; //由构造方法为各个属性赋值
}
}
六、this关键字
public class demo {
public static void main(String[] args) {
Student1 s1 = new Student1(); //0x0000A0001
s1.sayHi(); //创建对象s1时,this指向0x0000A0001,访问的name属性即是0x0000A0001地址中的name空间。
Student1 s2 = new Student1(); //0x0000A0002
s2.sayHi(); //创建对象s2时,this指向0x0000A0002,访问的name属性即是0x0000A0002地址中的name空间。
}
}
class Student1{
String name;
int age;
String sex;
double score;
public void sayHi(){
// 类是模板,可服务于此类的所有对象,当类服务于某个对象时,this则指向这个对象。
System.out.println(this.name); // this是类中的默认引用,代表当前实例。
}
}
this关键字的用法:
- 调用实例属性、实例方法,如:this.name、this.sayHi();
public class demo {
public static void main(String[] args) {
Student1 s1 = new Student1(); //0x0000A0001
s1.sayHi();
}
}
class Student1{
String name = "tom";
public void sayHi(){
String name = "jack"; //当实例变量与局部变量重名时,优先访问局部变量;此时如需访问实例变量则需要this.前缀。
System.out.println(name); //不存在重名时,则可以省略this
System.out.println(this.name);
}
}
/*
jack
tom
*/
- 调用本类中其他构造方法,如:this(); this(实参);
class student1{
String name;
int age;
String sex;
Double score;
public student1(String name, int age, String sex){
this.name = name; //在构造方法中,调用本类其他构造方法,即可复用构造方法中的逻辑代码。
this.age = age;
this.sex = sex;
}
public student1(String name, int age, String sex,Double score){
this(name, age, sex); //this(实参):调用有参构造 必须在构造方法的首行
// 四参构造方法将接收到的实参直接传递给三参构造进行属性赋值。
this.score = score; // this():调用无参构造
}
}
本笔记仅限参考使用
参考博客:https://blog.csdn.net/weixin_44170221/article/details/104310533

浙公网安备 33010602011771号