/*
面向对象的编程思想:
思想:非常高度概括的思想和行为的准则
编程思想:指引我们编程(开发/写代码)的原则
面向过程的编程思想:
经典代表:C语言
程序的最小单位是函数。一个函数代表一个功能
程序员关注的角度:把大的功能分解为一个一个小的功能。只关注怎么做。
面向过程是把数据与功能分开的。
面向对象的编程思想:
经典代表:Java语言
程序的最小单位是类/对象。
程序关注的角度:把复杂的业务逻辑/功能中先抽取出“类”,然后再考虑这个类能包含什么属性、方法等
面向对象是把数据和功能(行为)合起来。关注“谁”做
面向对象的程序员从执行者的角度转变为指挥者的角度。
例如:
把大象装进冰箱的问题?
面向过程:
(1)把冰箱门打开
(2)把大象装进去
(3)把冰箱门关上
面向对象:
人、冰箱、大象
人{
String name;
push(){
}
pull(东西){
if(东西 instanceof 冰箱){
冰箱 bing = (冰箱)东西;
bing.open();
}else if(东西 instanceof 大象){
大象 da = (大象)东西;
da.walk();
}
}
}
东西{
}
冰箱 extends 东西{
double volume;
open(){
}
close(){
}
save(){
}
}
大象{
walk(){
}
}
人 p = new 人("张三");
冰箱 b = new 冰箱(10000);
大象 d = new 大象();
p.pull(b);//人拉冰箱门
p.pull(d);//人拉大象
p.push(b);//人推冰箱门
*/
//-----------------------------------------------------------------------------------------------
/*
面向对象的学习围绕几条主线:
1、类与对象
2、面向对象的基本特征:封装、继承、多态
3、相关关键字和API
4、面向对象的编程的原则和设计模式等
*/
对象的属性内存图
//方法-------------------------------------------------------
/*
6、方法声明与调用的总结
先声明后调用
1、声明
【修饰符】 返回值类型 方法名(【形参列表】){
方法体
}
(1)返回值类型如果不是void,在方法体中,需要return 返回值;的语句,
(2)返回值类型是void,在方法体中,可以有return ;语句,会结束整个方法
也可以没有return ;语句
2、调用
(1)本类同级别
方法名(【实参列表】); //无返回值的方法
变量 = 方法名(【实参列表】); //有返回值的方法
(2)其他类中
对象名.方法名(【实参列表】); //无返回值的方法
变量 = 对象名.方法名(【实参列表】); //有返回值的方法
说明:
(1)如果被调用的方法的返回值类型是void,那么千万不要用变量接收,也不用打印方法调用;
只能单独一个调用语句;
(2)如果被调用的方法有(形参列表),那么调用时,必须传对应(实参列表)
*/
//-0、总纲
/*
类的提取:
名词提取法,转换为现实世界中的事物的类别==》计算机程序中的类
类的设计:
类的成员的设计
5大成员(5大组成部分):
1、属性:数据特征
2、方法:行为特征,功能特征
3、构造器:创建对象时用
4、代码块:在类初始化和对象初始化时用的
5、内部类:在某个大的事物中,包含了一个独立的小的事物类别,而且一般这个小的事物只为大的事物服务时
类{
成员列表
}
*/
011、类的声明的格式:
【修饰符】 class 类名{
}
例如:
class Person{
}
说明:类名,每一个单词的首字母都大写
回忆:如果有一个类是public的,那么源文件名必须与类名相同
2、类的第一类成员:属性
(1)属性的声明
【修饰符】 数据类型 属性名;
3、如何用类来创建对象?
语法格式:
类名 对象名 = new 类名();
对象名其实也是变量名/对象的引用
对象名/变量名:从第二个单词开始首字母大写
4、为某个对象的属性赋值
对象名.属性名 = 值;
5、访问某个对象的属性值
例如:打印某个对象的属性值
System.out.println(对象名.属性名);
*/
class Person{
//声明属性
String name;
int age;
char gender;
}
//声明类
public class test07{
//声明main方法
public static void main(String[]args ){
//(1)创建对象
Person p=new Person();
//(2)为p对象的name属性赋值
p.name="张三";
//(3)为p对象的age赋值
p.age=23;
//为p对象的gender赋值
p.gender='男';
//(4)访问/显示对象的属性的值
System.out.println("姓名:"+p.name);
System.out.println("年龄:"+p.age);
System.out.println("性别:"+p.gender);
}
}
//------get,set属性赋值--------------------------------------------------------------------------------------------------
/*
1、声明一个圆的图形类,有属性:半径
2、在测试类的main中,创建圆的2个对象,并为半径属性赋值
*/
因为这要引用“包”,或者说引用外部类,我们怎么处理呢?有两种方法
外部类创建好之后,先编译一下,然后写我们的调用类,切记一定不要漏掉主方法(Circel是外部类,其实也可以写在里面,但是我们现在写在外面是想告诉大家,怎么调用外部类,后面还会有更加常用的调用外部类的办法,这里只是基础或者说明白它的原理套路等)
//--------属性-----------------------------------------------------------------------
/*
属性的特点:
1、属性有默认值
原则和数组的元素的默认值一样。
(1)基本数据类型
byte,short,int,long:0
float,double:0.0
boolean:false
char:\u0000
(2)引用数据类型:null
例如:String是引用数据类型
2、每一个对象的属性值是独立的
*/
class test07_3{
public static void main(String[]args){
//1、创建一个动物的对象
Animal a1 = new Animal();
//2、直接访问a1对象的属性值
System.out.println("a1的name属性值"+a1.name);//这样就知道默认值是多少了//默认值null
System.out.println("a1的name属性值"+a1.legs); //默认值0
//String str;//错误: 可能尚未初始化变量str
//System.out.println("str = "+str);//错误: 可能尚未初始化变量str
//创建第二个动物对象
Animal a2 = new Animal();
a2.name="大象";
a2.legs=4;
//访问a1对象的属性值
System.out.println("a1的name属性值"+a1.name);
System.out.println("a1的name属性值"+a1.legs);
//访问a2对象的属性值
System.out.println("a2的name属性值"+a2.name);
System.out.println("a2的name属性值"+a2.legs);
}
}
//Animal 动物
class Animal{
//属性
String name;//动物的名称
int legs;//腿的数量
}
------类的成员之二:方法---------------------------------------------
/*
类的成员之二:方法
方法(method)又称为函数(function)。
方法是代表一个独立的可复用的功能。
例如:Math.random(),代表产生[0,1)随机值的功能
Math.sqrt(x),代表求x的平方根的功能
声明方法的好处:
(1)代码的复用
(2)简化程序员的代码量:使用者不管关心方法的内部如何实现的,
只要关注这个方法:功能、是否需要传参数、是否有返回值等问题
1、如何声明一个方法?
【修饰符】 返回值类型 方法名(【形参列表】){
方法体:实现代码的功能
}
【修饰符】:今天先不讨论
返回值类型:
(1)void:代表无返回值,
(2)非void:可以是任意的Java数据类型,包括8种基本数据类型、所有的引用数据类型
方法名:
(1)见名知意:能够体现这个方法的功能
(2)和变量名一样,从第二个单词开始首字母大写
(【形参列表】):
(1)():无参
(2)(形参列表):有参
*/
class test07_4Method{
/*
public static:修饰符
void:返回值类型
main;方法名
(String[] args):形参列表
*/
public static void main(String[]args){
//在本类中,同一级别的方法中,调用,直接调用
//main()与printRectangle()在同一个类中,并且是同一个级别的方法
printRectangle();
System.out.println("-----------------------");
printRectangle();
}
//这个位置是在类中
//public static 是修饰符,先照抄
//假设我这里想要完成一个功能:打印5行10列的*组成的矩形
//void:返回值类型,它是一种特殊的返回值类型,表示无返回值
//printRectangle:方法名
//():形参列表,如果()中没有东西,称为“无参,空参”
//{}:{}中是方法体,完成方法功能的代码
public static void printRectangle(){
for(int i=1;i<=5;i++){
for(int j=1;j<=10;j++){
System.out.print("*");
}
System.out.println();
}
}
}
--------------无参无返回值的方法-------------------------------------------------------------------------------------------------------------------
/*
方法的原则:
(1)必须先声明后使用
(2)不调用不执行
一、无参无返回值的方法
1、如何声明
【修饰符】 void 方法名(){
方法体
}
2、调用
(1)在本类中,同一个级别,直接调用
方法名();
(2)在其他类中,需要通过"对象名.方法"
对象名.方法名();
*/
class test07_5NoParamNoReturnValue{
public static void main(String[]args){
//1、创建对象
Studnet s1=new Studnet();
//2、通过对象去调整方法
s1.printInfo();
//3、给属性赋值
s1.name="杨洪波";
s1.age=23;
s1.score=100;
//4、再次调用s1对象的printInfo()
s1.printInfo();
}
}
class Studnet{
//属性
String name;
int age;
int score;
//方法
//省略修饰符
//1、声明一个方法,可以打印当前学生对象信息
void printInfo(){
System.out.println("姓名:" + name + ",年龄:" +age + ",成绩:" + score);
}
}
------------内部类的错误写法-----------------------------------------------------------------------------
下面看几个错误写法来细品理解内部类
/*
.java的源文件的结构:
类{
方法{
语句;//必须在方法中
}
}
*/
class test07_6内部类1{
public static void main(String[]args){
//Circle c=new Circle();//这样使用有问题,后面再讲内部内的使用
}
//内部类
class Circle{
double radius; //声明圆的半径
//System.out.println("半径:"+radius); //错误写法,不能把语句写到方法外面去
void printInfo(){
System.out.println("半径:"+radius);
}
//printInfo(); //这也是语句,调用方法的语句//但是这样写又是错的
void test(){
printInfo(); //这样调用才是对的
}
}
}
自己去敲一敲,才能理解:
内部类后面讲解,现在只理解一下
-----------------test07_7无参有返回值的方法-------------------------------------------------------------------------------------------------------------------
/*
无参有返回值的方法:
double d = Math.random() ;
int num = input.nextInt();
double d = input.nextDouble() ;
一、无参有返回值的方法
1、声明格式
【修饰符】 非void的返回值类型 方法名(){
方法体
}
2、调用格式
(1)其他类中:
变量 = 对象名.方法名();
或
System.out.println(对象名.方法名());
这个变量用来接收返回值
(2)本类的同级方法中
变量 = 方法名();
或者
System.out.println(方法名());
*/
-------------------------------有参无返回值-----------------------------------------------------------------------------
/*
三、有参无返回值的方法
1、声明格式
【修饰符】 void 方法名(形参列表){
方法体
}
形参列表的格式:
(数据类型 形参名)
(数据类型1 形参名1, 数据类型2 形参名2, ....)
2、调用格式
(1)本类同级别
方法名(实参列表);
(2)其他类中
对象名.方法名(实参列表);
3、两个名词:
形参列表:声明时()中
(数据类型1 形参名1, 数据类型2 形参名2, ....)
(int n,int m, char x)
实参列表:调用时()中
(3,5,'%')
(a,b,c)
5、实参与形参
实参是赋值给形参赋值
要求,实参的个数、类型、顺序与形参一一对应
*/
class test07_8有参无返回值{
public static void main(String[]args){
//1、创建对象
GraphicTools tools=new GraphicTools();
//2、调用print5Line10ColumnStarRectangle()
tools.print5Line10ColumnStarRectangle();
//3、调用printRectangle(int n,int m,char x)
tools.printRectangle(3,5,'%');// (3,5,'%')为实参
//4、赋值之后再调用一次
int a=2,b=4;
char c='#';
tools.printRectangle(a,b,c);// (a,b,c)称为实参列表
}
}
//GraphicTools 图形工具类
//在这个工具类中,有各种各样的打印图形的方法
class GraphicTools{
//省略修饰符
//(1)声明一个可以打印5行10列的*的矩形
//无参数无返回值
void print5Line10ColumnStarRectangle(){
for(int i=1;i<=5;i++){
for(int j=1;j<=10;j++){
System.out.print("*");
}
System.out.println();
}
}
//(2)声明一个可以打印n行m列的*的某字符的矩形
//让调用这个方法的程序员来决定n、m、x的值
//形参列表(int n int m char x)
void printRectangle(int n,int m,char x ){
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
System.out.print(x);
}
System.out.println();
}
}
}
-------------四、有参有返回值的方法----------------------------------------------------------
1、声明格式
【修饰符】 非void的返回值类型 方法名(形参列表){
方法体
}
2、调用格式
(1)其他类中
变量 = 对象名.方法名(实参列表);
或
System.out.println(对象名.方法名(实参列表));
(2)本类同级别调用
变量 = 方法名(实参列表);
或
System.out.println(方法名(实参列表));
*/
class test07_9有参有返回值的方法{
public static void main(String[]args){
//1、创建对象
MyMathTools tools=new MyMathTools();
//2、调用max()
int m=tools.max(4,6);
System.out.println("4,6最大值是:" + m);
System.out.println("5,2的最大值是"+tools.max(5,2));
//3、调用threeNumberMax()
System.out.println("3,2,7 的最大值是:"+tools.threeNumberMax(3,2,7));
}
}
//声明一个数学计算工具类
class MyMathTools{
//1、求任意两个整数的最大值
int max(int a,int b){
return a>b?a:b;
}
//省略了访问修饰符
//求任意三个整数的最大值
int threeNumberMax(int x,int y,int z){
//本类同级别调用
/*
int m=max(x,y);
m=max(m,z);
return m;
*/
return max(max(x,y),z);
}
}