一 类和对象的简单解释
类: Java中最基本的单位 是对一类抽象概念的描述(模板),类中定义的就是属性(一般用名词描述)和行为(一般用动词描述).
对象: 对象是一种具体的个性表示,类创建出的一个具体事物就是对象.
举个例子:描述一个程序员
属性: 姓名 性别 身高 年龄;
行为: 钱多事少死的早 技能
对象: xxx 男 180cm 25 会写代码.
规定特征:
1) 封装:隐藏代码的属性和实现,不能随意更改 ,需要开放访问方式;
2)继承:在原本的基础上扩充;
3)多态:在一个指定的范围之内进行概念的转换.
二 类和对象的定义和应用
class 类名{
属性(成员变量 实例变量) 书写位置:类中方法外
行为(方法 函数)跟函数一样 就static先不写 书写位置:类中.
}
类名要用大驼峰命名法
实例:定义一个学生类
class Student{
String name;//属性
int age;
String gender;
//行为 方法
public void eat(){
System.out.println("吃饭");
}
public void sleep(){
System.out.println("睡觉");
}
public void playGame(String game){
System.out.println("打"+game);
}
//介绍自己的方法
public void sayHi() {
System.out.println("姓名"+name);
System.out.println("年龄"+age);
System.out.println("性别"+gender);
}
}
类定义完成后不能直接使用,需要通过对象.
如下实例化对象产生后,进行类的操作
创建学生类的对象
类名 对象名称 = new 类名();对象的引用 保存的对象地址
对象.属性:表示调用类中的属性;
对象.方法名(): 表示调用类中的
public static void main(String[] args) {
//创建一个学生类的对象
// 成员变量会随对象一起进入堆内存中 并且只要new一次就在堆内存中
//开辟一块内存空间;
Student stu1 = new Student();
//使用对象名.属性名 进行赋值和取值
stu1.name = "海哥";
stu1.name = "hidan";
stu1.age = 26;
stu1.gender = "女";
System.out.println(stu1.name);
System.out.println(stu1.age);
System.out.println(stu1.gender);
// 调用成员方法 : 对象名.方法名()
stu1.eat();
stu1.playGame("王者荣耀");
//哪个对象调用该方法 打印的就是那个对象的属性
stu1.sayHi();
Student stu2 = stu1;
stu2.name = "董小姐";
stu2.sayHi();
}
局部变量同成员变量的区别:
1.书写位置
成员变量:类中方法外
局部变量:方法中或方法外
2.在内存中表现
成员变量: 堆中
局部变量: 栈中
3.生命周期
成员变量:随着对象进入堆内存中创建,随着对象销毁二销毁
局部变量:随方法调用而入栈,随着方法的结束而销毁
4.作用域
成员变量:整个类中
局部变量:方法中
5.初始值
成员变量:跟堆内存中一样 ,有默认初始值
局部变量:没有初值,必须定义 不给初值 ,编译报错;
不同包下的类:
同名类需要
指定完整的包名来创建对象,例:
com.lanou4g.person p2 =new com.lanou4g.person();//
三 对象引用传递初步分析
如下例子
public class Demo04 {
// 参数是基本数据类型
public static void fun1(int a) {
System.out.println(a);
a=10;
}
// 参数是引用数据类型
//要什么类型给什么类型
public static void fun2(person p) {
p.name = "SD";
p.age = 20;
}
public static void main(String[] args) {
int a =100;
fun1(a);
System.out.println(a);
person p1 = new person();
p1.name = "凡鹏" ;
p1.age = 28;
fun2(p1);
p1.sayhi();
}
}
对应的内存分配如下图
四 匿名对象的应用:
匿名函数在两种情况下使用.
1 .在方法传参数时使用
2.只调用一下方法(不赋值)
1.
public static void setNameAndAge(person p,String name,int age) {
p.name = name;
p.age = age;
p.sayhi();
}
public static void main(String[] args) {
setNameAndAge(new person(), "kun", 20);}// 打印结果 kun 202.
new person().name = "xin";
new person().age = 20;
new person().sayhi();
//只调用方法可以使用
new person().fun();
五 封装
在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法。
封装的好处
1.提高代码的复用性
2.提高代码安全性
实现Java封装的步骤
关键字(权限修饰符) private
public class Person {
private String name;
private int age;
}
name
和
age
属性设置为私有的,只能本类才能访问,其他类都访问不了,如此就对信息进行了隐藏.
对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问,例如:
class Pen{
/*
* 类中书写顺序
* 1.成员变量
* 2.构造方法
* 3.成员方法
* 4.set/get
*/
private String name;
private String color;
//构造方法(无参)
public Pen() {
// 初始化成员变量(给成员变量赋值)
this.name = "毛笔";
this.color = "黑色";
System.out.println(" 我是pen的无参构造方法");
}
//有参构造方法(构造方法的重载)
//为了在创建对象的同时给成员变量赋值.
public Pen(String name,String color) {
this.name = name;
this.color =color;
System.out.println(" 我是pen的有参构造方法");
}
//介绍方法
public void sayhi() {
//使用this可以区分局部变量和成员变量
String name = "yusadn";
System.out.println(this.name+" "+this.color);
}
//set/get 方法
public String getName() {
return name;
}
public String getColor() {
return color;
}
public void setName(String name) {
this.name = name;
}
public void setColor(String color) {
this.color = color;
}
}
public static void main(String[] args) {
// 创建一个 pen对象
// 构造方法 是系统自动调的
// 只要你创建对象,系统就会帮你调用构造方法
// 构造方法只能调用一次
Pen pen = new Pen();
pen.sayhi();
/*pen.setName("dili");
pen.setColor("yellow");
System.out.println(pen.getName());
System.out.println(pen.getColor());*/
// 测试有参构造方法
Pen pen1 = new Pen("钢笔","绿色");
pen1.sayhi();
}
在上面的例子中构造方法 是对成员变量进行初始化;
写法:
1.
没有返回值的位置(连void都不要)
2.
方法名 要与类名完全一致;