1.(了解) 面向对象 vs 面向过程 例子:人开门;把大象装冰箱
2.面向对象的编程关注于类的设计!
1)一个项目或工程,不管多庞大,一定是有一个一个类构成的。
2)类是抽象的,好比是制造汽车的图纸。
而具体的一辆一辆的车,是根据图纸制造的,实际上就是类的实例化
3.完成一个项目(或功能)的思路
1)所要完成的功能对应的类的对象是否存在。
2)若存在,则通过对象直接调用对应的类中的属性或方法即可 。 例如 Scanner。
3)若不存在,需要创建类的对象。甚至说,类都不存在,就需要设计类。
4.面向对象编程的三条主线:
1)类及类的构成成分:属性 方法 构造器 代码块 内部类
2)面向对象编程的特征:封装性 继承性 多态性 (抽象性)
3)其它的关键字:this super package import static final abstract interface ...
1.关于于类的设计
2.类的组成成分:
1) 属性(成员变量,Field)
2)方法(成员方法,函数,Method)
2.1属性:
* 成员变量 vs 局部变量
* 相同点:1.遵循变量声明的格式: 数据类型 变量名 = 初始化值
* 2.都有作用域
* 不同点:1.声明的位置的不同 :成员变量:声明在类里,方法外
* 局部变量:声明在方法内,方法的形参部分,代码块内(main方法也是方法,所以main方法里边的变量也是存放在栈空间)
* 2.成员变量的修饰符有四个:public private protected 缺省
* 局部变量没有修饰符,与所在的方法修饰符相同。
* 3.初始化值:一定会有初始化值。
* 成员变量:如果在声明的时候,不显式的赋值,那么不同数据类型会有不同的默认初始化值。
* byte short int long ==>0
* float double ==>0.0
* char ==>空格
* boolean ==>false
* 引用类型变量==>null
* 局部变量:一定要显式的赋值。(局部变量没有默认初始化值)
* 4.二者在内存中存放的位置不同:成员变量存在于堆空间中;局部变量:栈空间中
*
* 总结:关于变量的分类:1)按照数据类型的不同:基本数据类型(8种) & 引用数据类型
* 2)按照声明的位置的不同:成员变量 & 局部变量
2.2 方法:提供某种功能的实现 main方法也是方法,main方法里边的属性也必须要赋值。
* 1)实例:public void eat(){//方法体}
* public String getName(){}
* public void setName(String n){}
* 格式:权限修饰符 返回值类型(void:无返回值/具体的返回值) 方法名(形参){}
*
* 2)关于返回值类型:void:表明此方法不需要返回值
* 有返回值的方法:在方法的最后一定有return + 返回值类型对应的变量
* 记忆:void 与return不可以同时出现一个方法内。像一对“冤家”。
*
* 3)方法内可以调用本类的其他方法或属性,但是不能在方法内再定义方法!
public class Zoo { public static void main(String[] args) { //基本数据类型的声明:数据类型 变量名 = 初始化值 int i = 10; //类的实例化:如下的a1就是一个实实在在的对象 Animal a1 = new Animal(); //int[] arr = new int[10]; System.out.println("name:" + a1.name + " age:" + a1.age); //通过对象调用属性 a1.name = "花花"; a1.age = 3; System.out.println("name:" + a1.name + " age:" + a1.age); //通过对象调用方法 a1.eat(); a1.sleep(); //再创建一个类的对象 Animal a2 = new Animal(); System.out.println("name:" + a2.name + " age:" + a2.age);//null 0 a2.name = "小花"; System.out.println("name:" + a1.name + " age:" + a1.age); System.out.println("name:" + a2.name + " age:" + a2.age); //a3不意味着相较于a1重新创建的一个对象,而是a1与a3共用一个对象实体 Animal a3 = a1; System.out.println("name:" + a3.name + " age:" + a3.age);//与a1一样 a3.name = "维尼熊"; System.out.println("a1:name:" + a1.name + " age:" + a1.age); System.out.println(a2.getName());//a2.name; System.out.println(a2.desc()); } } class Animal{ //1.属性 String name; int age; //2.方法 public void eat(){ System.out.println("动物进食"); } public void sleep(){ System.out.println("动物休眠"); //return; } public String getName(){ return name; } public int getAge(){ System.out.println("hello"); return age; //其后不可以声明语句 //System.out.println("hello"); } //当通过对象调用此方法时,会将方法的方法的返回值提供给方法的调用者,也就是当前的对象。 public String desc(){ if(age > 2){ return "恰同学少年"; }else{ return "还是看动画片的年龄"; } } public void setName(String n){//n:局部变量 name = n; } public void addAge(){ int i = 0;//局部变量 age += i; } public void info(){ // 可以在方法内调用本类的其他方法,但是不可以在方法内定义新的方法 eat(); sleep(); // public void breath(){ // System.out.println("呼吸"); // } } // System.out.println("hello!");
3.面向对象编程的思想的落地法则一:
1)设计并创建类及类的成分
2)实例化类的对象
3)通过“对象.属性”或"对象.方法"的形式完成某项功能
4.类的初始化的内存解析
4.1 内存划分的结构:
栈(stack):局部变量 、对象的引用名、数组的引用名
堆(heap):new 出来的“东西”(如:对象的实体,数组的实体),含成员变量
方法区:含字符串常量
静态域:声明为static的变量
4.2 理解的基础上,学会基本的创建的类的对象在内存中的运行。
* 方法的重载(overload)
* 要求:1.同一个类中 2.方法名必须相同 3.方法的参数列表不同(①参数的个数不同②参数类型不同)
* 补充:方法的重载与方法的返回值类型没有关系!
//如下的四个方法构成重载
//定义两个int型变量的和
public int getSum(int i,int j){
return i + j;
}
//定义三个int型变量的和
public int getSum(int i,int j,int k){
return i + j + k;
}
//定义两个double型数据的和
public double getSum(double d1,double d2){
return d1 + d2;
}
//定义三个double型数组的和
public void getSum(double d1,double d2,double d3){
System.out.println(d1 + d2 + d3);
}
//不能与如上的几个方法构成重载
// public int getSum1(int i,int j,int k){
// return i + j + k;
// }
// public void getSum(int i,int j,int k){
// System.out.println(i + j + k);
// }
//以下的两个方法构成重载。
public void method1(int i,String str){
}
public void method1(String str1,int j){
}
* 可变个数的形参的方法:
* 1.格式:对于方法的形参: 数据类型 ... 形参名
* 2.可变个数的形参的方法与同名的方法之间构成重载
* 3.可变个数的形参在调用时,个数从0开始,到无穷多个都可以。
* 4.使用可变多个形参的方法与方法的形参使用数组是一致的。
* 5.若方法中存在可变个数的形参,那么一定要声明在方法形参的最后。
* 6.在一个方法中,最多声明一个可变个数的形参。
//如下四个方法构成重载
//在类中一旦定义了重载的可变个数的形参的方法以后,如下的两个方法可以省略
// public void sayHello(){
// System.out.println("hello world!");
// }
// public void sayHello(String str1){
// System.out.println("hello " + str1);
// }
//可变个数的形参的方法
public void sayHello(String ... args){
for(int i = 0;i < args.length;i++){
System.out.println(args[i] + "$");
}
//System.out.println("=====");
}
public void sayHello(int i,String ... args){
//public void sayHello(String ... args,int i){
System.out.println(i);
for(int j = 0;j < args.length;j++){
System.out.println(args[j] + "$");
}
}
public void sayHello1(String[] args){
for(int i = 0;i < args.length;i++){
System.out.println(args[i]);
}
}
* 一、类的第三个成员:构造器(constructor 构造方法)
* constructor:建造者
* 构造器的作用:①创建对象 ②给创建的对象的属性赋值
*
* 1.设计类时,若不显式声明类的构造器的话,程序会默认提供一个空参的构造器.
* 2.一旦显式的定义类的构造器,那么默认的构造器就不再提供。
* 3.如何声明类的构造器。格式:权限修饰符 类名(形参){ }
* 4.类的多个构造器之间构成重载
package text; import java.util.Scanner; public class Circle { public static void main(String[] args) { Scanner sc=new Scanner(System.in); double g=sc.nextInt(); TestCircle tc=new TestCircle(); tc.setRadius(g); double m=tc.mianji(); System.out.println(m); } } class TestCircle{ private double radius; public double getRadius(){ return radius; } public void setRadius(double r){ this.radius=r; } public double mianji(){ return 3.14*radius*radius; } }
* 二、类对象的属性赋值的先后顺序:①属性的默认初始化 ②属性的显式初始化③通过构造器给属性初始化
* ④通过"对象.方法"的方式给属性赋值
public class lianxixixi{ String pinpai; String jixing; double price; double yh;//油耗 double lc;//里程 double yxrj;//油箱容积 double syyl;//剩余油量 public lianxixixi(String pinpai,String jixing,double price,double yh,double yxrj,double syyl){ this.pinpai=pinpai; this.jixing=jixing; this.price=price; this.yh=yh; this.yxrj=yxrj; this.syyl=syyl; } public void show(){ System.out.println("品牌"+pinpai); System.out.println("车型"+jixing); System.out.println("价格"+price); System.out.println("油耗"+yh); System.out.println("里程"+lc); System.out.println("油箱容积"+yxrj); System.out.println("剩余油量"+syyl); } public void run(double lc){ syyl=syyl-(lc/100)*yh; if(syyl<10){ System.out.println("再开,一会就得车开你了!"); }else{ System.out.println(syyl);} } } public class lianxixi2 { public static void main(String[] args) { lianxixixi li=new lianxixixi("比亚迪","F0",45000.0,7.0,60.0,59.0); li.show(); li.run(1000); } }
1.static:静态的,可以用来修饰属性、方法、*代码块(或初始化块)、*内部类
2.
static修饰属性(类变量):
* 1.由类创建的所有的对象,都共用这一个属性
* 2.当其中一个对象对此属性进行修改,会导致其他对象对此属性的一个调用。vs 实例变量(非static修饰的属性,各个对象各自拥有一套副本)
* 3.类变量随着类的加载而加载的,而且独一份
* 4.静态的变量可以直接通过“类.类变量”的形式来调用
* 5.类变量的加载是要早于对象。所以当有对象以后,可以“对象.类变量”使用。但是"类.实例变量"是不行的。
* 6.类变量存在于静态域中。
*
* static修饰方法(类方法):
* 1.随着类的加载而加载,在内存中也是独一份
* 2.可以直接通过“类.类方法”的方式调用
* 3.内部可以调用静态的属性或静态的方法,而不能调用非静态的属性或方法。反之,非静态的方法是可以调用静态的属性或静态的方法
* >静态的方法内是不可以有this或super关键字的!
* 注:静态的结构(static的属性、方法、代码块、内部类)的生命周期要早于非静态的结构,同时被回收也要晚于非静态的结构
Eclipse中编辑好了一个类,点击运行时出现如图所示的现象,现在编辑好的这个类并无错误,点击Proceed可正常运行。
按照字面意思就是,在这个“工程”中存在错误,打开工程列表----找到前边有红色叉叉的某个类,将错误去掉。
这个弹窗也就不会在出现了。
成员变量 局部变量 static