Java面向对象总结

最近学习了Java面向对象,现做一个简单汇总:


什么是对象--万物皆对象,但该对象因关注而存在


对象的组成:属性(描述该对象的名称)+行为(描述该对象的动词)

对象这么多?如何记忆?--进行归类,引出了一个“类”的概念


什么是类?--对一类具有相同行为或属性的东西的统称


对象和类的关系-- 对象是该类的具体实现(具体实例)
                      -- 类是很多对象的统称,不实际存在
                      -- 类是对象的模板,对象是类的实例

在Java中如何创建一个类--如果该类具有某些属性和行为,那只要某个对象属于该类,都应该具有这些属性和行为

有了类,接下来创建对象--new 构造器 例如:new Man();

在Java创建对象时常将创建的对象存储在变量中使用  例如:Man man = new Man();

在引用数据类型中,将变量称为引用   例如:Man man = new Man();  man就是引用  new Man()才是对象

上述例中仅仅是将new Man()对象的地址赋值给了man引用

创建对象的方式:
      1.new 构造器
      2.反序列化
      3.反射
      4.克隆

当方法中有同名的局部变量时,使用全局变量(成员变量)需要用this.成员变量来区分

this的作用:  1.指代当前对象   this.来调用本类中的属性和行为
                      2.可以指代当前类中的某个构造器   this(参数列表);

引用数据类型可以作为属性存在,也可以是参数,但注意不要出现空指针异常

什么是包?在Java中是一个名称,文件夹。包给于类:1.对类进行划分   2.给类命名空间

如果一个类在一个包中,代码上方会有使用:package关键字标注的路径(包路径)


全限定名:包名+类名
全限定名可以直接准确的找到某个类
如果不想一直使用全限定名,可以考虑使用import关键字导入其它包里的类

方法调用栈--当调用方法时,内存栈中的显示情况;作用--描述栈中内存的变化过程

方法调用栈中的内容--当调用某个方法时,其会出现在方法调用栈的最上方,即正在执行,执行完成后会将程序的控制权返回给调用者,并弹出已调用的方法。第一个执行的方法是:main方法(程序的入口)

递归--方法本身调用自己,直到某一个条件结束
在递归中,简单的递归和循环相似,只是递归需要数学运算
如果递归没有给出结束条件,则会发现 java.lang.StackOverflowError栈溢出错误
除了递归以外,在Java编程中出现方法调用的问题,也可能出现java.lang.StackOverflowError
所以方法调用时不要做以下操作,让A调用B,再让B调用C,再让C调用A


继承--类的扩展。扩展得到的称为子类/派生类,扩展的原型称为父类/基类/超类


在Java中常用is a来评判是否属于继承
在代码中体现:
使用extends关键字    public class 子类 extends 父类{}
并且在Java中只有单继承,也就是说extends在一个类里只有一个父类


在创建子类对象时,发现子类中具有父类的所有属性和行为
在内存中,先是根据父类的内容进行加载,然后加载子类附加项,
从而生成一个完成的子类对象
如果想修改父类的行为,则需要重写


重写--在子类继承父类时覆盖父类原有的行为


重写的要求:方法名,参数列表、返回类型都与父类相同

在子类中,如果有和父类同名的属性和行为,可以使用super来调用父类的属性和行为,而使用this调用本类的属性和行为


我们将父类的行为进行了重写,调用时只看得见重写后的内容,被重写内容需用super来调用--即父类的内容使用super调用


super的第二种用法:super()指代父类的构造器


在子类构造器中,第一行会默认调用父类的无参构造--super();


如果父类中书写了带参构造器,就不会生成无参;子类在书写时,会默认生成一个无参构造


但由于子类的无参会默认调用父类的无参,所以此时会报错,2种修改方法,如下:
1.在父类中加入无参构造器  2.在子类的构造器中第一行书写指定的父类构造器


静态初始化块--一个会和类同时加载的代码区


static{语句}  属于类,和类加载时一起加载


静态初始化块可以有多个,并且是一个一个,按顺序加载。


作用--加载需要优先读取的、使用的数据


静态初始化快可以操作静态内容


一个程序中由于类只会加载一次,所以静态初始化块也只会加载一次


非静态初始化块--一个和对象创建时加载的代码区

       {语句}  属于对象,和对象创建时一起加载



非静态初始化块可以有多个,并且是一个一个,按顺序加载。


作用--有类似于构造器的作用,可以对属性赋值
        非静态初始化快可以操作--非静态内容和静态内容


只要创建一个对象,就会加载一次


构造器的执行时机在非静态之后
如果在创建子类对象时加载顺序是:1.加载时父类静态  2.子类静态
           3.加载父类非静态  4.按照流程调用父类构造器
           5.加载子类非静态  6.按照流程调用子类构造器


一个类文件中写多个类


第一种方式:每个类与每个类之间没有包含关系
但是其它的类访问修饰符只能是默认的--只能有一个类被public修饰
原因:类文件的名字和public修饰符的类名一致
一个类文件中可以有多个类,但是只会有一个类文件
但会编译为多个.class文件


第二种方式:一个类中包含另一个类
     例如类Learn1包含了一个类Learn2,Learn2被称为内部类,而对于Learn2来说Learn1被称为外部类
内部类也可以继承其它类,外部类也可以,进而达到一种多继承的效果


静态内部类
public class Learn1 {
        int a = 10;
      public static class Learn2{
             int a = 5;
           public void use() {
                  int a = 1;
                System.out.println(a);
                System.out.println(this.a);
                  //下面不能使用Learn1.this.a
                 //原因:静态内部类加载时机先于外部类的实例成员
                //要想强制调用,则需要创建外部类的对象
                 System.out.println(new Learn1().a);
                          }
                }
}


局部内部类
作用域仅仅在方法中
public class Learn1 {
              public void use() {
                 class Learn2 extends Learn{
                      public void test() {
                           System.out.println("局部内部类");
                        }
                }
                     Learn2 l = new Learn2();
                            l.test();
                }
}


匿名内部类
public class Learn7 {
                    public void test() {
                           System.out.println("内部类测试");
                 }
}

public class Learn7Test {
                public static void main(String[] args) {
                     Learn7 l = new Learn7() {
                     @Override
                      public void test() {
                     System.out.println("匿名内部类");
                   }
              };
                    l.test();
                 Learn7 l1 = new Learn7();
                      l1.test();
       }
}      

                    输出结果为:测试一下
                                            内部类测试


多态:相同行为,不同实现


多态分为:静态多态和动态多态


静态多态:在程序运行之前就已经知道结果的多态--突出表现为:重载


动态多态:在程序运行之前无法预知结果的多态

 

动态多态的相关技术:1.向上转型  2.instanceof   3.动态绑定机制

 

向上转型:类似于自转    子类对象传入父类引用中

例:  人类 = new 男人类();


向下转型:类似于强转   父类对象传入子类引用中

例:  男人类 =(男人类) new 人类();


如果没有判断类型,容易出现

java.lang.ClassCastException;--类型转换异常


在做引用数据类型的强转时,需要先判断

引用数据类型的判断可以使用instanceof关键字来判断



动态绑定机制

当使用向上转型时,并且子类重写了父类的方法,则

使用父类引用调用该方法时,会自行去执行子类重写的方法


 

抽象--在类的定义时的class前面加上一个abstract关键字

 

抽象类不创建对象,或者说抽象类不能使用new等措施创建对象

 

抽象的事物没有被描述清楚,所以不能有具体的实例

 

抽象的可以是类,也可以是方法

 

abstract修饰符的类--抽象类


abstract修饰符的方法--抽象方法


 

如果继承后的类没有描述清楚父类的内容,即:没有重写抽象内容--其类也应该变成抽象类


抽象类中不一定有抽象方法


但是有抽象方法的类,一定是抽象类


接口是一种数据类型


接口是比抽象类更为抽象的一种表现形式--不是类


接口创建,只需要将class替换为interface

 

接口中的方法都是抽象的


接口中的方法可以不用abstract关键字修饰,但是默认为它修饰,写不写都是抽象方法

 

抽象类可以让别的类继承,接口则是需要其它类来实现它


接口实现--和继承类似,在类名后书写 implements


例:Learn1 implements Learn1Inter  


在实现一个接口时,有两种选择:1.不去实现方法,将该类声明为抽象类


      2.重写所有的方法

 

 

 

类可以多实现接口,并且还可以继承时同时多实现

例: Woman extends Human implements GuangJieInter,PlayGameInter

 

一个接口中可以有多个抽象方法,一旦有一个实现类来实现接口,则需要都实现


如果有一个抽象方法没有实现,则需要将该类定义为抽象类

 

接口可以继承接口,并且可以多继承

 

 



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值