面向对象:找对象或者设计对象来解决问题。
(1)定义类
类:是对象共同特征的描述。
对象:是真实存在的具体实例。
在java中,必须先设计类,才能创建对象并使用。
public class 类名{
1,成员变量(代表属性,一般是名词)
2,成员方法(代表行为,一般是动词)
3,构造器
4,代码块
5,内部类
}
先创建类:
package day4;
public class car {
String name;
double price;
public void start(){
System.out.println(name+"启动了");
}
public void run(){
System.out.println("价格是:"+price+"的"+name+"跑的很快");
}
}
再创建对象:
package day4;
public class oop1 {
public static void main(String[] args) {
//创建汽车对象
car c = new car();
c.name="宝马";
c.price=34.78;
System.out.println(c.name);
System.out.println(c.price);
c.start();
c.run();
}
}
输出结果:
定义类的几个补充事项:
1: 类名最好大写,不能用关键字,必须是合法标识符
2:建议一个代码文件只定义一个类,比较规范
3:成员变量的完整定义格式是:修饰符 数据类型 变量名称 = 初始化值;
一般无需指定初始化,存在默认值。
默认值的规则:
byte short int long -----0
double float-----0.0
boolean----false
String----null
(2)对象在内存中的运行机制
多个对象的内存图:
*对象存放在new---堆内存中
*Car c = new Car() c里面存储的是对象在堆内存中的地址
*成员变量(name,price)的数据放在对象里,存在堆内存中
两个变量指向同一个对象:
(赋值的是地址!!)
package me;
public class test {
public static void main(String[] args) {
//创建学生对象
Student s1=new Student();
s1.name="小明";
s1.hobby="打球";
s1.sex='男';
s1.study();
//把s1变量赋值给一个学生类型的变量s2
Student s2=s1; //赋值的是s1里存储的对象地址,即s1和s2里的地址相同。
System.out.println(s1);
System.out.println(s2);
s2.hobby="爱睡觉";
System.out.println(s1.hobby);
}
}
运行结果
(3)构造器
构造器是定义在类中的,可以用于初始化一个类的对象,并返回对象的地址。
调用构造器得到对象的格式:
类 变量名称 = new 构造器;
Car c = new Car();
无参数构造器(默认存在的):初始化对象时,成员变量的数据均采用默认值。
Car c1=new Car("奔驰",39.8);
有参数构造器:在初始化对象的时候,同时可以接受参数为对象进项赋值。
package ac;
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;
}
}
package ac;
public class test {
public static void main(String[] args) {
//通过调用构造器得到对象
Car c = new Car();
c.name="小明";
c.price=2356;
System.out.println(c.name);
System.out.println(c.price);
//调用有参数构造器
Car c2 =new Car("奔驰",456);
System.out.println(c2.name);
System.out.println(c2.price);
}
}
输出结果
构造器的注意事项:
*任何类定义出来,默认就自带了无参数构造器,写不写都有。
*一旦定义了有参数构造器,那么无参数构造器就没有了,如何还想使用无参数构造器,此时就需要自己手写一个无参数构造器了。
构造器的作用:初始化对象,并返回对象地址
构造器有两种:无参数,初始化对象时,成员变量的数据均采用默认值。
有参数,初始化对象时,同时可以接收参数为对象赋值。
(4)this关键字
this关键字代表当前对象的地址。
package asd;
public class Car {
public Car(){
System.out.println("无参数构造器中的this:"+this);
}
public void run(){
System.out.println("这是方法中的this:"+this);
}
}
package asd;
public class test {
public static void main(String[] args) {
//this 关键字的作用
//创建car对象
Car c=new Car();
c.run();
System.out.println(c);
}
}
this关键字的作用:
*可以用于指定访问当前对象的成员变量,成员方法。
*this出现在成员方法中的用法。
(5)封装
面向对象的三大特征:封装,继承,多态。
封装告诉我们。如何正确设计对象的属性和方法。
封装的原则:对象代表什么,就得封装对应的数据,并提供数据对应的行为。
人关门,”关“是门的一种方法,状态,关门是门的方法,而不是人的方法。
成员变量 使用 private 修饰,只能在本类中访问了。
package ace;
public class Stu {
// 成员变量 使用 private 修饰,只能在本类中访问了。
private int age;
//提供 getter 和 setter 方法暴露其取值和赋值
public void setAge(int age){
if(age>=0 && age<=200){
this.age=age;
}
else{
System.out.println("您的年龄有问题");
}
}
public int getAge(){
return age;
}
}
package ace;
public class test1 {
public static void main(String[] args) {
Stu s=new Stu();
s.setAge(23);
System.out.println(s.getAge());
}
}
如何进行更好的封装:
*把成员变量使用private 隐藏起来,对外就不能访问了
*提供public修饰的getter 和setter方法暴露其取值和赋值
(6)标准javaBean
也可以称为实体类,其对象可以用于在程序中封存数据。
JavaBean 是可以用快捷键完成的,鼠标单击右键选择Generate 。。。
package javabean;
public class User {
//成员变量建议使用 private 私有定义
private String name;
private double height;
private double salary;
public User() {
}
//构造有参数构造器
public User(String name, double height, double salary) {
this.name = name;
this.height = height;
this.salary = salary;
}
//必须为成员变量提供成套的 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;
}
}
package javabean;
public class test {
public static void main(String[] args) {
//无参数构造器创建对象封装一个用户信息
User u1=new User();
u1.setHeight(111);
u1.setName("小王");
u1.setSalary(1233);
System.out.println(u1.getHeight());
System.out.println(u1.getName());
//有参数构造器创建对象封装一个用户信息
User u2=new User("zhang",123,3456);
System.out.println(u2.getName());
System.out.println(u2.getHeight());
System.out.println(u2.getSalary());
}
}
输出结果
(7)成员变量和补充变量的区别