Java 是一门纯面向对象的语言 (Object Oriented Program ,简称 OOP) ,在面向对象的世界里,一切皆为对象。 面 向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。相比于面相过程,用面相对象的思想来进行程序设计,对于开发者更加友好,对于大型程序的设计,扩展,维护更有帮助。
面向对象有三大特征:封装,继承,多态。Java就是依靠类和对象来依次实现这三大特征的 ,我会在接下来的文章中详细介绍这三大特征。
在面相对象的思想中,我们需要把各种事物抽象成对象(也可以说是一个实体),类是用来对一个实体(对象)来进行描述的,在java中定义类时需要用到class关键字。在下面这段代码中,我们定义了一个洗衣机类:
class WashMachine{
public String brand; // 品牌
public String type; // 型号
public double weight; // 重量
public double length; // 长
public double width; // 宽
public double height; // 高
public String color; // 颜色
public void washClothes(){ // 洗衣服
System.out.println("洗衣功能");
}
public void dryClothes(){ // 脱水
System.out.println("脱水功能");
}
public void setTime(){ // 定时
System.out.println("定时功能");
}
}
这里面包含的内容成为类的成员,其中成员变量称为类的属性,成员方法称为类的行为。
tips:
在Java中定义了一个类,就相当于在计算机中定义了一个新的引用类型,与数组,String类似,不过前者是用户自定义的类型,后者是Java中内置的。
而对象就相当于用自定义类型声明的一个变量,用类类型初始化对象的过程,成为类的实例化。定义如下:
类名 对象名 = new 类名()//new后面跟的是类的构造方法。
构造方法 ( 也称为构造器 ) 是一个特殊的成员方法, 名字必须与类名相同,在创建对象时,由编译器自动调用,并且 在整个对象的生命周期内只调用一次。
一个类至少有一个构造方法,没写编译器自动生成无参构造方法,也可以定义多个构造方法,特点跟方法重载一样。
构造方法的特性:
下面是初始化一个日期对象的代码案例:
public class Date {
public int year;
public int month;
public int day;
// 无参构造方法
public Date(){
this.year = 1900;
this.month = 1;
this.day = 1;
}
// 带有三个参数的构造方法
public Date(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
public void printDate(){
System.out.println(year + "-" + month + "-" + day);
}
public static void main(String[] args) {
Date d = new Date();
d.printDate();
}
}
在上述代码中我们可以看到构造方法中的变量名与类中的变量名重名了,为了区分两者,Java中引入了this关键字。
this引用指向当前对象 ( 成员方法运行时调用该成员方法的对象 ) ,在成员方法中所有成员变量的操作,都是通过该引用去访问。这些操作都是编译器自动完成
小技巧:
在构造方法中可以通过this关键字来调用其他构造方法,如下:
public Date (){ //System.out.println(year); 注释取消掉,编译会失败 this ( 1900 , 1 , 1 ); //this.year = 1900; //this.month = 1; //this.day = 1; } // 带有三个参数的构造方法 public Date ( int year , int month , int day ) { this . year = year ; this . month = month ; this . day = day ; } }
从开始学习Java到现在,相信你已经发现每段Java代码都少不了的一个关键字就是 public,而他就与我们要学习的封装概念有关。
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。
比如下面这段代码,Computer类中的成员变量用private修饰之后,就不能通过p.cpu来访问cpu这个成员变量了,以此便实现了封装功能。
public class Computer {
private String cpu; // cpu
private String memory; // 内存
public String screen; // 屏幕
String brand; // 品牌---->default属性
public Computer(String brand, String cpu, String memory, String screen) {
this.brand = brand;
this.cpu = cpu;
this.memory = memory;
比特就业课
注意:一般情况下成员变量设置为private,成员方法设置为public。
6.3 封装扩展之包
6.3.1 包的概念
在面向对象体系中,提出了一个软件包的概念,即:为了更好的管理类,把多个类收集在一起成为一组,称为软件
包。有点类似于目录。比如:为了更好的管理电脑中的歌曲,一种好的方式就是将相同属性的歌曲放在相同文件
下,也可以对某个文件夹下的音乐进行更详细的分类。
this.screen = screen;
}
public void Boot(){
System.out.println("开机~~~");
}
public void PowerOff(){
System.out.println("关机~~~");
}
public void SurfInternet(){
System.out.println("上网~~~");
}
}
public class TestComputer {
public static void main(String[] args) {
Computer p = new Computer("HW", "i7", "8G", "13*14");
System.out.println(p.brand); // default属性:只能被本包中类访问
System.out.println(p.screen); // public属性: 可以任何其他类访问
// System.out.println(p.cpu); // private属性:只能在Computer类中访问,不能被其他类访问
}
}
上述关键字我们称为访问限定符,Java中提供了四种访问限定符分别是private,default,protected,public。
default即什么都不写时的权限。
为了更好的管理类,Java中引入了包(packet)的概念,即文件夹。
包是对类、接口等的封装机制的体现,是一种对类或者接口等的很好的组织方式 ,比如:一个包中的类不想被其他包中的类使用。包还有一个重要的作用:在同一个工程中允许存在相同名称的类,只要处在 不同的包中即可 。
我们可以用import导入包:
import java.util.Date;
public class Test {
public static void main(String[] args) {
Date date = new Date();
// 得到一个毫秒级别的时间戳
System.out.println(date.getTime());
}
}
可以使用import static导入包中静态的方法和字段:
import static java.lang.Math.*;
public class Test {
public static void main(String[] args) {
double x = 30;
double y = 40;
// 静态导入的方式写起来更方便一些.
// double result = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));
double result = sqrt(pow(x, 2) + pow(y, 2));
System.out.println(result);
}
}
Java中常见的包:
被static修饰的成员方法称为静态成员方法,是类的方法,不是某个对象所特有的。可以通过类名直接调用,静态方法储存在下图中的方法区中。
使用 {} 定义的一段代码称为代码块 。
tips:
在Java中可以将一个类定义在另一个类或者一个方法的内部,称为内部类。
public class OutClass {
class InnerClass{
}
}
// OutClass是外部类
// InnerClass是内部类
内部类和外部类共用同一个 java 源文件,但是经过编译之后,内部类会形成单独的字节码文件 。
内部类又可以分为实例内部类,静态内部类,局部内部类,匿名内部类四种。
匿名内部类的书写形式:父类/接口 对象 = new 父类/接口(){ 重写父类/接口中的方法 };