1、方法体外声明的变量叫成员变量。(成员变量中的实例变量,必须先创建对象,通过“引用”来访问。)
2、方法体中声明的变量叫做局部变量。
属性的访问
1、引用类里的对象(用.)
一、程序在什么情况下会显示空指针异常(NullPointerException)
空引用访问实例【对象相关】相关数据时,都会出现空指针异常。
垃圾回收器主要针对堆内存。
二、方法在调用时参数是如何传递的?
Java中关于方法调用时参数传递实际上只有一个规则:
不管你是基本数据类型,还是引用类型,实际上在传递的时候都是将变量保存的那个“值”复制一份,传过去。
三、构造方法
构造方法的定义方式:
class 类名称
{
访问权限 类名称(类型1 参数1,类型2 参数2······)//构造方法
{
程序语句;//构造方法没有返回值
}
}
1、当一个类中没有提供任何构造方法,系统默认提供一个无参数的构造方法,这个无参数的构造方法叫做缺省构造器。
2、当一个类中手动的提供了构造方法,那么系统将不再提供无参数的构造方法。(把无参数的构造方法写出来便解决了出现错误)
3、无参数构造方法,和有参数的构造方法可以同时调用。
a3 s1= new a3();
a3 s2= new a3(10);
4、构造方法支持方法重载吗?
构造方法是支持方法重载的。在一个类当中构造方法可以有多个,并且所有的构造方法名字都是一个样的。
方法重载特点:
在同一个类中,方法名相同,参数列表不同,
4、构造方法对应的英语单词:Constructor【构造器】
5、构造方法作用:创造对象,并创建对象的过程中给属性赋值(初始化)
思考:实例变量没有手动赋值的时候,实际上系统就会默认赋值,那么这个默认赋值操作是在什么时间进行的?是在类加载的时候给这些实例变量赋值的吗?
答:不是,实例变量是在构造方法执行的过程中完成初始化的,完成赋值的。
6、对于实例变量来说,只要你在构造方法中你没有手动给它赋值,统一都会默认赋值,默认系统值。
四、封装
1、面向对象的三大特征:
- 封装
- 继承
- 多态
有了封装,才有继承,有了继承,才能说多态
2、什么是封装?有什么用?
内部的复杂机构包装起来
保证内部结构的安全;屏蔽复杂,暴露简单
3、怎么进行封装?代码怎么实现?
第一步: 属性私有化(使用private关键字进行修饰)
第二步:对外提供简单的操作入口。(对外提供set方法和get方法作为操作入口,并且都不带static。都是实例方法,实例方法的调用必须先new对象。)外部程序只能通过set方法修改,只能通过get方法读取,可以在set方法中设立关卡来保证数据的安全兴。
注意:Java开发规范中要求,set方法和get方法要满足以下格式。
get方法的要求:
public 返回值类型 get+属性名首字母大写(无参){
return xxx;
}
set方法的要求:
public void set+属性名首字母大写(有一个参数){
xxx = 参数;
}
封装练习代码:
class Mycat{
private int age;//私有化猫的年龄
private float weight; //私有化猫的体重
//定义有参数的构造函数
public Mycat(int a,float wt){
//调用私有的SetAge()方法
SetAge(a);
//调用私有的SetWeight()方法
SetWeight(wt);
}
//私立的方法
private void SetAge(int a)
{
if(a<0)
System.out.println("age的设置非法(应该是>0)");
else if(a<=100)
{
age = a;
// System.out.println("我的这只猫的年龄为:"+ age);
}
else
System.out.println("age设置非法!!!");
}
private void SetWeight(float wt)
{
if(wt<0)
{
System.out.println("weight设置非法(应该是>0)");
}
else if(wt<=100)
{
weight=wt;
// System.out.println("我的这只猫的体重为:" + weight);
}
else
{
System.out.println("weight设置非法!!!");
}
}
//创建共有的方法Getage()作为与外界通信的接口
public int Getage()
{
return age;
}
//创建共有的方法GetWeight()作为与外界通信的接口
public float GetWeight()
{
return weight;
}
}
public class TestEncapsulation {
public static void main(String[] args){
Mycat aCat = new Mycat(1001,-20f);
// aCat.Getage();
// aCat.GetWeight();
System.out.println("我的这只猫的年龄为:"+aCat.Getage());
System.out.println("我的这只猫的体重为:"+aCat.GetWeight());
}
}
输出结果为:

image.png