一、思维导图
二、什么是类?
类的目的是为了抽象出一类事物共有的属性和行为功能。通过定义一个类可以实例化很多对象。也就是说,类其实就是创建对象的一个模板,没有类就没有对象。
2.1、类体
2.1.1变量的类型
2.1.2变量的有效范围
下面举一个例子来看一下:
public class A {
int m=10,sum=0; //成员变量,在整个类中都有效
void f() {
if(m>9) {
int z=10; //z是方法参数,但是出现在if复合语句中,所以仅在该复合语句中有效
z=2*m+z;
}
for(int i=0;i<m;i++) {
sum=sum+i; //同理,i仅在for循环语句中生效
}
m=sum; // 合法
z=i+sum; //非法,i和z已失效;
}
}
如果想要局部变量的名字和成员变量的名字相同,则使用this关键字,则成员变量被隐藏,及这个成员变量在这个方法中暂时失效。
2.2、方法的重载
方法重载是多态性的一种,指一个类中可以有多个方法具有相同的名字,但这些方法的参数必须不同,也就是要么是参数名不同,要么是参数的个数不同。从而通过一个方法名实现功能的多样性。
如:求面积,通过Area类中getArea这个方法名,通过传入不同的参数获取不同图形的面积。
public class Area {
float getArea(float r) {
return 3.14f*r*r;
}
double getArea(float x,int y) {
return x*y;
}
float getArea(int x,float y) {
return x*y;
}
}
注意:方法的返回类型和参数的名字不参与比较,也就是说,如果两个方法的名字相同,即使类型不同,也必须保证参数不同。
public class Area {
float getArea(float r) {
return 3.14f*r*r;
}
double getArea(float r) { //错误,duplicate method getArea in type Area
return 3.14f*r*r;
}
}
2.3、构造方法
构造方法是一种特殊的方法,他的名字必须和他所在的类的名字完全相同,而且没有类型,构造方法也可以重载。
class 梯形 {
float 上底,下底,高;
梯形(){ //构造方法
上底=60;
下底=100;
高=20;
}
梯形(float x,float y,float h){ //重载
上底=x;
下底=y;
高=h;
}
}
如果类中没有编写构造方法,系统会默认该类只有一个无参数,且方法体中没有语句的构造方法。
2.4、易犯错误
1、可以在声明类的成员变量的同时赋予其初值,但对成员变量的操作只能放在方法中,这是因为类体的内容由成员变量的声明和方法的定义两部分组成。
这样是错误的:
class A{
int a;
float b;
a=12; //非法
b=12.56f;
}
这样是正确的:
class A{
int a=12;
float b=12.56f;
}
或者
class A{
int a;
float b;
void f(){ //可以在方法中操作
int c;
a=12;
b=12.56f;
c=100;
}
}
2、实例方法既能对类变量操作也能对实例变量操作,而类方法只能对类变量进行操作。
int a;
static int b;
void f(int x,int y) { //实例方法无限制
a=x;
b=y;
}
static void g(int z) { //类方法
b=23; //合法,b是类方法
a=z; //非法,类方法不能操作实例变量a
}
}
3、一个类中的方法可以互相调用,实例方法可以调用该类中的其他方法;类中的类方法只能调用该类中的方法,不能调用实例方法。
三·、对象
类中声明的变量称为对象,对象负责存放引用,以确保对象可以操作分配给该对象的变量以及调用类中的方法。
2.1创建对象
包括对象的声明和为对象分配变量两个步骤,声明一个对象后得到一个空对象,空对象不能使用。
四、 static关键字
实例变量与类变量的区别:
实例成员变量的引用存储在栈中,实体存储在堆中,不同对象的实例变量互不相同,为他们分配了不同的存储空间。实例对象可以通过对象访问,不能使用类名访问。
类变量存储在类方法的方法区中,所有的对象共享类变量,不再重新分配内存,不仅可以通过某个对象访问,也可以通过类名访问。
五、this关键字
this关键字可以出现在实例方法和构造方法中,但是不能出现在类方法中。因为类方法可以通过类名直接调用,这时,可能还没有任何对象产生。
5.1在构造方法中使用this
当this关键字出现在类的构造方法中时,代表使用该构造方法所创建的对象。
public class People {
int leg,hand;
String name;
People(String s){
name=s;
this.init(); //也可以省略this,写成init()
}
void init() {
leg=2;
hand=2;
System.out.println(name+"有"+hand+"只手"+leg+"条腿");
}
public static void main(String[] args) {
People yuanyuan=new People("媛媛"); //创建yuanyuan时,构造方法中的this就是对象yuanyuan
}
}
5.1在实例方法中使用this
代表正在调用该方法的当前对象。
六、访问权限
6.1 private
用关键字private修饰的成员变量和方法称为私有变量和私有方法。只有在本类中创建该类的对象时,这个对象才能访问自己的私有变量和类中的私有方法。
例1:
class A{
private int money;
private int getMoney() {
return money;
}
public static void main(String[] args) {
A exa=new A(); //对象exa在A类中
exa.money=3000;
int m=exa.getMoney();
System.out.println("money="+m);
}
}
优点:当用某个类在另外一个类中创建对象后,如果希望该对象直接访问自己的变量,应将此变量的访问权限设置为private,这样,用户不需要特别清楚某一类中具体有哪些对象,使得对数据的操作更加合理,也有利于后期代码的维护。
例2:
Student.java
public class Student {
private int age;
public void setAge(int age) { //实例方法
if(age>=7&&age<=28) {
this.age=age; //使用this,操作ming和hong这两个对象
}
}
public int getAge() {
return age;
}
}
People.java
public class People{
public static void main(String[] args) {
Student ming=new Student();
Student hong=new Student();
//为ming和hong设置年龄
//ming.age和hong.age都是非法的,因为ming和hong已经不在Stuent类中
ming.setAge(19);
hong.setAge(21);
System.out.println("ming的年龄"+ming.getAge());
System.out.println("hong的年龄"+hong.getAge());
}
}
6.2 public
用关键字public 修饰的成员变量和方法称为公有变量和公有方法。
Java语言中访问限制最宽的修饰符,一般称之为“公共的”。被其修饰的类、属性以及方法不仅可以跨类访问,而且允许跨包(package)访问。
6.3 protected
用关键字protected 修饰的成员变量和方法称为受保护的成员变量和受保护的方法。
在同一个包中,父类定义一个以protected修饰的变量的时候,子类和父类的实例都是可以访问的。
但是在不同的包中的时候,父类中定义一个以protected修饰的变量的时候,子类可以通过的实例来直接访问,父类不可以通过的实例来直接访问。
6.4 default
又称为友好变量和友好方法,只有在同一个包中,才能访问。
6.5 注意
1、不能用protected和private修饰类
2、访问限制修饰符按访问权限从高到低的排列顺序时public、protected、private