面向对象[Object Oriented]
设计对象并使用
设计类,创建对象并使用
类:是对象共同特征的描述。
对象:是真实存在的具体实例。
结论:在java中,必须先设计类,才能创建对象并使用。
类:
public class Car {
// 成员变量
String name;
double price;
// 方法
public void start(){
System.out.println(name + "启动了");
}
public void run(){
System.out.println("价格为:" + price + "的" + name + "跑起来了");
}
}
对象:
public class Test {
public static void main(String[] args) {
// 创建汽车对象
Car c = new Car();
c.name = "红旗";
c.price = 25.5;
System.out.println(c.name);
System.out.println(c.price);
c.start();
c.run();
System.out.println("-------------------");
Car c2 = new Car();
c2.name = "五菱宏光";
c2.price = 9.2;
System.out.println(c2.name);
System.out.println(c2.price);
c2.start();
c2.run();
}
}
定义类的补充注意事项:
- 类名首字母建议大写,且有意义,满足“驼峰模式”。
- 一个Java文件中可以定义多个class类,但只能一个类是public修饰,而且public修饰的类名必须成为代码文件名。实际开发中建议一个文件定义一个class类。
- 成员变量的完整定义格式是:修饰符 数据类型 变量名称 = 初始化值;一般无需指定初始化值,存在默认值。
对象在内存中的运行机制
多个对象的内存图
两个变量指向同一个对象内存图
垃圾回收:
- 注意:当堆内存中的对象,没有被任何变量引用(指向)时,就会被判定为内存中的“垃圾”。
构造器
构造器的作用:
- 定义在类中的,可以用于初始化一个类的对象,并返回对象的地址。
构造器的格式:
调用构造器得到对象的格式:
构造器的分类和作用:
- 无参数构造器(默认存在的):初始化对象时,成员变量的数据均采用默认值。
- 有参数构造器:在初始化对象的时候,同时可以接收参数为对象进行赋值。
构造器的注意事项:
- 任何类定义出来,就默认自带了无参数构造器,写不写都有。
- 一旦定义了有参数构造器,那么无参数构造器就没有了,如果还想用无参数构造器,此时就需要自己手写一个无参数构造器了。
// 构造器
public class Car {
String name;
double price;
public Car(){
System.out.println("--无参构造器被调用--");
}
public Car(String n,double p){
System.out.println("--有参构造器被调用--");
name = n;
price = p;
}
}
//调用构造器创建对象
public class Test {
public static void main(String[] args) {
//通过调用构造器得到对象
Car c = new Car();
c.name = "Benz";
c.price = 59.6;
//调用有参构造器
Car c2= new Car("BWM", 42.8);
}
}
this关键字
this关键字是什么:
- 可以出现在构造器、方法中
- 代表当前对象的地址
this关键字的作用:
- 可以用于指定访问当前对象的成员变量、成员方法
区别:
public class Car {
String name;
double price;
public Car(String name,double price){
this.name = name;
this.price = price;
}
// 有this
public void goWith(String name){
System.out.println(this.name + "正在和" + name + "比赛~");
}
}
public class Test {
public static void main(String[] args) {
Car c= new Car("BWM", 42.8);
c.goWith("Benz");
}
}
// 运行结果:BWM正在和Benz比赛~
public class Car {
String name;
double price;
public Car(String name,double price){
this.name = name;
this.price = price;
}
// 没有this,name会就近传值
public void goWith(String name){
System.out.println(name + "正在和" + name + "比赛~");
}
}
public class Test {
public static void main(String[] args) {
Car c= new Car("BWM", 42.8);
c.goWith("Benz");
}
}
// 运行结果:Benz正在和Benz比赛~
封装
封装思想概述
-
面向对象的三大特征:封装、继承、多态。
-
封装:告诉我们,如何正确设计对象的属性和方法。
-
封装的原则:对象代表什么,就要封装对应的数据,并提供数据对应的行为。
人画圆,画圆方法是属于圆的。而不属于人的。
如何更好的封装
- 一般建议对成员变量使用 private(私有、隐藏)关键字修饰进(private修饰的成员只能在当前类中访问)。
- 为每个成员变量提供配套 public 修饰的getter、setter方法暴露其取值和赋值。
public class Student {
// 1、成员变量 使用private修饰,只能在本类中访问了
private int age;
/**
2、提供成套的getter和setter方法暴露其取值和赋值
*/
public void setAge(int age){
if (age >= 0 && age <= 200){
this.age = age;
}else {
System.out.println("您的年龄数据有问题!");
}
}
public int getAge(){
return age;
}
}
public class Test1 {
public static void main(String[] args){
Student s = new Student();
s.setAge(23);
System.out.println(s.getAge());
}
}
// 运行结果:23
public class Test1 {
public static void main(String[] args){
Student s = new Student();
s.setAge(-23);
System.out.println(s.getAge());
}
}
// 运行结果:您的年龄数据有问题!
标准JavaBean
JavaBean:
- 也可以称为实体类,其对象可以用于在程序中封装数据。
标准JavaBean须满足如下书写要求:
- 成员变量使用 private 修饰。
- 提供成员变量对应的 setXxx() / getXxx()方法。
- 必须提供一个无参构造器;有参数构造器是可写可不写的。
书写规范:
public class User {
// 1、成员变量建议使用private私有
private String name;
private double height;
private double salary;
/**
* 2、 要求提供无参数构造器,有参数构造器是可选的
*/
public User() {
}
public User(String name, double height, double salary) {
this.name = name;
this.height = height;
this.salary = salary;
}
/**
* 3、 必须为成员变量提供成套的setter和getter方法
*/
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
成员变量和局部变量的区别: