Java基础知识(三)面向对象
什么是面向对象
在此之前学习的java编程都是面向过程的编程。面向过程是线性思维;遇到一个问题,面向过程思考方式是,我要一步一步怎么做才能做成这件事。
而面向对象是分类的思维;遇到一个问题我应该分成几类问题完成它,然后对各个类单独思考,最后在对每个类进行面向过程的细节编程。就像公司里一个项目先有架构师将项目架构好,再分到各个部门、小组去完成各自的小任务,最终整合起来完成大任务。
面向对象的三大特性:封装、继承、多态。
封装就是以类的形式将数据封装到对象中。下面介绍类。
类
一个类由属性和方法构成。
属性
属性就是这个类所包含的特征。比如说一个教师类,教师有性别、姓名、教学能力、职位、等等,这些都是教师这个类的属性。放到代码中就是:
class Teacher{
boolean sex;
String name;
String position;
}
方法
方法有普通的方法、和构造方法。根据修饰符的添加还可以加上称号,比如:静态的、非静态的、公有的、私有的、受保护的。先来介绍普通方法与构造方法
普通方法
普通方法就是这个类可以做的哪些行为,与前面介绍的方法是一样的。就像教师类,教师可以教、可以跳、可以走路。。。等等。你还可以继续想对吧,你说教师能干啥教师就能干啥(当然,违法的行为咱们不要乱想好吧)
就像下面的代码:
class Teacher{
boolean sex;
String name;
String position;
void teach(){
System.out.println("教学生");
}
void walk(){
System.out.println("走路");
}
void jump(){
System.out.println("跳");
}
}
构造方法
构造方法就是赋予对象特征的行为。
就像女娲造人,捏个鼻子大点的、捏个眼睛小点的、再缺胳膊短个腿啥的。对于教师来说,一个人当上教师的时候,就会给她发个教师证,上边就会写男的女的、大的小的等等。就是赋予一个具体事物、具体人特征的过程。
构造方法比起普通方法有几个不一样的点:
- 方法名要与类名完全一致。
- 方法不能有返回值。(它就是一个赋值的过程,要啥返回值)
思考一个问题,为啥之前没写过构造方法那个类还能运行呢?因为你写的类在编译器里它就自带着默认构造方法,不信你可以点开class文件看看。
下面我们来看看无参构造与有参构造怎么写。
class Teacher{
boolean sex;
String name;
String position;
Teacher(){
this.sex = true;
this.name = "法外狂人-张三";
this.position = "法学教授"
}
//这俩是个函数的重载。
Teacher(boolean sex, String name, String position){
this.sex = sex;
this.name = name;
this.position = position;
}
void teach(){
System.out.println("教学生");
}
void walk(){
System.out.println("走路");
}
void jump(){
System.out.println("跳");
}
}
默认构造也是一种无参构造方法,但是你如果写了构造函数那么系统就不会给你加那个默认构造方法了。普遍情况下你的类中要加个默认构造,防止你忘记在创建对象时写参数而导致BUG。默认构造这样写:
class Teacher{
boolean sex;
String name;
String position;
Teacher(){ //里面啥也不用写,自动给你赋值成默认值。
}
Teacher(boolean sex, String name, String position){
this.sex = sex;
this.name = name;
this.position = position;
}
void teach(){
System.out.println("教学生");
}
void walk(){
System.out.println("走路");
}
void jump(){
System.out.println("跳");
}
}
加修饰词的方法
先来介绍两种加修饰词的方法:静态方法、非静态方法。
有以下不同点:
- 静态方法在类生成时有了,而且被所有对象共享。
- 非静态方法在对象创建时才有,并且是属于所创建的那个对象的。
方法的调用
- 静态方法的调用:
- 在这个方法所属的类外调用时,通过【类名.方法名()】调用
- 在类内调用时,直接用【方法名()】调用
- 非静态方法的调用:
- 在类外调用时,通过【实例化对象.方法名()】调用。这是在权限非常开放的情况下,权限问题我们之后再说。
- 在类内调用时,直接【方法名()】调用。注意main函数不算做在类内。
- 静态方法与非静态方法在类内的调用情况:
- 静态方法可以调用静态方法
- 非静态方法可以调用非静态方法
- 非静态方法可以调用静态方法
但是,静态方法不能调用非静态方法。还是之前说的生成时间的问题,静态方法比非静态方法生成时间早,所以不能调用。(娃还没生出来呢,你咋让娃叫爸爸对不对)
对象
对象就是类的实例化。就像之前的教师类,张三就是这个类的一个具体实例。
对象就是new出来的。
Teacher ZhangSAN = new Teacher(); //调用的默认构造
Teacher LiSI = new Teacher(true, "李四", "教师助手");
//这些对象还可以改变他的特征,执行相应的动作(方法)
LiSI.sex = false; //做了个变性手术
LiSI.name = "张四太太"; //改了个名
LiSI.jump();
这些动作都是可以的。
内存分析
上面时下面代码的执行过程中的内存创建。
public class Application {
public static void main(String[] args) {
pet dog = new pet("旺财", 10);
dog.say();
}
}
class pet{
public String name;
public int age;
public pet(String name, int age) {
this.name = name;
this.age = age;
}
public void say(){
System.out.printf("I'm %s", this.name);
}
}