苦学Java笔记(day08)

面向对象

1.设计对象并使用

(1)类和对象

类(设计图)

是对象共同特征的描述

对象

根据类造出来的东西
在Java中,必须先设计类,才能获得对象。

如何定义类
public class 类名 {
	1.成员变量(代表属性,一般是名词)//只定义不给值
	2.成员方法(代表行为,一般是动词)
	3.构造器
	4.代码块
	5.内部类
}
如何得到类的对象
类名 对象名 = new 类名 ();
如何使用对象
访问属性
对象名.成员变量
访问行为
对象名.方法名(…)

(2)类的几个补充注意事项

Javabean类

用来描述一类事物的类
在Javabean类中,是不写main方法的。
在以前,编写main方法的类,叫做测试类
我们可以在测试类中创建Javabean类的对象并进行赋值调用。
类名首字母建议大写,需要见名知意,驼峰模式。
一个Java文件中可以定义多个class类,且只能一个类是public修饰,而且public修饰的类名必须成为代码文件名。
实际开发中建议一个文件定义一个class类。
成员变量的完整定义格式:

修饰符 数据类型 变量名称 = 初始化值;//一般无需指定初始化值,存在默认值

初始化值:
基本类型:
byte、short、int、long:0
float、double:0.0
boolean:false
引用类型:
类、接口、数组、String:null

IDEA快捷键:批量修改:按住鼠标滚轮不松,或
按住Alt不送,鼠标左键

2.封装

面向对象三大特征:封装、继承、多态
封装:告诉我们,如何正确设计对象的属性和方法
对象代表什么,就得封装对应的数据,并提供对应的行为
人画圆属于圆的方法

private关键字

是一个权限修饰符
可以修饰成员(成员变量和方法)
被private修饰的成员只能在本类中才能访问

public class GirlFriend{
	private String name;
	private int age;
	private gender;
}

IDEA使用技巧:右键点击类 -> Split and Move Right

为了安全,在所有的成员变量前面加上private
对每一个私有化的成员变量,都要提供get和set方法
set方法:给成员变量赋值
get方法:对外提供成员变量的值
get和set方法是public的

public void setName(String n){
	name = n;
}
public void getName(){
	return name;
}
public void setAge(int n){
	if(n >= 18 && n <= 50){
		age = n;
	} else {
		System.out.println("Input error");
	}
}
public int getAge(){
	return age;
}

(字符串比较)

public void setGender(String g){
	gender = g;
}
public String getGender(){
	return gender;
}

在测试类中,调用对象的成员变量,不能再通过“.”,而要通过get和set方法来调用。

publci GirlFriendText{
	GirlFriend gf1 = new GirlFriend();
	gf1.setName("Linda");
	gf1.steAge(18);
	gf1.setGender("female");
	System.out.println(gf1.getName);
	System.out.println(gf1.getAge);
	System.out.println(gf1.getGender);
}

3.this关键字

(1)成员变量

类中方法外
没有上下顺序(一般写在最上面)

(2)局部变量

方法中

(3)就近原则

当成员变量和局部变量重名时:谁离我近,我就用谁。

(4)this

如果在变量的前面,用了this关键字,就不会用方法中的age,而是直接用成员变量中的age。

publci class GirlFriend{
	private int age;
	public void method(){
		int age = 10;
		System.out.println(this.age);
	}
}
publci class GirlFriend{
	private int age;
	public void method(){
		//int age = 10;
		System.out.println(this.age);//this可省略不写
	}
}
System.out.println(age);//先在局部变量中找age,没有,再去成员变量中找
System.out.println(this.age);//不会在局部变量中找,直接在成员变量中找

(5)运用this关键字

public void setName(String name){//name表示测试类中传过来的name
	this.name = name;
}
public void setAge(int n){
	if(age >= 18 && age <= 50){
		this.age = age;
	} else {
		System.out.println("Input error");
	}
}
public void setGender(String gender){
	this.gender = gender;
}

(6)this的作用

可以区别成员变量和局部变量

(7)this的本质和内存图

this的本质

所在方法调用者的地址值,如,s.method();
调用者就是s

this的内存原理
s1.setNmae("竹小玲");//把s1(001)的name成员变量的值赋值为"竹小玲"
s2.setName("桥小久");//把s2(002)的name成员变量的值赋值为"桥小久"

(8)成员变量和局部变量区别

成员变量局部变量
类中方法外方法内、方法申明上
有默认初始化值没有默认初始化值,使用之前需要完成赋值
随着对象的创建而存在,随着对象的消失而消失随着方法的调用而存在,随着方法的运行结束而消失
整个类中有效当前方法中有效

4.构造方法

(1)别名

也叫作构造器、构造函数(一般叫构造方法)

(2)作用

在创建对象的时候自动调用,给成员变量进行初始化的

(3)格式

修饰符 类名 (参数) {
	方法体;
}

特点:
1.方法名与类名相同,大小写也要一致
2.没有返回值类型,连void都没有
3.没有具体的返回值(不能写return,否则报错)

分为空参构造方法和带全部参数构造方法

(4)执行时机

1.创建对象的时候由虚拟机调用,不能手动调用构造方法
2.每创建一次对象,就会调用一次构造方法

(5)虚拟机与空参构造方法

1.如果我们没有写任何的构造方法,那么虚拟机会给我们加上一个默认的空参构造方法(赋值为默认初始化值);
2.如果定义了构造方法,系统将不再提供默认的构造方法。
3.带参构造方法和无参构造方法,两者方法名相同,但是参数不同,这叫作构造方法的重载。
4.推荐的使用方式:无论是否使用,都手动书写无参构造方法,和带全部参数的构造方法(一个项目的代码不是一个人完成的)。

//空参构造方法
publci Student(){
}
//带全部参数构造方法
public Student(String name,int age){
	this.name = name;
	this.age = age;
}
//测试类中
Student s = new Student("Lisa",20);

5.标准JavaBean

1.类名需要见名知意
2.成员变量使用private修饰
3.至少提供两个构造方法:无参和带全部参数构造方法
4.成员方法:提供每一个成员变量的get和set方法;如果还有其他行为,也需要写上。

IDEA快捷键

Alt+insert,或
Alt+Fn+inser

(1)生成空参构造方法

Constructor -> Select None

(2)生成带全部参数的构造方法

Constructor -> 按住Sift不松 -> 全选(或Ctal+A)

(3)生成get和set方法

Getter and Setter -> 全选

IDEA插件PTG(1s生成标准Javabean)

File -> Settings -> Plugins -> Installed -> 搜索PTG -> Install -> 右键点击空白处 -> Ptg To Javabean

6.对象内存图

(1)一个对象的内存图

1.加载class文件(方法区)
2.申明局部变量(栈)(=左边)
3.在堆内存中开辟一个空间(堆)(=右边)(拷贝成员变量和(成员方法的地址))
4.默认初始化
5.显示初始化(在Javabean类中定义成员变量时,直接给值,会给对象初始化为对应的值)
6.构造方法初始化(调用有参构造方法)
7.将堆内存中的地址值赋值给左边的局部变量

(2)多个对象的内存图

Javabean类的class文件只需在方法区加载一次

(3)两个变量指向同一个对象的内存图

Student stu2 = stu1;
/*没有new关键字,在堆中不会开辟一块新的空间
只是把堆中所创建的对象的地址复制给了stu2*/
stu1.name = "阿珍";//指向的是堆中的同一个对象,其中一个变量对堆中对象的成员变量进行改变
System.out.println(stu1.name);
System.ou.println(stu2.name);//其他变量再次访问的时候,是改变之后的值
//指向的是堆中的同一个对象,所以输出内容都是对象中的name成员变量的值
stu1 = null;//断开指向关系
System.out.println(stu1.nam);//NullPointerException(空指针异常)
  • 26
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值