世界万物都是对象(object),在面向对象中一切都是对象。
对象:系统中用来描述客观事物的实体,构成系统的基本单位。对象封装了属性(特征)和方法(操作)。
属性——对象具有的各种特征。每个对象的每个属性都拥有特定值。
面向对象和面向过程的思想有着本质上的区别, 作为面向对象的思维来说,当你拿到一个问题时,你分析这个问题不再是第一步先做什么,第二步再做什么,这是面向过程的思维,你应该分析这个问题里面有哪些类和对象,这是第一点,然后再分析这些类和对象应该具有哪些属性和方法。这是第二点。最后分析类和类之间具体有什么关系,这是第三点。
面向对象有一个非常重要的设计思维:合适的方法应该出现在合适的类里面
面向对象的基本思想是,从现实世界中客观存在的事物出发来构造软件系统,并在系统的构造中尽可能运用人类的自然思维方式。
面向对象更加强调运用人类在日常生活的逻辑思维中经常采用的思想方法与原则,如抽象、分类,继承、聚合、多态等。
对象是用于计算机语言对问题域中事物的描述,对象通过“属性(attribute)”和“方法(method)”来分别对应事物所具有的静态属性和动态属性。
类是用于描述同一类的对象的一个抽象的概念,类中定义了这一类对象所具有的静态属性和动态属性。
类可以看成一类对象的模板,对象可以看成该类的一个具体实例。
1、将类的属性进行私有化处理,不允许外部程序直接访问。并对外提供统一的方法用于设置和读取私有属性。 2、实现访问控制:限制属性访问。但不是拒绝访问。 作用:只能通过规定的方法访问数据,方便在方法中加入控制语句,防止不合法数据赋值。
在一个类中,方法名相同,与返回值和访问修饰符无关的多个方法,构成方法重载。参数列表:参数的个数、数据类型、多个参数的前后顺序不同,都属于参数列表不同。方法重载的典型应用,构造函数重载。
1、子类继承父类:使用extends关键字。 2、子类中需要访问父类成员,使用super关键字。super.属性 访问父类属性super.方法() 访问父类方法 如果,子类中没有同名的属性和方法覆盖父类,则依然可以直接使用this.属性调用从父类中继承的非私有属性。 但是,如果子类中重写了与父类同名属性:this.属性访问的是本类;super.属性访问的是父类属性。 在子类构造函数中,直接使用super();表示调用父类构造。而且,super()函数必须在子类构造的第一行。 3、子类可以访问父类哪些属性和方法;private 本类 默认省略 本类 同包protected 本类 同包 非同包子类public 本类 同包 非同包子类 其他任何包都可用 4、在Java中,继承只能单继承,不能多继承; 但是,可以多层继承
1、在子类中,重写方法。要求:方法名相同、参数列表相同、返回值相同、访问控制符不能比父类更严格。
override和overload的区别:
位置 方法名 返回值 参数列表 访问控制符 override方法重写: 子类 相同 相同 相同 不能比父类更严格overload方法重载: 本类 相同 无关 不同 无关 * 注意:由于子类无法继承父类的私有属性,因此父类中的private方法无法被重写。
1、使用abstract关键字修饰的类,称为抽象类。(限制实例化 ,只能被继承) * 抽象类,不能被实例化。public abstract class Oop2CeShi 2、抽象方法:使用 abstract关键字修饰 而且没有方法体的方法,称为抽象方法。 * 父类 public abstract void play(); * 子类 public void play(){}; 3、子类继承抽象类,那么子类必须重写父类所有抽象方法。 除非子类也是抽象类。 4、抽象方法必须写在抽象类中。 抽象类中的方法,不一定时抽象方法。
1、同一种事物,由于条件的不同,显示出不同的结果,叫做多态。 2、程序中的多态:同一个引用类型,由于使用不同的对象实例,而执行不同的操作。
实现多态的条件 1、子类继承父类 2、子类重写父类方法 3、父类 引 指 向 子类对象。 //保证:同一个父类引用,由于使用不同的子类对象实例,而执行不同的操作。 * Text001 e1 = new Text001piano();
1、向上转型,子类转父类,自动转换特点:绝对安全(不会报错),子类独有的属性和方法将会丢失,只能调用父类中存在的属性和方法。如果,父类方法不是抽象方法,那调用时,执行的方法依然是子类的。典型应用:多态中,父类引用指向子类对象。2、向下转型,父类转子类,强制转换Text001 e1 = new Text001piano(); Text001piano p = (Text001piano) e1; 特点:不安全,可能造成classCaseException。可以使用instanceof提前判断。if(p instanceof Text001piano){ Text001piano p = (Text001piano) e1; }
1.内部类:声明在类内部的一个类.2.内部类的特点 * ①内部类可以使用public.省略.protected.private等各种访问修饰符修饰. * ②内部类编译以后,依然是独立的.class文件.文件名是"外部类名$内部类名.class"; * 因此,自定义类名时,一般不使用$. * ③内部类中可以访问外部类的属性和方法,如果没有重名,可以直接访问:如果与内部类已有属性名重名,可以使用"外部类名.this.属性名"访问. * System.out.println("外部类名.this.属性名");④ 外部类中,不能访问内部类的属性,public也不行 * 如果需要访问,可以先拿到内部类的对象,使用对象访问内部类属性(通过这种形式,包含类可以访问内部类的私有属性) * Test t=new Test(); * sysout (t.age);成员内部类1.成员内部类,怎么实例化外部类名.内部类名 变量名=外部类对象.new.内部类(); class Person{ class Text{ } }Person.Text t= new Person().new.Text(); 或者Person p=new Person(); Person.Text t=p.new.Text();2.在内部类中访问外部类属性或方法 外部类名.this.属性名3.成员内部类声明的注意事项 内部类不能与外部类重名成员内部类不能出现静态属性.静态方法.以及静态内部类.但是,静态常量例外. 静态内部类 1.定义:使用static修饰的内部类,称为静态内部类2.实例化:外部类名.内部类名 变量=new 外部类名.内部类名();
class Person{ Public string w="22"; Public static int ww=22; static class Text{ } }
Person.Text t= new Person.Text();//注意与成员内部实例化的区别3.静态内部类中不能访问外部类的非静态属性和方法. Person.ww;4.外部类不能访问静态内部类的非静态属性和方法.但是可以访问静态属性和方法.使用外部类名.属性名; 静态内部类和成员内部类的区别1.声明方式和实例化方式不同: 成员内部类实例化:Person.Text t= new Person().new.Text();静态内部类实例化:Person.Text t= new Person.Text(); 2.成员内部类不能出现静态属性.静态方法.以及静态内部类. 3.外部类和内部类的访问.... 局部内部类 1.定义在某个方法中的内部类2.局部内部类是对外部完全隐藏的,只能在其作用域范围内实例化.3.局部内部类,可以访问外部类的属性和方法:使用外部类.this.属性名;4.局部内部类,不能访问其所在方法中的变量,只能访问常量.5.注意:局部内部类不能使用访问修饰符修饰(不属于类的成员,只是一个局部变量)匿名内部类 new Text(){};含义:相当于一个匿名类,继承了Text类.使用匿名内部类,将直接返回返回当前子类的对象. Text t=new.Text(){};一个匿名内部类,继承Text类匿名内部类返回一个子类对象,并赋给父类引用因此,这一行代码相当于 匿名内部类通常用于直接实例化抽象类或接口 Text t=new.Text(){ 重写Text中的所有抽象方法 };
转载于:https://www.cnblogs.com/wyu1258/p/8747332.html