java_面向对象_类与对象
java_面向对象_类与对象
Java作为一种面向对象语言。有以下三大特征:
封装
继承
多态
本篇博客我们讨论第一特征,封装。而java中的类对应的正式封装这一特性。
1、类(封装)
首先在思维的角度,我们必须从c时代面向过程的思维,转化为面向对象的思维
用生活中的实践举例:洗衣服这件事情,用面向过程的思维考虑:而在用面向对象的思维考虑时,我们把洗衣服这件事交给洗衣机这个类来解决,由洗衣机内部封装实现各种洗衣服的复杂过程。这样我们洗衣服只需要把衣服交给洗衣机这个类就好了。
总而言之,我们的思考方式,从面向实现细节的编程,转化为了直接操作类的编程。而在对类的封装时,隐藏了对象的属性和实现细节,只对外提供公共的访问方式。
----------------------------------------------------------------------------------------------------------------------------------------
java中用class关键字来定义一个类,一个类中一般会封装类的方法和类的变量,下面定义了一个动物类,类中定义了变量name并定义其get/set方法,有参构造,无参构造;
public class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
public Animal() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void run(){
System.out.println("开始跑步!");
}
}
变量
变量包括:
a、成员变量 位于类中方法外,随着对象的实例化而加载,对象的销毁而销毁。
b、局部变量 位于类中方法中,随着方法的调用而加载,方法执行完毕后销毁。
c、类变量(静态变量) 也声明在类中,方法体之外,但必须声明为static类型,静态变量随类的加载而加载,而且是每个该类对象所公用的。
----------------------------------------------------------------------------------------------------------------------------------------
方法
a、每个类都有构造方法,如果不设定也会自带一个默认的无参构造方法,但如果自定义了有参构造以后,默认无参构造就会消失,需要我们重写一个无参构造。
b、get、set方法,因为一般情况我们会把类的变量私有化,所以会写为每个类写一个公有的get和一个set方法便于我们操作私有的变量。
c、静态方法 对应静态变量,每个类也有用static修饰的静态方法,静态方法随类的加载而加载,而且静态方法只能访问静态变量。
权限修饰关键字
java的权限修饰符用来修饰变量和方法的访问权限,下图由受保护程度从大到小(从左到右)可排为: 一般情况下,我们将类的属性定义为私有(private)以达到封装的目的,但是提供对外的公有(public)的get/set方法。不同的访问修饰符的权限如下:
访问修饰符 | 同一个类 | 同包 | 不同包,子类 | 不同包,非子类 |
---|---|---|---|---|
private | √ | |||
默认 | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
对象
类是一类事物的抽象描述,必须通过new关键字来定义一个类的实例对象才能使用(除非是static修饰的静态类),下面定义一个student类:
class Student {
private String name;
private int age;
public Student(){}
public Student(String name, int age){
this.name = name;
this.age = age;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return age;
}
public void show(){
System.out.println( name + "---" + age );
}
}
接着在main方法中new出student实例,执行下列操作:
Student s = new Student();
System.out.println( s.getName());
System.out.println( s.getAge());
s.setName("小强");
s.setAge(20);
System.out.println( s.getName());
System.out.println( s.getAge());
实际上这些代码在内存中执行了如下操作: 1、首先在方法区中加载主类和student类的方法。
2、然后从main函数开始加载进栈。
3、接着在栈中创建变量s作为引用。
4、然后在堆上new(创建)出一个student类,先赋默认值为String=null,age=0。
5、随后调用setName/setAge方法,将对象的变量赋值为string=小强,age=20。
6、然后再分别调用getName/getAge方法,最后调用show方法打印
由此便是类与对象之间的关系,普通类必须通过new实例化后才能调用使用。