面向对象(对象和类)
通过编程思想来解决程序的问题:
面向过程编程思想
面向对象编程思想
面向切面编程思想
面向接口编程思想
面向对象编程思想(OOP Object Oriented Programming):
面向对象是基于面向过程的编程思想
面向过程强调的是每一个功能步骤
面向对象强调的是由对象去调用功能
面向对象编程思想优点:
更符合我们思考习惯的思想
可以将复杂问题简单化
将我们从执行者变成指挥者,角色发生了转换
面向对象的核心是对象,对象可以是任意一个事物
Java中使用类来描述现实世界中的元素,类是抽象的
类的结构:
属性: 描述对象的特征
方法: 描述对象的行为功能
设计对象的核心就是要确定对象具备什么功能;
手机——功能:看电影、听音乐、聊天、拍照、打游戏
特征:品牌、价格、形状、大小、尺寸、产地等······
猫——特征:毛色、年龄、性别、品种、体型、体重
功能:吃、睡、抓老鼠、爬树、卖萌······
属性:就是类的特征(数据)描述
通过变量的方式定义属性
属性又称为成员变量或全局变量
创建类:(class用于定义类,一个类中可以编写该类的多个属性或方法)
public class 类名{
//属性
//方法
}
用户类的定义:
类其实是对象的类型,描述了一类对象,这些对象有着相同的属性和方法;比如刚才定义的User类其实并没有指代某个具体用户,每次实例化都表示通过该类型创建了一个新的对象类的编写也是Java 中自定义类型的实现
定义好的类需要通过new实例化后才能使用,实例化后的类才会在内存中生成数据,通过类的实例化在内存中生成的数据称为对象
public class User{
//用户属性
String name;
int age;
String sex;
String job;
}
类的实例化:User user=new User();
访问类的属性:对象名.属性名
user.name="tom";
user.age=20;
方法的优点:
对方法中的代码进行复用
使类的业务结构分离,代码结构更清晰,便于维护管理
方法的创建:访问修饰符 返回值类型 方法名([参数列表]){
//方法体 相关代码
[return ] 值
}
修饰符: 访问修饰符可以对方法、类、属性、包等进行作用,用于修饰添加访问范围、功能等作用
Java的修饰符: public protected private static final synchronized abstracted等
方法的返回值类型:
没有返回值 void
有返回值 定义返回的数据类型
有返回值的方法:
必须使用return 返回数据
返回的数据类型必须和方法声明的数据类型保持一致
方法的调用:
1.类的外部调用方法:类名 对象名=new 类名();——实例化
对象名 . 方法名();——调用方法
2.类的内部调用方法:public void methodA(){}
public void methodB(){
methodA();——直接调用
}
方法中定义的变量和属性名重名怎么办
使用关键字this区分
this表示当前类的实例,使用 (this . 变量名) 即表示访问该类的成员变量
因此定义在方法中的变量,又称为局部变量
类与对象的区别:
类是抽象的,并没有在内存中产生数据,类只是规范定义的该对象类型的结构;
对象是实体,是在内存中创建出来的实体数据,包含了真正的数据内容;
类与对象的联系:
类是对象的类型,是具备相同属性和方法抽离出来的模板
对象是根据类创建出来的实体数据
鸟类是父类,燕子是类,燕子李三是对象
自定义类就是自定义Java中数据类型的过程
数据分为基本类型和引用类型,自定义的所有类都是引用类型
基本类型和引用类型的区别:
1.基本类型的值是结构体,直接存储在内存栈中,引用类型需要实例化的方式才能在内存栈中创建出来
2.栈中数据可直接访问,引用类型必须要通过引用的方式来访问堆中的数据
类中的属性(变量)在类实例化时,JVM会分配默认值
1.int short long float double 默认为0
2.boolean默认值为false
3.char默认值为空字符
4.引用类型的默认值为null(只有栈中的数据,没有堆中的数据,只有实例化以后才会产生堆中的数据)
NullPointException异常就是类没有进行实例化就访问其中的数据产生的
创建类(属性和方法)
/** * 人类,人的类型 */ public class Human { //属性 //通过定义变量描述人的属性 int age; String sex; String name; //方法 /** * 自我描述的方法 */ public void details(){ System.out.println("姓名:"+name+",年龄:"+age+",性别:"+sex); } /** * 购物前的准备方法 */ public void ready(){ System.out.println(name+"出门前整理了帽子"); System.out.println(name+"出门前整理了领带"); } /** * 购物方法 */ public String shopping(){ //方法中声明的变量由于作用域范围,仅在当前方法中生效,因此该变量称为局部变量 //方法中有出现同名变量时,就近优先访问局部变量 String name = "tom"; //同一个类中,内部方法的调用可以直接访问 //this表示当前对象的引用 //默认情况下访问在方法内部访问的属性、方法都使用this this.ready(); System.out.println(this.name+"出去进行了购物"); //有返回值的方法必须要使用return将对应类型的数据返回 //方法只能返回一个值 //return的作用是强制终止所在方法的执行,并将return后的数据返回出去 return "一颗青菜"; } }
测试类(调用属性和方法)
public class HumanTest { public static void main(String[] args) { //实例化Human类,实例化将使类在内存生成相应的数据 //通过实例化产生的数据又称为“对象”,又称为实体数据
//创建第一个人 Human man1 = new Human(); //通过对象名.属性名 来访问该对象的属性 //给属性赋值 man1.name = "特朗普"; man1.sex = "男"; man1.age = 73; //通过对象名.方法名 来访问对象的方法功能 man1.details(); //有返回值的方法,必须要使用相应的类型接收返回值 String goods = man1.shopping(); System.out.println(man1.name+"买回了"+goods); //创建了第二个人 Human man2 = new Human(); man2.name = "特没谱"; man2.sex = "男"; man2.age = 50; //自我描述 man2.details(); //当尝试对为null值的对象访问属性或方法时,会产生NullPointerException异常 Human man3 = null; System.out.println(man3.sex); } }
main方法比较特殊:
main方法中的static不需要new就可以开辟出一个空间
main方法要调用方法是,不管在不在同一个类中,都要进行实例化,通过(对象名 . *) 的形式才能进行调用
带参数的方法使用:
例子:榨汁机
public class Juicer(){ //通过传入的参数确定榨的是什么汁 public String juice(String fruite){ System.out.println("开始榨汁······"); //通过参数确定返回值 return fruite+"汁"; } //调用榨汁方法 public static void main(String[] args){ Juicer juicer=new Juicer(); //接收得到的果汁,在调用方法时可以传入不同的参数 String fruitJuice=juicer.juice("苹果") System.out.println("获得了"+fruitJuice); } }
例子:获取三个数中的最大值
public class Demo{ //判断最大值的方法,返回int public int getMax(int n1,int n2,int n3){ //先将其中一个数定位最大值 int max=n1; //判断其余书是否比他大 if(n2>max){ max=n2; } if(n3>max){ max=n3; } //返回对比后的最大值 return max; } //调用获取最大值的方法 public static void main(String[] args){ //实例化 Demo demo=new Demo(); //接收方法的返回值 int max=demo.getMax(); //打印输出 System.out.println(max); } }
方法中应只写与方法有关的内容,避免不必要的内容,不然调用时会受影响,多方调用多个东西可能会导致不通用
返回值中若有null要返回,则返回类型要写包装类