Java编程基础四:面向对象编程上

118 阅读5分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

第四章 面向对象编程 上

1面向对象与面向过程

  • 二者都是一种思想,面向对象是相对于面向过程而言的。面向过程强调的是功能行为,以函数为最小对象,考虑怎么做。面向对象,将功能封装进对象,强调具备了功能的对象。以类/对象为最小单位,考虑谁来做。

  • 面向对象三大特征

    封装(encapsulation)

    继承(inheritance)

    多态(polymorphism)

2 java基本元素:类和对象

类:属性 方法

3 对象的创建与使用

class Person{
    String name;
    int age;
    boolean isMale;
    public void eat(){
        System.out.println("人可以吃饭");
    }
    public void sleep(){
        System.out.println("人能睡觉");
    }
}
Person p = new Person();
p.name = "Tom";
p.isMale = true;
p.age = 18;
p.eat();p.sleep();

4类的成员之一:属性

属性 vs 局部变量

  1. 相同点
  • 定义变量的格式一样, 数据类型 变量名 = 变量值
  • 先声明,后使用
  • 变量都有相对应的作用域
  1. 不同点
  • 在类中声明的位置不同

    属性:直接定义在类的{}内

    局部变量:声明在方法内、方法形参、代码块内、构造器形参、构造器内部的变量

  • 关于权限修饰符的不同

    属性:可以再声明属性是,指明权限,使用权限修饰符。

    局部变量:不可以使用权限修饰符。

    常见的权限修饰符:private、public、缺省、protected、final

  • 默认初始化值

    属性:类的属性,根据其类型,都有默认的初始化值。

    类型默认值
    整型byte、short、int、long0
    浮点型double、float0.0
    字符型char0
    Booleanfalse
    引用数据类型类、数组、接口null

    局部变量:无默认值。

    特别的:形参在调用的时候,赋值即可

  • 在内存中加载的位置不一样

    属性:加载到堆空间

    局部变量:加载到栈空间

5类的成员之二:方法

  1. 举例
  • 按照是否有形参分类

    无返回值有返回值
    无形参void method(){}返回值类型 method(){}
    有形参void method(形参列表){}返回值类型 method(形参列表){}
  1. 方法的声明:

    权限修饰符 返回值类型 方法名(形参列表){

    ​ 方法体

    }

  2. 方法名:属于标识符,要见名知意

  3. return关键字的使用

  • 使用在方法中

  • 作用:

    结束方法

    针对于有返回值的方法,使用return返回想要的数据。

    例子1:

public class CircleTest{
    public static void main(String[] args){
        Circle c1 = new Circle();
        c1.radius = 2;
        System.out.println("圆的面积为:" + c1.findArea());
        System.out.println("矩形的面积为:" + method(12,8));
        }
    public static void method(int m,int n){
        return m * n;
    }
}
class Circle{
    double radius;
    public double findArea(){
        return Math.PI * radius * radius;
    }
}

例子2:

public class StudentTest{
   public static void main(String[] args){
       Student[] students = new Student[20];
       for(int i = 0;i < students.length;i++){
           students[i] = new Student();
            students[i].number = (i + 1);
            students[i].state = (int)(Math.random() * 6 + 1);
           students[i].score = (int)(Math.random() * (100 - 0 + 1) + 1);
       }
   } 
}
class Student{
    int number; //学号
    int state;	//年级
    int score;  //得分
}

6 扩展一

6.1 匿名对象的使用

public class InstanceTest{
    public static void main(String[] args){
        Phone p = new Phone();
        p.sendEmail();
        p.playGame();
        
        //匿名
        new Phone().sendEmail();
         new Phone().playGame();
        
    }
}
class Phone{
    double price;
    public void playGame(){
        System.out.println("玩游戏");
    }
    public void sendEmail(){
        System.out.println("发邮件");
    }
}

6.2 方法的重载

  1. 定义

    在同一个类中,允许存在一个以上的同名方法,只要他们的参数个数或者参数类型不同即可

public class OverLoadTest{
    public static void main(String[] args){
   	        
       OverLoadTest olt = new OverLoadTest();
       System.out.println(olt.getSum(1.2,2.0));
        //如不想声明对象,直接输出getSum();需将方法声明为静态(static)方法
        //静态方法可以再没有对象实例的情况下直接调用
    }
    //如下的方法构成了重构
    public int getSum(int i,int j){
        return i + j;
    }
    public double getSum(double i,double j){
        return i + j;
    }
}

6.3 可变个数形参的方法

  1. 可变个数形参的格式 数组类型 ... 变量名
public void show(String ... strs){
    //TODO
}
//调用可变个数形参时,传入参数随意个
  1. 可变个数形参与数组类型不能同时存在
public void show(String ... strs){}
public void show(String[] strs){}
//JDk5.0以前用数组,所以不能同时存在
  1. 可变个数形参在方法的形参中,必须声明在最后,且只能声明一个可变形参
public void show(int i,String ... strs){}
  1. 引用类型的值转换 用类
class Data{
	int m;
	int n;
}
main(){
	Data data = new Data();
	data.m = 10;
	data.n = 20;
	swap(data.m,data.n);
}
swap(){
	int temp = data.m;
	data.m = data.n;
	data.n = temp;
}

7 扩展二

7.1 OOP特征一:封装性

  • 属性私有化,方法公有化
class Animal{
    //私有化属性,公有化方法
    private String name;
    private int age;
    private int legs;
    
    //自动化生成Getter和Setter方法
    public void setName(String name){
        this.name = name;
    }
    public String getName(){
        return name;
    }
    //当一个属性没有配套的getter、setter方法时直接用属性名当做方法名
    public int legs(){//实际上的方法全名是getLegs()
        return legs;
    }
    //JavaBean
}
  • 权限修饰符
修饰符类内部同一个包不同包的子类同一个工程
private
缺省
protected
public

7.2 类的成员之三:构造器

  1. 作用

​ 创建对象

  1. 说明
  • 如果没有显式的定义类的构造器的话,则默认提供一个空参构造器 (权限跟随类的权限)
  • 定义构造器的格式: 权限修饰符 类名(形参列表){}
  1. JavaBean
  • 类是公共的
  • 有一个公共的无参构造器
  • 有属性和对应的get、set方法

8 关键字的使用

8.1 this关键字的使用

  1. this可以用来修饰:属性,方法,构造器
  2. this修饰属性和方法:
  • this理解为:当前对象
  1. this调用构造器
  • 可以在构造器内用this()调用其他构造器,具体调用哪个看形参
  • 构造器中不能通过this(形参列表)调用自己本身
  • 规定:this(形参列表)必须放在本构造器的首行,且只能调用一个

8.2 package关键字的使用

  1. 为了更好的实现项目中类的管理
  2. 使用package声明类或接口所属的包,声明在首行
  3. 需要见名知意,一般为域名的反写
  4. 每个 “ . ” 代表一层文件目录