面向对象(上) 面向对象(中) 面向对象(下)
1.Java类及类的成员(属性、方法、构造器;代码块、内部类) 2.面向对象的三大特征(封装、继承、多态) 3.其它关键字
二者都是一种思想,面向对象是相对于面向过程而言的。面向过程,强调的 是功能行为,以函数为最小单位,考虑怎么做。面向对象,将功能封装进对 象,强调具备了功能的对象,以类/对象为最小单位,考虑谁来做。
面向对象更加强调运用人类在日常的思维逻辑中采用的思想方法与原则,如 抽象、分类、继承、聚合、多态等。
面向过程:Procedure Oriented Programming 面向对象:Object Oriented Programming
Field = 属性 = 成员变量,Method = (成员)方法 = 函数
步骤:
定义类(考虑修饰符、类名)编写类的属性(考虑修饰符、属性类型、属性名、初始化值)编写类的方法(考虑修饰符、返回值类型、方法名、形参等)说明: 如果创建了一个类的多个对象,对于类中定义的属性,每个对象都拥有各自的一套副本,且互不干扰。(即指向不同的内存空间)
public class Zoo { public static void main(String args[]) { Animal xb = new Animal(); Animal xh = new Animal(); xb.legs = 4; xh.legs = 0; System.out.println(xb.legs); // 4 System.out.println(xh.legs); // 0 xb.legs = 2; System.out.println(xb.legs); // 2 System.out.println(xh.legs); // 0 } }举例
public class Person{ private int age; //声明private变量 age public String name = "Lila"; //声明public变量 name }当一个对象被创建时,会对其中各种类型的成员变量自动进行初始化赋值。除了 基本数据类型之外的变量类型都是引用类型,如上面的Person及前面讲过的数组。
成员变量类型初始值byte0short0int0long0Lfloat0.0Fdouble0.0char0 或写为: ’\u0000’ (表现为空)booleanfalse引用类型null举例:
public class Person{ private int age; public int getAge() { //声明方法getAge() return age; } public void setAge(int i) { //声明方法setAge age = i; //将参数i的值赋给类的成员变量age } }其中:
修饰符:public,缺省,private, protected等返回值类型: 没有返回值:void。有返回值,声明出返回值的类型。与方法体中“return 返回值”搭配使用 方法名:属于标识符,命名时遵循标识符命名规则和规范,“见名知意”形参列表:可以包含零个,一个或多个参数。多个参数时,中间用“,”隔开返回值:方法在执行完毕后返还给调用它的程序的数据。注 意:
方法被调用一次,就会执行一次没有具体返回值的情况,返回值类型用关键字void表示,那么方法体中可以不必使用return语句。如果使用,仅用来结束方法。定义方法时,方法的结果应该返回给调用者,交由调用者处理。方法中只能调用方法或属性,不可以在方法内部定义方法。重载的概念: 在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数 类型不同即可。 重载的特点: 与返回值类型无关,只看参数列表,且参数列表必须不同。(参数个数或参数类 型)。调用时,根据方法参数列表的不同来区别。 重载示例: //返回两个整数的和 int add(int x,int y){return x+y;} //返回三个整数的和 int add(int x,int y,int z){return x+y+z;} //返回两个小数的和 double add(double x,double y){return x+y;}
public class PrintStream { public static void print(int i) {……} public static void print(float f) {……} public static void print(String s) {……} public static void main(String[] args) { print(3); print(1.2f); print("hello!"); } } 使用重载方法,可以为编程带来方便。例如,System.out.println()方法就是典型的重载方法,其内部的声明形式如下: public void println(byte x) public void println(short x) public void println(int x) public void println(long x) public void println(float x) public void println(double x) public void println(char x) public void println(double x) public void println()JavaSE 5.0 中提供了Varargs(variable number of arguments)机制,允许直接定 义能和多个实参相匹配的形参。从而,可以用一种更简单的方式,来传递个数可 变的实参。
//JDK 5.0以前:采用数组形参来定义方法,传入多个同一类型变量 public static void test(int a ,String[] books); //JDK5.0:采用可变个数形参来定义方法,传入多个同一类型变量 public static void test(int a ,String…books);
说明:
声明格式:方法名(参数的类型名 …参数名)可变参数:方法参数部分指定类型的参数个数是可变多个:0个,1个或多个可变个数形参的方法与同名的方法之间,彼此构成重载可变参数方法的使用与方法参数部分使用数组是一致的方法的参数部分有可变形参,需要放在形参声明的最后在一个方法的形参位置,最多只能声明一个可变个数形参例:
public static void main(String[] args){ KeBian to = new KeBian(); //下面两次调用将执行第二个test方法 to.test1(); to.test1("aa" , "bb"); to.test1("aa" ); //下面将执行第一个test方法 to.test(new String[]{"aa"}); } public void test(String[] msg){ System.out.println("含字符串数组参数的test方法"); } public void test1(String book){ System.out.println("****与可变形参方法构成重载的test1方法****"); } public void test1(String ...books){ System.out.println("****形参长度可变的test1方法****"); } 控制台输出结果 ****形参长度可变的test1方法**** ****形参长度可变的test1方法**** ****与可变形参方法构成重载的test1方法**** 含字符串数组参数的test方法方法,必须由其所在类或对象调用才有意义。若方法含有参数:
形参:方法声明时的参数实参:方法调用时实际传给形参的参数值Java的实参值如何传入方法呢?
Java里方法的参数传递方式只有一种:值传递。 即将实际参数值的副本 (复制品)传入方法内,而参数本身不受影响。
形参是基本数据类型:将实参基本数据类型变量的“数据值”传递给形参形参是引用数据类型:将实参引用数据类型变量的“地址值”传递给形参我们程序设计追求“高内聚,低耦合”。
高内聚 :类的内部数据操作细节自己完成,不允许外部干涉;低耦合 :仅对外暴露少量的方法用于使用。隐藏对象内部的复杂性,只对外公开简单的接口。便于外界调用,从而提 高系统的可扩展性、可维护性。通俗的说,把该隐藏的隐藏起来,该暴露 的暴露出来。这就是封装性的设计思想。
Java中通过将数据声明为私有的(private),再提供公共的(public) 方法:getXxx()和setXxx()实现对该属性的操作,以实现下述目的:
隐藏一个类中不需要对外提供的实现细节;使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑, 限制对属性的不合理操作;便于修改,增强代码的可维护性; class Animal { private int legs;// 将属性legs定义为private,只能被Animal类内部访问 public void setLegs(int i) { // 在这里定义方法 eat() 和 move() if (i != 0 && i != 2 && i != 4) { System.out.println("Wrong number of legs!"); return; } legs = i; } public int getLegs() { return legs; } } public class Zoo { public static void main(String args[]) { Animal xb = new Animal(); xb.setLegs(4); // xb.setLegs(-1000); // xb.legs = -1000; // 非法 System.out.println(xb.getLegs()); } }Java权限修饰符public、protected、(缺省)、private置于类的成员定义前, 用来限定对象对该类成员的访问权限。
修饰符类内部同一个包不同包的子类同一个工程privateYes(缺省)YesYesprotectedYesYesYespublicYesYesYesYes对于class的权限修饰只可以用public和default(缺省)。
public类可以在任意地方被访问。default类只可以被同一个包内部的类访问。如:Order o = new Order(); Person p = new Person(“Peter”,15);
如同我们规定每个“人”一出生就必须先洗澡,我们就可以在“人”的 构造器中加入完成“洗澡”的程序代码,于是每个“人”一出生就会自 动完成“洗澡”,程序就不必再在每个人刚出生时一个一个地告诉他们 要“洗澡”了。
语法格式: 修饰符 类名 (参数列表) { 初始化语句; }
举 例: 创建Animal类的实例:Animal a = new Animal(); 调用构造器,将legs初始化为4。
截止到目前,我们讲到了很多位置都可以对类的属性赋值。现总结这几个位 置,并指明赋值的先后顺序。
赋值的位置及先后顺序: 默认初始化显式初始化构造器中初始化通过“对象.属性“或“对象.方法”的方式赋值JavaBean示例
public class JavaBean { private String name; // 属性一般定义为private private int age; public JavaBean() { } public int getAge() { return age; } public void setAge(int a) { age = a; } public String getName() { return name; } public void setName(String n) { name = n; } }使用this,调用属性、方法
class Person { // 定义Person类 private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public void getInfo() { System.out.println("姓名:" + name); this.speak(); } public void speak(){ System.out.println("年龄:"+ this.age); } } class Person { // 定义Person类 String name; Person(String name) { this.name = name; } public void getInfo() { System.out.println("Person类 --> " + this.name); } public boolean compare(Person p) { return this.name == p.name; } } public class PersonTest { public static void main(String args[]) { Person per1 = new Person("张三"); Person per2 = new Person("李四"); per1.getInfo(); // 当前调用getInfo()方法的对象是per1 per2.getInfo(); // 当前调用getInfo()方法的对象是per2 boolean b = per1.compare(per2); } }使用this调用本类的构造器
class Person { // 定义Person类 private String name; private int age; public Person() { // 无参构造器 System.out.println("新对象实例化"); } public Person(String name) { this(); // 调用本类中的无参构造器 this.name = name; } public Person(String name, int age) { this(name); // 调用有一个参数的构造器 this.age = age; } public String getInfo() { return "姓名:" + name + ",年龄:" + age; } }注意:
可以在类的构造器中使用"this(形参列表)"的方式,调用本类中重载的其 他的构造器!明确:构造器中不能通过"this(形参列表)"的方式调用自身构造器如果一个类中声明了n个构造器,则最多有 n - 1个构造器中使用了 “this(形参列表)”"this(形参列表)"必须声明在类的构造器的首行!在类的一个构造器中,最多只能声明一个"this(形参列表)"学自尚硅谷2019,感谢尚硅谷和宋红康老师! 视频地址:bilibili在线观看 Java零基础教程-java入门必备