面相对象
基础概念
非常重要
类似:手机需要考虑属性 功能。
在程序中,事物可以对应java中的类(class)
属性即成员变量,功能即成员方法
类体现的就是这个封装的思想,类是java语言中的最小单位。
面向对象的特征:
封装 继承 多态
思想:
创建对象,使用对象,指挥对象
定义类就是为了去使用它 那创建一个测试类 提供一个主方法,作为入口,在主方法中提取使用。
类是一个抽象的概念。不能直接使用,必须对类进行实例化。
实例化就是创建该类的对象,然后使用这个类的对象,去调用类中的属性。
定义类其实就是定义类的成员(成员变量和成员方法)
成员变量:在类中 方法外。
成员方法:
public void 方法(){}
类:一组相关的属性的行为的集合。
对象:该类的具体体现(例如学生类 对象有班长)
创建对象可以使用关键字new 完成类的实例化。
格式:Person p=new Person(){类名 对象名=new 类名()}
通过对象名调用类中的方法,String name=p.name;
面向对象的使用方法:
需要一个基本类 一个测试类。俩要求在一个包下面
mytext.java(测试类)
package com.itheima.demo;
public class mytest {
//main方法作为一个入口
public static void main(String[] args) {
//创建phone类的对象,用对象来调用类中的成员变量
phone p = new phone();
//调用成员变量,也就是调用成员变量中的属性
int price = p.price;
String brand = p.brand;
char color = p.color;
//调用成员方法
p.ad();
p.fab();
p.gn();
}
}
phone.java
package com.itheima.demo;
import java.sql.SQLOutput;
public class phone {
//定义成员变量
int price = 2000;
String brand = "OPPO";
char color = '白';
//定义成员方法。类名就是自己起的和这个事物有关的相关属性。
一个类可以创建很多对象。
public void ad (){System.out.println("聊天");}
public void fab(){System.out.println("付钱");}
public void gn(){System.out.println("搜索");}
}
内存图:
每new一个对象 都会在内存中开辟新的空间。
面向对象中 如果俩对象相同,也就是地址共用。
画堆栈图的时候先画test因为里面有main方法
成员变量和局部变量的区别:
局部变量:定义在方法中或者方法声明上的变量。局部变量属于方法 随着方法的调用而产生,随着方法的调用完毕而消史。在桟内存。
局部变量必须赋值才能使用。没有默认的初始值。
存放在栈内存
成员变量:定义在类中方法外的变量,属于对象。也叫做实例变量。随着对象的创建而产生,随着对象的回收而消失。在堆内存中。成员变量有默认值。
变量重名时按照就近变量。:先在方法内部找这个变量,找到了就是用,没有找到就去成员范围找。如果还没找到就报错。
参数传递
在调用方法是需要进行参数传递覅。
基本数据类型作为参数传递:把实参的值传递过去 ,,形参的值不影响。
引用类型作为传递:传递的是地地址,形参的改变会影响
可以将多个类,并列的定义到一个.java文件中,public只能加给其中一个,但是建议不使用这种。
匿名对象
没有名字的对象
可以直接调用属性和功能。
可以作为实际参数传递
封裝
封装的好处:隐藏实现的细节,提高了代码的复用性,提高了安全性。
封装的原则:将不需要对外提供的内容都隐藏起来。
private
使用原因:对象.成员变量名=值 这种成员变量值的设置方式不能排除一些不合理现象。
private: 是一个权限修饰符,可以修饰成员变量,也可以修饰成员方法,只能在本类中访问。
是将成员变量用private修饰,提供对应的GET set方法,
get set方法
以后定义一个类时 会把成员变量私有掉。然后提供公共的get set方法,让外界间接的去给成员变量设置值 获取值。
重新打一下手机的代码 使用get set
package com.itheima.demo;
public class ph {
//定义类的时候将成员变量私有
private String name;
private char color;
private String price;
//setName 命名的规范 set设置
public void setName(String mz) {
name = mz;
}
public String getName() {
return name;
}
public void setcolor(char ys) {
color = ys;
}
//get获取 获取之后再返回主方法中所调用的主方法。
public char getColor() {
return color;
}
public void show(){
// System.out.println("名字"+name+"颜色"+color);
}
//权限修饰符 状态修饰符 返回值类型 方法名 (形参列表){方法体}
public void call(){
System.out.println("打电话");
}
}
package com.itheima.demo;
public class mytestph {
public static void main(String[] args) {
//在ph类里面初始化一个ph方法
ph ph = new ph();
//用该方法调用成员属性
ph.setName("OPPO");
ph.setcolor('白');
String name = ph.getName();
char color = ph.getColor();
System.out.println(name);
System.out.println(color);
ph.show();
ph.call();
}
}
权限修饰符:public>protected>缺省的>private;
this代表该类的对象。那个对象调用这个方法 name方法中的this就代表那个对象。
构造方法的格式:
1.创建对象,并且给对象中的成员进行初始化。
2.方法名与类名要相同。
3.没有void,就不需要返回。
构造方法重载的注意事项:
如果我们自己没有定义构造方法,那么系统将自动提供一个无参构造方法。
如果我们给出了有参构造方法,那么系统将不再提供默认的无参构造方法,如果这个时候需要 就要自己给出。
无参构造有参构造打印出老师类
package com.itheima.demo;
import sun.plugin2.message.ShowDocumentMessage;
public class teacher {
private String name;
private int age;
public teacher() {
System.out.println("空参构造调用");
}
public teacher(String name, int age) {
this.name = name;
this.age = age;
System.out.println("有参构造调用");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
package com.itheima.demo;
import sun.plugin2.message.GetNameSpaceMessage;
import java.sql.SQLOutput;
public class mytestth {
public static void main(String[] args) {
//空参
teacher th = new teacher();
System.out.println(th);
th.setName("px");
th.setAge(12);
System.out.println(th.getAge());
System.out.println(th.getName());
//有参
teacher th1 = new teacher("px",30);
System.out.println(th1.getName());
System.out.println(th1.getAge());
}
}