类:使用关键字class,抽象的概念集合。例如人类,具有共性的产物。
对象:具有自己独立属性,具有个性的个体。
类中可以定义的内容:
- 成员变量(属性);
- 成员方法(功能);
- 构造方法;
- 内部类;
- 代码块
创建一个对象: new Scanner(); new int[];
类的构造方法:每一个类中都有一个默认的无参构造方法。构造方法名与类名一致。无返回值。不用void修饰。
无参构造方法与有参构造方法对比:
public class Round {
int r;
String color;
public Round(){
}
public Round(String color)
{
this.color=color;
}
}
构造方法的作用:初始化创建对象。
方法重载:在一个类中有多个名称相同的方法。
Q:当出现多个名称相同的方法该如何区分呢?
A:可通过传入的参数个数,类型顺序区分。
普通成员方法也可方法重载。
public int area(int r)
{
return (int) (r*r*Math.PI);
}
public double area(double r)
{
return r*r*Math.PI;
}
对象与引用
值传递:
1.基本类型值传递(形参改变不影响实参)
public class Myproject {
public static void main(String[] args) {
Round r1=new Round();
int x=1;
r1.draw(x);
System.out.printf("x=%d\n",x);
}
}
public class Round {
int r;
public void draw(int r)
{
r=10;
System.out.printf("r=%d\n",r);
}
}
如上述所示,当main函数传入一个实参x,成员方法中改变了形参的大小,可是并没有影响实参最终大小。因此,基本类型的值传递时,形参的改变不影响实参的大小。
2.引用类型值传递 (形参改变影响实参)
首先,我们介绍一下何谓引用类型的值,引用类型包括类(例如字符串),数组,接口。
public class Myproject {
public static void main(String[] args) {
Person p1=new Person();
p1.name="adele";
p1.Read_name(p1);
System.out.println("对象p1最终的名字为:");
System.out.println(p1.name);
}
}
public class Person {
String name;
public void Read_name(Person person)
{
person.name="amy";
System.out.println("调用Read_name方法并且在成员方法中更改p1名字,输出的p1对象名字:");
System.out.println(person.name);
}
}
神奇的,我们发现最终在main函数中对象的name改变了,形参影响了实参。这是为什么呢?
这是因为在创建一个对象的时候,对象名指向的是持有对象在内存空间的地址(即引用变量)。
传入实参,形参也会指向实参地址,所以改变的是形参指向的地址上的值。接下来我们看看实参和形参所指向的内存地址是否相同来验证。
public class Myproject {
public static void main(String[] args) {
Person p1=new Person();
p1.name="adele";
System.out.println(p1);
p1.Read_name(p1);
// System.out.println("对象p1最终的名字为:");
// System.out.println(p1.name);
}
}
public class Person {
String name;
public void Read_name(Person person)
{
System.out.println(person);
// System.out.println(person.name);
person.name="amy";
System.out.println(person);
// System.out.println("调用Read_name方法并且在成员方法中更改p1名字,输出的p1对象名字:");
// System.out.println(person.name);
}
}
结果输出:
通过结果发现,指向的的内存地址始终指向同一个,而改变的是该地址上的值。
所以可以得到结论:使用引用类型值传递时,形参改变会影响实参。
this关键字:表示当前正在操作的对象。
使用this关键字可以引用成员变量,成员方法。
static关键字(静态的意思):
- 被static修饰的变量,在内存中只有一份。(比如创建了10个学生,他们都来自清华大学,那么此时可以使用static关键字,创建一个成员变量,节省内存空间)
- 静态成员随着类的加载而加载
- 使用类名可以直接对静态成员进行访问
- 静态成员优先于对象存在
- 修饰的成员被所有对象共享
代码块:类似于没有名称的方法。
类的加载执行:
- 先加载类
- 加载静态成员(静态变量,方法,代码块)
- 创建对象
- 调用构造方法,初始化对象成员
访问权限修饰符(控制能否被外界访问)
- public:修饰类,成员变量,成员方法。在任何地方均可访问
- protected:修饰成员变量,成员方法。自己类中和同包类中访问,在不同包子类访问。
- default(默认):修饰类,成员变量,成员方法。在自己类中和同包中访问。
- private:修饰成员变量,方法。只能在自己类中访问。