面向对象
面向对象的特征
封装(encapsulation)
继承(inheritance)
多态(polymorphism)
类与对象的概述
- 现实生活中如何描述事物
- 属性 就是该事物的描述信息
- 行为 该事物能够做什么
- Java中最基本的单位是类,Java中用class描述事物
- 成员变量 事物的属性
- 成员方法 事物的行为
- 定义类其实就是定义类的成员(成员变量和成员方法)
- 成员变量 和以前定义变量一样,只是位置发生了变化.在类中方法外
- 成员方法 和以前定义方法一样,只不过去掉了static
类和对象的概念
- 类:是一组相关属性和行为的集合
- 对象:是该类事物的具体体现
- 举例
- 类:学生
- 对象:具体某个学生
class Demo1_Student {
public static void main
(String[] args){
//创建对象的格式: 类名 对象名=
new 类名();
//对象名:其实就是合法的标识符,如
果一个单词所有字母小写,如果是多个
单词,从第二个单词开始首字母大写
Student s=new Student();
//如何使用成员变量? 对象名.变量名
s.nema="张三";
s.age=23;
//如何使用成员方法?
对象名.方法名(...)
s.study();
s.sleep();
}
}
class Student{
String name;
int age;
String gender;
public void study(){
System.out.println("学生学习");
}
public void sleep(){
System.out.println("学生睡觉");
}
}
学生类的使 用
文件名问题
- 在一个Java文件中写两个类:一个基本类,一个测试类.
- 建议文件名和测试类一致
如何适用对象
- 创建对象并使用
- 格式: 类名 对象名 = new 类名();
如何使用成员变量
- 对象名.变量名
如何使用成员方法
- 对象名.方法名(…)
class Demo1_Car{
public static void main(String[]
args){
Car c1=new Car();//创建对象
//调用属性并赋值
c1.color="red";//为车的轮胎数赋值
c1.num=8; //为车的轮胎数赋值
//调用行为
c1.run();
Car c2=new Car();//创建对象
c2.colar="black";//为车的颜色赋值
c2.num=4;
//为车的轮胎数赋值
//c2=null;
//用null把原来的地址值覆盖掉
//c2.run();
//c2里面的记录是null,所以报出
空指针异常
Car c3=c2;
c3.run();
}
}
/*
车的属性 车的颜色 车的轮胎数
车的行为 车运行
*/
class Car{
//成员变量
String colar; //车的颜色
int num; //车的轮胎数
public void run(){ //车运行
System.out.println(colar+"..."+num);
}
}
一个对象的内存图
两个对象的内存图
三个对象的内存图
匿名对象内存图
成员变量和局部变量的区别
在类中的位置不同
- 成员变量:在类中方法外
- 局部变量:在方法定义中或者方法声明上
在内存中的位置不同
- 成员变量:在对内存中(成员变量属于对象,对象进堆内存)
- 局部变量:在栈内存中(局部变量属于方法,方法进栈内存)
生命周期不同
- 成员变量:随着对象的创建而存在,随着对象的消失而消失
- 局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
初始化值不同
- 成员变量:有默认初始化值
- 局部变量:没有默认初始化值,必须定义,赋值,然后才能使用
注意事项
- 局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则
- 基本数据类型变量包括哪些:byte,short,int,long,float,double,boolean,char
- 引用数据类型变量包括哪些:数组,类,接口,枚举
class Demo2_Person{
public static void main(String[]
args){
Person p =new Person();
p.speak();
}
}
class Person{
String name; //成员变量
int num;
public void speak() {
int num = 10;
//x和num都是局部变量
System.out.println(name);
System.out.println(num);
}
}
方法的形式参数是类名的时候如何调用
- 方法的参数是类名 public void print (Student s){}//print(new Student());
- 一个方法的形式参数是一个类类型(引用类型),这里其实需要的是该类的对象
匿名对象的概述和应用
class Demo1_Student {
public static void main(String[]
args) {
print(10);
//创建对象,并将对象的地址值赋值给s
Student s = new Student();
print(s);
}
//基本数据类型当作形式参数
public static void print(int x) {
System.out.println(x);
}
//引用数据类型当作形式参数
public static void print(Student stu){
stu.name = "张三";
stu.age = 23;
stu.speak();
}
}
/*
* A:方法的参数是类名public void print
(Student s){}//print(new Student());
* 如果你看到了一个方法的形式参数是一个类
类型(引用类型),这里其实需要的是该类的对象
*/
class Student {
String name; //姓名
int age; //年龄
public void speak() {
System.out.println(name + "..."
+ age);
}
}
匿名对象:没有名字的对象
匿名对象的应用场景
- 场景:仅仅用一次的时候
- 好处:节省代码(多次调用的时候不合适,匿名对象调用完毕就是垃圾,可以被垃圾回收器回收)
- 注意:调用多次的时候不适合.匿名对象调用完毕就是垃圾,可以被垃圾回收器回收
- 匿名对象可以作为实际参数传递
- 案例演示
- 匿名对象应用场景
class Demo2_Car {
public static void main(String[]
args) {
/*Car c1 = new Car();
//创建有名字的对象
c1.run();
c1.run();
new Car().run();
//匿名对象调用方法
new Car().run(); */
/*匿名对象只适合对方法的一次调用,
因为调用多
次就会产生多个对象,不如用有名字的
对象*/
//匿名对象是否可以调用属性并赋值?
有什么意义?
/*
匿名对象可以调用属性,但是没有意义
,因为调用后就变成垃圾
如果需要赋值还是用有名字对象
*/
new Car().color = "red";
new Car().num = 8;
new Car().run();
}
}
class Car {
String color; //颜色
int num; //轮胎数
public void run() {
System.out.println(color + "..."
+ num);
}
}
class Demo3_Car {
public static void main(String[]
args) {
//Car c1 = new Car();
/*c1.color = "red";
c1.num = 8;
c1.run();*/
//method(c1);
method(new Car());
//Car c2 = new Car();
//method(c2);
method(new Car());
//匿名对象可以当作参数传递
}
//抽取方法提高代码的复用性
public static void method(Car cc) {
//Car cc = new Car();
cc.color = "red";
cc.num = 8;
cc.run();
}
}
class Car {
String color; //颜色
int num; //轮胎数
public void run() {
System.out.println(color + "..."
+ num);
}
}
封装的概述
封装概述
- 封装是指隐藏对象的属性和实现细节,仅对外提供公共访问的方式
封装的好处
- 隐藏实现的细节,提供公共访问方式
- 提高代码的复用性
- 提高安全性
封装原则
- 将不需要对外提供的内容都隐藏起来
- 把属性隐藏,提供公共方法对其访问
privite关键字的概述和特点
private关键字的特点
- 是一个权限修饰符
- 可以修饰成员变量和成员方法
- 被其修饰的成员只能在本类中被访问
案例演示
- private仅仅是封装的一种体现形式,不能说封装就是privat
/*
* A:人类赋值年龄的问题
* B:private关键字特点
* a:是一个权限修饰符
* b:可以修饰成员变量和成员方法
* c:被其修饰的成员只能在本类中被访问
* C:案例演示
* 封装和private的应用:
* A:把成员变量用private修饰
* B:提供对应的getXxx()和setXxx()方法
* private仅仅是封装的一种体现形式,不
能说封装就是私有
*/
class Demo1_Person {
public static void main(String[]
args) {
Person p1 = new Person();
p1.name = "张三";
//调用姓名属性并赋值
//p1.age = -17;
//调用年龄属性并赋值
//p1.speak(); //调用行为
p1.setAge(-17);
System.out.println(p1.getAge());
}
}
class Person {
String name; //姓名
private int age; //年龄
public void setAge(int a) {
//设置年龄
if (a > 0 && a < 200) {
age = a;
}else {
System.out.println(
"请回火星吧,地球不适合你");
}
}
public int getAge() {
//获取年龄
return age;
}
public void speak() {
System.out.println(name + "..."
+ age);
}
}
this关键字的概述和应用
this关键字的特点
- 代表对当前对象的引用
案例演示
- this的应用场景
- 用来区分成员变量和局部变量重名
/*
* A:this关键字特点
* 代表当前对象的引用
* B:案例演示
* this的应用场景
* 用来区分成员变量和局部变量重名
*/
class Demo1_This {
public static void main(String[]
args) {
Person p1 = new Person();
p1.setName("张三");
p1.setAge(23);
System.out.println(p1.getName()
+ "..." +
p1.getAge());
Person p2 = new Person();
p2.setName("李四");
p2.setAge(24);
System.out.println(p2.getName()
+ "..." +
p2.getAge());
}
}
class Person {
private String name;
//姓名
private int age;
//年龄
public void setAge(int age) {
//设置年龄
if (age > 0 && age < 200) {
this.age = age;
//System.out.println(age);
}else {
System.out.println(
"请回火星吧,地球不适
合你");
}
}
public int getAge() {
//获取年龄
return age;
}
public void setName(String name) {
//设置姓名
this.name = name;
//System.out.println(name);
}
public String getName() {
return name;
}
}
class Demo2_Phone {
public static void main(String[]
args) {
Phone p1 = new Phone();
p1.setBrand("三星");
p1.setPrice(5288);
System.out.println(p1.getBrand()
+ "..." + p1.getPrice());
p1.call();
p1.sendMessage();
p1.playGame();
}
}
/*
手机类
属性:品牌brand,价格price
行为:打电话call,发短信sendMessage,玩
游戏,playGame
*/
class Phone { //java bean
private String brand;
//品牌
private int price;
//价格
public void setBrand(String brand) {
//设置品牌
this.brand = brand;
}
public String getBrand() {
//获取品牌
return this.brand;
//this.可以省略,你不加系统会默认
给你加
}
public void setPrice(int price) {
//设置价格
this.price = price;
}
public int getPrice() {
//获取价格
return price;
}
public void call() {
//打电话
System.out.println("打电话");
}
public void sendMessage() {
//发短信
System.out.println("发短信");
}
public void playGame() {
//玩游戏
System.out.println("玩游戏");
}
}