Java面对象笔记(一)

类的定义:

  1. 类是相同或相似对象的一种抽象,是对象的一个模板,它描述一类对象的行为和状态。
  2. 类是具有相同属性和方法(行为)的对象的集合

定义一个类:

public class 类名 {
    //定义属性部分(成员变量)
    属性1的类型 属性1;
    属性2的类型 属性2;
    ...
    //定义方法部分
    方法1
    方法2
    ...
}

一个类可包含的变量

  • 局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
  • 成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
  • 类变量:也叫静态变量,类变量也声明在类中,方法体之外,但必须声明为 static 类型

对象

创建对象

public class NewObject {
    public static void main(String[] args) {
        People LiLei = new People(); //创建一个People对象LiLei

        LiLei.height =170;
        LiLei.age = 20;
        LiLei.sex = 1;

        LiLei.printBaseMes();
    }
}

使用对象的属性和方法

//引用对象属性
对象名.属性

//引用对象方法
对象名.方法

构造方法

在面向对象中有一个非常重要的知识点,就是构造方法。每个类都有构造方法,在创建该类的对象的时候他们将被调用,如果没有定义构造方法,Java 编译器会提供一个默认构造方法。 创建一个对象的时候,至少调用一个构造方法。比如在新建一个对象 new Object(),括号中没有任何参数,代表调用一个无参构造方法(默认构造方法就是一个无参构造方法)。构造方法的名称必须与类名相同,一个类可以定义多个构造方法。

1. 构造方法与类名相同,没有返回值,语法格式:

//与类同名,可以指定参数,没有返回值
public 构造方法名(){
//初始化代码
}

有参和无参

public class People{
    //无参构造方法
    public People(){

    }
    //有一个参数的构造方法
    public People(int age){

    }
}

引用对象 

例子:

Object object1 = new Object();
Object object2 = object1;
System.out.println(object1 == object2);

运行得到的结果为 true,说明 object1 和 object2 的内存地址相同 (== 会比较两个对象的内存地址是否相同),它们实际上是引用同一对象,如果改变 object1 对象内部的属性,那么 object2 的属性同样会改变

静态变量(static)

Java 中被 static 修饰的成员称为静态成员或类成员。它属于整个类所有,而不是某个对象所有,即被类的所有对象所共享。静态成员可以使用类名直接访问,也可以使用对象名进行访问

public class StaticTest{
    public static String string="shiyanlou";
    public static void main(String[] args){
        //静态成员不需要实例化 直接就可以访问
        System.out.println(StaticTest.string);
        //如果不加static关键字 需要这样访问
        StaticTest staticTest=new StaticTest();
        System.out.println(staticTest.string);
        //如果加上static关键字,上面的两种方法都可以使用
    }
}

静态方法

被 static 修饰的方法是静态方法,静态方法不依赖于对象,不需要将类实例化便可以调用,由于不实例化也可以调用,所以不能有 this,也不能访问非静态成员变量和非静态方法。但是非静态成员变量和非静态方法可以访问静态方法。

final

final 关键字可以修饰类、方法、属性和变量

  1. final 修饰类,则该类不允许被继承,为最终类
  2. final 修饰方法,则该方法不允许被覆盖(重写)
  3. final 修饰属性:则该类的属性不会进行隐式的初始化(类的初始化属性必须有值)或在构造方法中赋值(但只能选其一)
  4. final 修饰变量,则该变量的值只能赋一次值,即常量

权限修饰符

代码中经常用到 private 和 public 修饰符,权限修饰符可以用来修饰属性和方法的访问范围。

 

 

如图所示,代表了不同的访问修饰符的访问范围,比如 private 修饰的属性或者方法,只能在当前类中访问或者使用。默认 是什么修饰符都不加,默认在当前类中和同一包下都可以访问和使用。protected 修饰的属性或者方法,对同一包内的类和所有子类可见。public 修饰的属性或者方法,对所有类可见。

我们可以举一个例子,比如 money,如果我们用 private 修饰代表着这是私有的,只能我自己可以使用。如果是 protected 代表着我可以使用,和我有关系的人,比如儿子也可以用。如果是 public 就代表了所有人都可以使用。

封装

怎么实现封装

  1. 修改属性的可见性,在属性的前面添加修饰符 (private)
  2. 对每个值属性提供对外的公共方法访问,如创建 getter/setter(取值和赋值)方法,用于对私有属性的访问
  3. 在 getter/setter 方法里加入属性的控制语句,例如我们可以加一个判断语句,对于非法输入给予否定。

 

 

如果我们没有在属性前面添加任何修饰符,我们通过对象就可以直接对属性值进行修改,没有体现封装的特性。这在许多程序设计中都是不安全的,所以我们需要利用封装,来改进我们的代码。

首先在类里要将属性前添加 private 修饰符。然后定义 getter 和 setter 方法。修改 People.java 和 NewObject.java 的内容如下。

public class People {
    //属性(成员变量)有什么,前面添加了访问修饰符private
    //变成了私有属性,必须通过方法调用
    private double height;     //身高

    //属性已经封装好了,如果用户需要调用属性
    //必须用getter和setter方法进行调用
    //getter和setter方法需要程序员自己定义
    public double getHeight(){
    //getter 方法命名是get关键字加属性名(属性名首字母大写)
    //getter 方法一般是为了得到属性值
      return height;
    }

    //同理设置我们的setter方法
    //setter 方法命名是set关键字加属性名(首字母大写)
    //setter 方法一般是给属性值赋值,所以有一个参数
    public void setHeight(double newHeight){
      height = newHeight;
    }
}

现在 main 函数里的对象,不能再直接调用属性了,只能通过 getter 和 setter 方法进行调用。

public class NewObject {

    public static void main(String[] args) {
        People LiLei = new People();    //创建了一个People对象LiLei

        //利用setter方法为属性赋值
        LiLei.setHeight(170.0);

        //利用getter方法取属性值
        System.out.println("LiLei的身高是"+LiLei.getHeight());
    }
}

this

this 关键字代表当前对象。使用 this.属性 操作当前对象的属性,this.方法 调用当前对象的方法。

用 private 修饰的属性,必须定义 getter 和 setter 方法才可以访问到 (Eclipse 和 IDEA 等 IDE 都有自动生成 getter 和 setter 方法的功能)。

如下:

public void setAge(int age) {
  this.age = age;
}
public int getAge() {
  return age;
}

创建好了 getter 和 setter 方法后,我们发现方法中参数名和属性名一样。

当成员变量和局部变量之间发生冲突时,在属性名前面添加了 this 关键字。 此时就代表将一个参数的值赋给当前对象的属性。同理 this 关键字可以调用当前对象的方法

posted @ 2020-11-20 15:34  lovivi  阅读(104)  评论(0)    收藏  举报