面向对象
思想特征
1.是一种符合我们思想习惯的思想
2.可以将复杂的事情简单化
3.将我们从执行者变成了指挥者
角色发生变化
面向对象开发
就是不断创建对象,使用对象,指挥对象做事情
面向对象特征
-
封装
-
继承
-
多态
类与对象概述
如何描述现实世界
- 属性:就是该事物的描述信息(事物身上的名词)
- ⾏为:就是该事物能够做什么(事物身上的动词)
Java中最基本的单位——类
- 成员变量:事物的属性
- 成员⽅法:事物的⾏为
定义类其实就是定义类的成员
- 成员变量:在类中,⽅法外
- 成员⽅法:在类中.
类和对象的概念
- 类:是⼀组相关的属性和⾏为的集合
- 对象:该类事物的具体体现
- 举例
类——学⽣
对象——具体的某个学⽣就是⼀个对象
学生类的定义
class Student{
//属性的描述
String name;
int age;
//⾏为的描述
public void study(){
System.out.println("学⽣学习");
}
public void sleep(){
System.out.println("学⽣睡觉");
}
}
手机类定义
class Phone{
String brand;
int price;
public void call(){
System.out.println("打电话");
}
public void sendMessage(){
System.out.println("发消息");
}
}
学生类的使用
public class Demo1_Student {
public static void main(String[] args)
{
//创建对象的格式
Student s = new Student();
//定义成员变量
s.name = "张三";
s.age = 23;
System.out.println(s.name + "..." + s.age);
⼿机类的使⽤
//定义成员⽅法
s.study();
s.sleep();
}
}
class Student{
//属性的描述
String name;
int age;
//⾏为的描述
public void study(){
System.out.println("学⽣学习");
}
public void sleep(){
System.out.println("学⽣睡觉");
}
}
手机类的使用
public class Demo2_Phone {
public static void main(String[] args)
{
Phone p = new Phone();
p.brand = "iPhone6 Plus";
p.price = 8888;
System.out.println(p.brand + "..." + p.price);
p.call();
p.sendMessage();
}
}
class Phone{
String brand;
int price;
public void call(){
System.out.println("打电话");
}
public void sendMessage(){
System.out.println("发消息");
}
成员变量与局部变量的区别
在类中的位置不同
- 成员变量:在类中⽅法外
- 局部变量:在⽅法定义中或者⽅法声明上
在内存中的位置不同
- 成员变量:在堆内存中(成员变量属于对象,对象进堆内存)
- 局部变量:在栈内存中(局部变量属于⽅法,⽅法进栈内存)
⽣命周期不同
- 成员变量:随着对象的创建⽽存在,随着对象的消失⽽消失
- 局部变量:随着⽅法的调⽤⽽存在,随着⽅法的调⽤完毕⽽消失
初始化值不同
- 成员变量:有默认化初始值
- 局部变量:没有默认化初始值,必须定义,赋值,然后才能使⽤
注意事项
- 局部变量名称可以和成员变量名称⼀样,在⽅法中使⽤的时候,采⽤的就是就近原则
- 基本数据类型:byte, short,int,long,float,double,boolean,char——空为0
- 引⽤数据类型:数组,类,接⼝,枚举——空为null
public class Demo3_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;
System.out.println(name);
System.out.println(num);
}
}
..如何調用形參
public class Demo4_Student {
public static void main(String[] args)
{
print(10);
Student1 s = new Student1(); //创建对象,并将对象的地址赋值给s
print(s);
}
public static void print(int x){ //基本数据类型当作形式参数:值传递
System.out.println(x);
}
public static void print(Student1 stu){//引⽤数据类型当作形式参数:地址传递
stu.name = "张3";
stu.age = 18;
stu.speak();
}
}
class Student1{
String name;
int age;
public void speak(){
System.out.println(name + "..." + age);
}
}
封裝與this
封装概述
- 是指隐藏对象的属性和实现细节,仅对外提供公共访问⽅式
封装好处
- 隐藏实现细节,提供公共的访问⽅式
- 提⾼了代码的复⽤性
- 提⾼了安全性
封装原则
- 把不需要对外提供的内容都隐藏起来
- 把属性隐藏,提供公共⽅法对其访问
private的概述
- 是⼀个权限修饰符
- 可以修饰成员变量和成员发放
- 被修饰的成员只能在本类中被访问
封装与private的应⽤
- 把成员变量⽤private修饰
- 对其提供对应的getXxx( )和setXxx( )⽅法
- private仅仅是封装的⼀种体现形式,不能说封装就死私有
案例演示
public class Demo6_Person {
public static void main(String[] args){
4.3this的概述
this关键字特点
代表当前对象的引⽤
this的应⽤场景
⽤来区分成员变量和局部变量重名
案例演示
public class Demo6_Person {
public static void main(String[] args){
Person1 p1 = new Person1();
p1.name = "张三" ;
//p1.age = 17;
//p1.speak();
p1.setAge(17);
System.out.println(p1.getAge());
}
}
class Person1{
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的应⽤场景
- ⽤来区分成员变量和局部变量重名
class Demo7_Phone {
public static void main(String[] args) {
Phone1 p1 = new Phone1();
p1.setBrand("三星");
p1.setPrice(5288);
System.out.println(p1.getBrand() + "..." + p1.getPrice());
p1.call();
p1.sendMessage();
p1.playGame();
}
}
/*
⼿机类
属性:品牌brand,价格price
⾏为:打电话call,发短信sendMessage,玩游戏,playGame
*/
class Phone1 { //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("玩游戏");
}
}
构造⽅法
构造⽅法作⽤
- 给对象的数据(属性)进⾏初始化
构造⽅法格式
- ⽅法名和类名相同(字⺟⼤⼩都⼀样)
- 没有返回值类型,连void都没有
- 没有具体的返回值return;
public Person(){
//無參狗早方法
}
//有參構造
public Person(String name,int age){
this.name=name;
this.age=age;
System.out.println("有参的构造函数");
}
- 如果我们没有给出构造函数,系统将⾃动提供⼀个⽆参构造函数
- 如果我们给出了构造函数,系统将不再提供默认的⽆参构造函数
成员变量两种赋值⽅式
- setXxx()⽅法——修改属性值
- 构造⽅法——给对象中属性进⾏初始化
創建對象
Student s = new Student();
步驟
- main 主⽅法进⼊⽅法区
- Student Student.class加载进⼊⽅法区内存
- s 声明⼀个Student引⽤类型s进栈,并赋予地址
- new Student 在堆内存中创建对象
- String name 成员变量默认初始化——没有赋值的值类型为0,没有赋值的引⽤类型为null
- String name = “张三” 成员变量显示初始化
- name = “mousse” 构造⽅法进栈,对对象中的属性赋值,构造⽅法弹栈
- Student s = new Student() 将对象的地址值赋值给s
Static關鍵字
static关键字特点
-
随着类的加载⽽加载
-
优先于对象存在
-
被类的所有对象共享
-
可以通过类名调⽤
-
可以通过类对象名调⽤,但推荐使⽤类名调⽤
-
static修饰的内容⼀般与类相关,并称为类成员
public class Book1_Static {
public static void main(String args[])
{
Person2 p1 = new Person2();
p1.name =" 张三";
p1.country = "中国";
Person2 p2 = new Person2();
p2.name =" 李四";
//p2.country = "中国";
p1.speak();
p2.speak();
//静态多了⼀种调⽤⽅式,可以通过类名
Person2.country ="中国";
System.out.println(Person2.country);
}
}
class Person2{
String name;
static String country;
public void speak(){
System.out.println(name + "..." + country);
}
}
在静态⽅法中没有this关键字
-
静态是随着类的加载⽽加载,this是随着对象的创建⽽存在
-
类⽐对象先存在
静态⽅法只能访问静态的成员变量和静态的成员⽅法
静态⽅法
- 成员变量:只能访问静态变量
- 成员⽅法:只能访问静态成员⽅法
⾮静态⽅法
- 成员变量:可以访问静态变量,也可以访问⾮静态变量
- 成员⽅法:可以⽅法静态⽅法,也可以访问⾮静态⽅法