Java面向对象

2020-09-15  本文已影响0人  曾梦想仗剑天涯

Java面向对象编程三个主要特征

面向对象开发的三个步骤:

类与对象

类与对象的定义与使用

/**
  定义类 class Person {}
  声明并实例化对象  类名称 对象名称 = new 类名称()
  Person per = new Person();
*/
class Person {
  String name;
  int age;
  public void tell() {
    System.out.println("name:" + name);
    System.out.println("age:" + age);
  }
}
public class JavaDemo {
  public static void main(String [] arge) {
    Person per = new Person();
    per.name = "张三";
    per.age = 18;
    per.tell();
  }
}

对象内存分析

对象引用分析

/**
  引用传递:Person per1 = new Person(); Person per2 = per1;
  输出结果 age: 80
*/
public class JavaDemo {
  public static void main(String [] arge) {
    Person per1 = new Person();
    per1.name = "张三";
    per1.age = 18;
    Person per2 = per1;
    per2.age = 80;
    per1.tell();
  }
}
/**
  通过方法引用传递
*/
public class JavaDemo {        
  public static void main(String [] arge) {
    Person per1 = new Person();
    per1.name = "张三";
    per1.age = 18;
    change()
    per1.tell();
  };
  public static void change(Person temp) {
    temp.age = 80;
  }
}

引用传递与垃圾产生分析

/**
  per1(栈内存地址)指向new Person()
  per2(栈内存地址)指向new Person()
  两个指向的new Person() 不同
  per2 = per1 改变了per2指向
  那么per2在定义时指向的堆内存将会变成垃圾
*/
public class JavaDemo {
  public static void main(String [] arge) {
    Person per1 = new Person();
    Person per2 = new Person();
    per1.name = "张三";
    per1.age = 18;
    per2.name = "李四";
    per2.age = 80;
    per2 = per1; 
    per2.age = 18;
    per1.tell();
  }
}

成员属性封装

/**
  private关键字对属性进行封装
  private String name;
  private int age;
  属性一旦封装之后对外部将不能够直接访问
  可用setter getter获取/设置属性
*/
public void setName(String n) {
 name =  n;
};
public String getName() {
  return name
};
per.setName("张三");
String perName = per.getName();

构造方法与匿名对象

/**
  public Person 即为构造方法
*/
class Person {
  private String name;
  private int age;
  public Person(String n, int a){ 
    name = n; 
    age = a; 
  }
  public void tell(){
    System.out.println("姓名:"+ name +"年龄:"+ age);
  }    
}
public class JavaDemo {
  public static void main(String [] args) {
    Person per =newPerson("张三", 18);
    per.tell();
  }
}
/**
  Person定义对象的所属类型,类型决定了你可以调用的方法
  per 实例化对象的名称
  new 开辟一块新的堆内存空间
  Person(“张三”, 18)调用有参构造,Person()调用无参构造函数,一个类至少存在一个构造方法
*/
Person per1 = new Person();
Person per2 = new Person(“张三”, 18);

this关键字

简单的Java类

class Dept {
  private long deptNo;
  private String deptName;
  private String loc;
  public Dept() {};
  public Dept(long deptNo, String deptName, String loc) {
    this.deptNo = deptNo;
    this.deptName = deptName;
    this.loc = loc;
  };
  public String getInfo() {
    return "部门编号:" + this.deptNo + "、部门名称:" + this.deptName + "、部门位置:" + this.loc;
  };
  public void setDeptNo(long deptNo) {
    this.deptNo = deptNo;
  };
  public long getDeptNo() {
    return this.deptNo;
  };
  public void setDeptName(String deptName) {
    this.deptName = deptName;
  };
  public String getDeptName() {
    return this.deptName;
  };
  public void setLoc(String loc) {
    this.loc = loc;
  };
  public String getLoc() {
    return this.loc;
  };
}
public class JavaStudy {
  public static void main (String [] args) {
    Dept dept = new Dept(18, "技术部", "石家庄");
    System.out.println(dept.getInfo());
  }
}

static定义属性

static属性虽然定义在类之中,但是不受到类实例化对象的控制,static属性可以在对象没有实例化的时候使用。

static定义方法

static应用

/**
  一个程序类,可以实现实例化对象个数的统计
  每一次创建新的实例化对象都可以实现一个统计操作
  实现属性自动命名处理
*/
class Book {
  private String title;
  private static int count = 0;
  public Book () {
    this("NOTTITLE - " + count++);
  };
  public Book (String title) {
    this.title = title;
  };
  public void setTitle (String title) {
   this.title = title;
  };
  public String getTitle () {
    return this.title;
  };
}
public class JavaStudy {
  public static void main (String [] args) {
    System.out.println(new Book("Java").getTitle());
    System.out.println(new Book("JavaScript").getTitle());
    System.out.println(new Book().getTitle());
    System.out.println(new Book().getTitle());
  }
}

代码块

/**
  普通代码块:定义在一个方法中的代码块
  在一个方法中可以对结构拆分,防止相同变量互相影响
*/
public class JavaStudy {
  public static void main (String [] args) {
    {
      int x = 10;
      System.out.println("x = " + x);
    }
    int x = 100;
    System.out.println("x = " + x);
  }
}
/**
  构造代码块:定义在一个类之中
  构造块会优先于构造方法执行,并且每一次实例化对象的时候都会调用构造块中的代码
*/
class Person {
  public Person {
    System.out.println("构造方法");    
  }
  {
    System.out.println("构造块");
  }
}
/**
  静态代码块:用static定义的代码块
  分为主类中定义静态块,非主类定义静态块
  执行顺序 静态代码块>构造代码块>构造方法
  静态代码块只执行一次,主要是为类中静态属性初始化
*/
class Person {
  static {
    System.out.println("静态代码块");
  }
}
上一篇下一篇

猜你喜欢

热点阅读