莫忘少年凌云志,曾许天下第一流!
面向对象学习day06
一、复习
1、什么是方法的重载
-
“两同一不同”:同一个类、相同方法名;参数列表不同。
-
如何调用确定的方法:方法名-->参数列表
2、参数传递机制的具体体现
-
基本数据类型:数据值
-
引用数据类型:地址值(含变量的数据类型)
【Person p1 = new Person(); eat(); age
User u1 = p1; //编译错误 (逆向思维、反证法)】
注: 证明一件事是正确的,可能需要证明十种情况都是对的;
而证明一件事是错的,只需要证明一种情况是错的即可。
故设计系统的人比攻破系统的人更强,因需考虑的情况更多、更全。
3、内存解析
内存结构:
-
栈:局部变量
-
堆:new出来的结构:对象(非static成员变量)、数组
注:在调用函数时,局部变量会在栈中生成新变量
4、匿名对象
匿名对象:我们创建的对象,没显式的赋给一个变量名。
-
特点:匿名对象只能调用一次
-
举例:
PhoneMall mall = new PhoneMall(); mall.show(new Phone()); //^_^ class PhoneMall{ public void show(Phone phone){ phone.sendEmail(); phone.playGame(); } }
5、可变形参
举例:
test.show("hello","world"); public void show(String ... strs){ System.out.println("show(String...strs"); for(int i = 0;i< strs.length;i++){ System.out.println(strs[i]); } }
注:调用的话,类似数组,使用strs[i]
6、字符串值传递的问题
代码:
package Object.day06; public class ValueTransferTest { public static void main(String[] args) { String s1 = "hello"; ValueTransferTest test = new ValueTransferTest(); test.change(s1); System.out.println(s1); } public void change(String s){ s = "hi"; } }
结果:
内存分配:
分析:
首先String为引用类型,按理说为地址传递,最后输出的结果应为调用方法后所改变的值“hi”。
但是String具有不可变性,方法体中给局部变量S赋的值“hi”,原本在常量池中并未存在,故会开辟新的空间,用于存放“hi”,而其首地址也自然与“hello”不同。当将新的“hi”赋值给局部变量S时,S不再指向原先的“hello”的首地址,转而指向“hi”的首地址。待调用完方法,S1所指向的地址的字符串“hello”并未改变。故最后输出的结果为“hello”。
注:
-
引用数据类型:类、接口、数组。常见的有:String、StringBuffer、ArrayList、HashSet、HashMap等。
-
自己定义的class类都是引用类型
二、封装性
1、概述
-
封装性的设计思想:把该隐藏的隐藏起来,该暴露的暴露出来。
-
封装可提高系统的可扩展性、可维护性。
-
程序设计追求"高内聚,低耦合":
高内聚:类的内部数据操作细节自己完成,不允许外部干涉。
低耦合:仅对外暴露少量的方法用于使用。
2、封装性的引入
当我们创建一个类的对象以后,我们可以通过“对象.属性”的方式,对对象的属性进行赋值。这里,赋值操作要受到属性的数据类型和存储范围的制约。除此之外,没有其他制约条件。但是,在实际问题中,我们往往需要给属性添加限制条件。这个条件不能在属性声明时体现,我们只能通过方法进行限制条件的添加(比如setLegs)。同时,我们需要避免用户再使用“对象.属性”的方式对属性进行赋值。则需要将属性声明为私有的(private)--->此时,针对属性就体现了封装性。
3、封装性的体现
-
我们将类的属性(xxx)私有化(private),同时,提供公共的(public)方法来获取(getxxx)和设置(setxxx)此属性的值。
-
不对外暴露的私有方法
-
单例模式
4、权限修饰符
封装性的体现,需要权限修饰符的配合。
1、java规定的四种权限修饰符(递增):private、缺省、protected、public
2、四种权限可以用来修饰类及类的内部结构:属性、方法、构造器、内部类
-
修饰类:只能使用缺省、public
-
修饰类的内部结构:四种都可以哦
代码实例:
package Object.day06; public class AnimalTest { public static void main(String[] args) { Animal a = new Animal(); a.name = "杨"; // a.age = 1; // a.legs = 4; a.show(); // a.setLegs(6); a.setLegs(-6); a.show(); } } class Animal{ String name; private int age; private int legs; //对属性的设置 public void setLegs(int l){ if(l >= 0 && l %2 == 0){ legs = l; }else{ legs = 0; //也可抛出一个异常 } } //对属性的获取 public int getLegs(){ return legs; } public int getAge(){ return age; } public void setAge(int a){ age = a; } public void eat(){ System.out.println("动物进食"); } public void show(){ System.out.println("name = " + name + ",age = " + age + ",legs = " + legs); } }
5、权限修饰符plus
代码实例:
Order类:
package Object.day06; public class Order { private int orderPrivate; int orderDefault; public int orderPublic; private void methodPrivate(){ orderPrivate = 1; orderDefault = 2; orderPublic = 3; } void methodDefault(){ orderPrivate = 1; orderDefault = 2; orderPublic = 3; } public void methodPublic(){ orderPrivate = 1; orderDefault = 2; orderPublic = 3; } }
OrderTest类:
package Object.day06; public class OrderTest { public static void main(String[] args){ Order order = new Order(); order.orderDefault = 1; order.orderPublic = 2; //出了Order类之后,私有的结构就不可以调用了 // order.orderPrivate = 3; //'orderPrivate' has private access in 'Object.day06.Order' // order.orderPrivate1 = 3; //Cannot resolve symbol 'orderPrivate1' //两者报错的原因不同。前者为没有访问的权限,后者为未定义 order.methodDefault(); order.methodPublic(); // order.methodPrivate(); //'methodPrivate()' has private access in 'Object.day06.Order' } }
报错翻译:
-
Cannot resolve symbol 'orderPrivate1'
【无法解析符号'orderPrivate1'】
-
'orderPrivate' has private access in 'Object.day06.Order' 【'orderPrivate'在'Object.day06.Order'中具有私有访问权限 】
三、构造器(构造方法)
constructor
1、构造器的作用:
-
创建对象
-
创建对象时就初始化对象的属性
2、说明:
-
如果没有显示的定义类的构造器的话,则系统会默认提供一个空参的构造器。
-
定义构造器的格式: 权限修饰符 类名 (形参列表){ }
-
一个类中定义的多个构造器,彼此构成重载
-
一旦我们显示的定义了类的构造器之后,系统就不再提供默认的空参构造器了
3、实例
package Object.day06; public class PersonTest { public static void main(String[] args) { //创建类的对象:new + 构造器 Person p = new Person(); p.eat(); Person p1 = new Person("yangting"); System.out.println(p1.name); } } class Person{ //属性 String name; int age; //构造器 public Person(){ System.out.println("Person()....."); } public Person(String n){ name = n; } public Person(String n,int a){ name = n; age = a; } //方法 public void eat(){ System.out.println("人吃饭"); } public void study(){ System.out.println("人可以学习"); } }
思:
今天的学习中规中矩,不算特别努力也不太懈怠。前两天倒是懈怠了,一天因为学校课程,一天因为想汉诺塔花了太多时间,都没看多少视频。希望接下来几天好好加油吧。
“愿中国青年都摆脱冷气,只是向上走,不必听自暴自弃者流的话。能做事的做事,能发声的发声。 有一分热,发一分光,就令萤火一般,也可以在黑暗里发一点光,不必等候炬火。此后如竟没有炬火:我便是唯一的光。”昨天偶然间看到鲁迅的这段话。记得很久以前,初见这段话时,就为之惊艳。惊艳于其字里行间的力量。甚至想去揣测,鲁迅先生写下这段话时是怀着怎样的心情。是绝望中的一声哀嚎?还是满心欢喜,对中国青年满怀期待?
今天跑完步之后,在操场旁休息。看着跑道上一个个气喘吁吁的身影。脑中突然冒出那一段话,“张华考上了北京大学;李萍进了中等技术学校;我在百货公司当售货员:我们都有光明的前途。”看着一个个努力奔跑着的人,心中也是百感交集。是呀,每个人都有着不同的人生。而每个人的人生无好坏之分,心安,即可。