1.面向对象 要想了解面向对象,就要先了解面向过程,面向过程的代表语言是C语言,面向过程就是你想要完成一个需求,必须把完成这个需求的每一步走好,就比如你想去河对面,你就要先造船或者造桥,这就是面向过程,而面向对象时,就比如你想要过河,已经存在桥或者河了,你只需要把他们找出来供你驱使就行了,这就是面向对象. 举例,以学生为对象,学生的属性(成员变量)有:姓名,年龄,性别,学号; 行为有(成员方法):学Java,睡觉,吃饭 //定义一个学生类 class Student{ //成员变量 String name ; String gender; int age ; String id;
//成员方法 //玩游戏 public void playGame(){ System.out.println("学习无聊了,玩绝地求生游戏"); } public void sleep(){ System.out.println("学习累了,需要睡觉..."); } public void eat(){ System.out.println("学习饿了,需要吃饭..."); }} class StudentDemo{ public static void main(String[] args){ //创建学生类具体的对象 //类名 对象名 = new 类名() ; Student s = new Student(); //对象名.成员变量; //null----null-----0-----null System.out.println(s.name+"----"+s.gender+"-----"+s.age+"-----"+s.id) ;//为了方便,使用输出语句输出成员变量 //应该给当前对象s的成员赋值 s.name = “张无忌” ; s.gender = “男” ; s.age = 39 ; s.id = “9527” ; //张无忌----男-----39-----9527 System.out.println(s.name+"----"+s.gender+"-----"+s.age+"-----"+s.id) ;
}} 其中:Student s = new Student() 完成了以下几件事情: 1)将Student.class 字节码文件加载进内存 ; 2)Student s---------->进栈内存开辟空间 ; 3)new Student(); ------>在堆内存中申请空间; 4)执行Student()无参构造方法,进行系统默认初始化 5)执行显示初始化通过s.name,s.genfer …给成员变量赋值 ; 6)初始化完毕,在堆内存中产生一个空间地址值 7)将当前堆内存中,空间地址值赋值给栈内存中的变量s 2.成员变量和局部变量的区别 1)在类中的位置不同 成员变量 :类中方法外 局部变量 :方法内或者方法声明上 2)在内存中的位置不同 成员变量 :堆内存 局部变量 :栈内存 3)生命周期不同 成员变量 :随着对象的存在而存在,随着对象的消失而消失 局部变量 :随着方法的调用而存在,随着方法的调用完毕而消失 4)初始化值不同 成员变量 :有默认的初始化值 局部变量 :没有默认的初始化值,必须先定义,赋值,才能使用。
3.匿名对象匿名对象:就是没有名字的对象。 是对象的一种简化表示形式 3.1匿名对象的两种使用情况 1)对象调用方法仅仅一次的时候 2)作为实际参数传递
4封装概述 是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。 好处: 隐藏实现细节,提供公共的访问方式 提高了代码的复用性 提高安全性。 封装原则: 将不需要对外提供的内容都隐藏起来。 把属性隐藏,提供公共方法对其访问。 通过学生案例,给年龄赋值为负数引出数据问题。通过private解决这个问题。最后 这就是封装。
class Student { public void show() { System.out.println(“show”); } } class StudentDemo { //如果参数是一个类名,那么实际需要的是一个具体的对象 public void method(Student s) { s.show(); } } class StudentTest { public static void main(String[] args) { StudentDemo sd = new StudentDemo(); Student s = new Student(); sd.method(s); //多个匿名对象的写法 new StudentDemo.method(new Student()); } } 1:new Student().show(); 2:new StudentTest().method(new StudentDemo()); private关键字 private关键字: 是一个权限修饰符。 可以修饰成员(成员变量和成员方法) 被private修饰的成员只在本类中才能访问。 private最常见的应用: 把成员变量用private修饰 提供对应的getXxx()/setXxx()方法
//一个标准类的写法 class Student2{ //成员变量 //姓名 private String name ; //性别 private String gender ; //年龄 private int age ; //学号 private String id;
//提供对外的公共访问方法:seXXX()/getXXX() //给name设置 public void setName(String n) { //n 局部变量 name = n ; } //获取年龄的值 public String getName(){ return name ; } //性别的设置和获取 public void setGender(String g){ gender = g ; } public String getGender(){ return gender ; } //年龄 public void setAge(int a){ age = a ; } public int getAge(){ return age ; } //id学号 public void setId(String i){ id = i ; } public String getId(){ return id ; } //定义成员方法:显示成员变量 public void show(){ System.out.println("姓名是:"+name+",她的年龄是:"+age+",性别是: "+gender+",她的学号是:"+id) ; }} //测试类 class StudentTest{ public static void main(String[] args){
//需求: 给学生事物的具体对象的成员变量进行赋值 //创建学生对象 Student2 s = new Student2() ; //私有的成员不能访问 //s.name = "张无忌" ; //s.age = 38 ; //给name赋值 s.setName("张无忌") ; s.setGender("男") ; s.setAge(38) ; s.setId("9527") ; //姓名是:张无忌,她的年龄是:38,性别是: 男,她的学号是:9527 s.show() ; System.out.println("--------------------------"); System.out.println(s.getName()+"----"+s.getGender()+"----"+s.getAge()+"-----"+s.getId()); }} this:代表所在类的对象引用 记住: 方法被哪个对象调用,this就代表那个对象 什么时候使用this呢? 局部变量隐藏成员变量,即,局部变量和成员变量同名时,如下: class Student{ //private修饰 private String name ; //此处系统给定的默认值 private int age ;
//提供对外公共访问方法setXXX()/getXXX() //public void setName(String n){ //public void setName(String name){ //当局部变量名称和成员变量名称一致的情况,采用就近原则! // name = name ; //} //使用this改进 public void setName(String name){ this.name = name ; } public String getName(){ return name ; } //public void setAge(int a){ //public void setAge(int age){ // age = age ; //} public void setAge(int age){ this.age = age ; } public int getAge(){ return age ; } //学生学习... public void study(){ System.out.println("Good Good Study,Day Day Up..."); } //将成员变量输出 public void show(){ System.out.println(this.name+"----"+this.age) ; //隐藏this }}
//测试类 class StudentTest{
public static void main(String[] args){ //创建学生类对象 Student s = new Student() ; //s.name = "张无忌" ; s.setName("张无忌") ; s.setAge(30); //输出 //null---0 System.out.println(s.getName()+"---"+s.getAge()) ; s.show() ; }}
4构造方法 4.1构造方法作用:给对象的数据进行初始化 4.1构造方法格式 1)方法名与类名相同 2)没有返回值类型,连void都没有 3)没有具体的返回值 4)构造方法注意事项 如果你不提供构造方法,系统会给出默认构造方法 如果你提供了构造方法,系统将不再提供 构造方法也是可以重载的 4.3:虽然构造方法没有返回值,但是也可以写一个return,在最后写return;这种做法在任何void类 型的方法最后都是没有问题的。 4.4:举例,构造方法的作用给成员变量赋值 类的成员方法 4.4方法具体划分: 根据返回值 有明确返回值方法 返回void类型的方法 根据形式参数 无参方法 带参方法 class Student{ //成员变量 private String name ; private int age ;
//构造方法 //无参构造 public Student(){} //有参构造 public Student(String name,int age){ this.name = name ; this.age = age ; } //成员方法: public void setName(String name){ this.name = name ; } public String getName(){ return name ; } public void setAge(int age){ this.age = age ; } public int getAge(){ return age ; } //学习 public void study(){ System.out.println("学习Java...") ; }}
//测试类 class StudentTest{ public static void main(String[] args){
//方式1:无参构造方法+setXXX() Student s = new Student() ; s.setName("张无忌") ; s.setAge(27) ; s.study(); System.out.println(s.getName() +"---"+s.getAge()) ; System.out.println("---------------------"); //方式2:通过有参构造进行赋值 Student s2 = new Student("扬过",29) ; System.out.println(s2.getName() +"---"+s2.getAge()) ; s2.study(); }} 5,static关键字:前面创建的对象方法中都没有加static,是因为 5.1static的特点: 1)随着类的加载而加载 想一想:main() ---->public static void main(String[] args){} 2)static修饰的变量/方法,优先与对象存在! 回想:对比Student s = new Student(); 完成了哪些事情
3)被static修饰的具有共享,共用(多个对象共同访问同一个static修饰的成员变量) 什么时候去使用static关键字... 举例:类似的这些,都是用static修饰 班级编号(共享) 饮水机 (共享) 水杯(不能被共享的) 4)被static修饰的变量或者成员方法,可以直接被类名调用 5.2 static关键字的注意事项: 1)在静态的方法中是没有this关键字的! 静态优先于对象存在 2)一句话: 静态只能访问静态的变量/方法 非静态的成员方法: 可以访问非静态成员变量,静态的成员变量 可以访问静态的成员方法,非静态的成员方法 5.3 静态的成员方法: 只能访问静态成员变量,只能访问静态成员方法 class Demo2{ public int num = 10 ; public static int num2 = 20 ; //和类有关系 public void method(){ System.out.println(num) ;//10 this.num System.out.println(num2) ;//20 } public static void function(){ //System.out.println(this.num) ; //静态方法中不能存在this //System.out.println(num) ;//无法从静态上下文中引用非静态 变量 num System.out.println(num2); } //非静态的成员方法 public void function2(){ function() ; method() ; } public static void show(){ //method() ; function(); }}
class StaticDemo2{ public static void main(String[] args){ Demo2 d = new Demo2() ; d.method() ;
d.function() ; System.out.println("----------"); d.function2() ; System.out.println("----------"); d.show() ; System.out.println("----------"); int result = sum(100,50) ; System.out.println(result) ; } //求两个数据之和 public static int sum(int a,int b){ return a+b ; }} 例子中num2就是static修饰的静态变量,它可以同时应用在d.function() ;d.function2() ;d.show() ;中. 6.main方法中各个成员的解释如下: main方法的解释:
public static void main(String[] args): jvm识别的程序的入口 public :权限修饰符,公共的,公开的,保证访问权限足够大 static:静态修饰,和类有关系,优先对象存在 void:由jvm调用,没有具体的返回值类型 ,使用void代替 main:方法名, 编程语言,大部分都是有一个程序的入口,Java叫main(主方法) String[] args: 接收字符串数组,参数名args,