Java面向对象学习day06

莫忘少年凌云志,曾许天下第一流!

面向对象学习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("人可以学习");
     }
 ​
 }

思:

今天的学习中规中矩,不算特别努力也不太懈怠。前两天倒是懈怠了,一天因为学校课程,一天因为想汉诺塔花了太多时间,都没看多少视频。希望接下来几天好好加油吧。

“愿中国青年都摆脱冷气,只是向上走,不必听自暴自弃者流的话。能做事的做事,能发声的发声。 有一分热,发一分光,就令萤火一般,也可以在黑暗里发一点光,不必等候炬火。此后如竟没有炬火:我便是唯一的光。”昨天偶然间看到鲁迅的这段话。记得很久以前,初见这段话时,就为之惊艳。惊艳于其字里行间的力量。甚至想去揣测,鲁迅先生写下这段话时是怀着怎样的心情。是绝望中的一声哀嚎?还是满心欢喜,对中国青年满怀期待?

今天跑完步之后,在操场旁休息。看着跑道上一个个气喘吁吁的身影。脑中突然冒出那一段话,“张华考上了北京大学;李萍进了中等技术学校;我在百货公司当售货员:我们都有光明的前途。”看着一个个努力奔跑着的人,心中也是百感交集。是呀,每个人都有着不同的人生。而每个人的人生无好坏之分,心安,即可。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值