面向对象基本概述
-
对象:是真实唯一存在的事务
-
类:实际上是对某种类型事物的共同属性和行为的抽取
自定义类的三个步骤:
-
自定义类
格式:
class 类名{
事物的公共属性使用成员变量描述
事物的公共性未使用函数来描述
}
-
通过类创建对象
new 类名();
-
访问对性的属性或者调用对象的方法
访问对象属性的格式:
对象.属性名
设置对象的属性:
对象.属性名 = 数据
注意:
-
如果成员属性出现在了堆内存中,就会有一个默认的初始化
-
除了八种基本数据类型,其他的默认初始值都是null
对象一旦创建,对象的成员变量也会发生分配默认的初始值
初学者的经典错误:
- 不在同一个范围内随意引用了变量,变量在同一个作用域是可以直接访问的
- 如果一个类要访问另一个类的变量值,那么这时候只能通过创建对象进行访问
class car{
String name;
String color;
int wheel;
public void run(){
System.out.println("hh");;
if(wheel >= 4){
System.out.println();
}else{
System.out.println();
}
}
}
class carfactory{
String name;
String address;
String tel;
public void repair(car c){
if(c.wheel >= 4){
System.out.println("");
}else{
c.wheel = 4;
}
}
}
class demn{
public static void main(String[] args){
car c = new car();
c.name = "nmn";
c.wheel = 4;
c.color = "黑色";
System.out.println(c.name + c.color)
c.run();
}
}
局部变量和成员变量的区别
定义位置上区别:
- 成员变量是定义在方法之外的,类之内的
- 局部变量是定义在方法之内的
作用上的区别:
- 成员变量的作用是用于描述一类事物的公共属性
- 局部变量的作用就是提供一个变量给方法内部使用‘
生命周期的区别:
- 随着对象的创建而存在,随着对象的消失而消失
- 局部变量在调用了相应的方法时执行到了创建该变量的语句时存在,局部变量一旦出了自己的作用域,那么马上从内存中消失
初始值的区别:
-
成员变量有默认的初始值
int 0
float 0.0f
double 0.0
boolean false
char ’ ’
String null
-
局部变量没有默认的初始值,必须初始化才能使用
匿名对象
没有引用类型变量所指向的对象成为匿名对象
匿名对象要注意的事项:
- 我们一般不会给匿名对象赋予属性值,因为无法获取到属性值
- 两个匿名对象永远都不可能是同一个对象
匿名对象可以简化书写
匿名对象的引用场景:
- 如果一个对象需要调用一个方法,而调用完这个方法之后,该对象就不在使用了,这时候可以使用匿名对象
- 可以作为实参调用一个函数
class student{
int num;
String name;
public void study(){
System.out.println("好好学习天天向上");
}
}
class demn{
public static void main(String[] args){
student s = new student();
new student();//匿名对象
System.out.println()
System.out.println(new student() == new student());//判断的是地址是否相等
s.study();
new student().study();//与上面等价
//书写简便,可以尽快的释放内存空间
carfectory f = new carfectory();
f.repair(new car());//匿名对象的使用,该对象调用完一个方法后,就不在使用了
}
}
封装
class mymember{
public String name;
private String sex;
public int salary;
public void talk(){
System.out.println("哈哈哈");
}
public void setsex(String s){//注意:如果比较两个字符串是否相等,不要使用==计较,应该使用equals方法
if(s.equals("男") || s.equals("女")){
sex = s;
}else{
sex = "男";
}
}
public void getsex(){
return sex;
}
}
class demn{
public static void main(String[] args){
mymember m = new mymember();
m.name = "狗娃";
m.setsex("男")
m.salary = 500;
m.sex = "不男不女";
System.out.println(m.name + m.getsex() + m.salary);
}
}
需求:使用java类描述百合网的会员
问题:性别有问题
根本原因:由于其它人可以直接操作sex属性,可以对sex属性进行了直接的赋值
面向对象的语言的三大特征:
继承
多态
封装
解决方法:封装
封装的步骤:
1.使用private修饰需要被封装的属性
2.使用公共的方法设置或者获取该私有的成员属性
命名规范:
set属性值();
get属性值();
权限修饰符:就是控制变量等其他东西的可见范围
public:公共的,public修饰的成员变量和方法任何人都可以访问
private:私有的,只能在本类中进行直接访问
疑问:封装一定要提供get或者set方法吗
不一定,根据需求而定的
规范:在现实开发中,一般实体类的所有成员都要封装起来
实体类:实体类就是用于描述一类事物的
工具类(Arrays数组的工具类)
封装的好处:
1. 提高数据的安全性
2. 操作简单
3. 隐藏了实现
需求:使用java类描述一个计算机类,计算机具备操作数1,操作数2,操作符三个公共属性,还具备运算功能。要求:不能直接对操作数1,操作数2,运算符这些属性进行直接的赋值,要封装起来
class calculator{
private int operand1;
private int operand2;
private char option;
public void calculate()
{
switch(option){
case '+':
System.out.println(operand1 + operand2);
break;
case '-':
System.out.println(operand1 - operand2);
break;
case '/':
System.out.println(operand1 / operand2);
break;
case '*':
System.out.println(operand1 * operand2);
break;
}
}
public void initcalculator(int n1, int n2, char o){
operand1 = n1;
operand2 = n2;
if(o == '+' || o == '-' || o == '/' || o == '*')
{
option = o;
}
}
}
class helloworld{
public static void main(String[] args){
calculator c = new calculator();
c.initcalculator(1, 2, '*');
c.calculate();
}
}