Java基本概念摘记

1.变量

成员变量没初始化是可以使用的,而非成员变量必须定义后才能使用。原始变量如int char short long byte初始化为0,float double初始化为0.0,boolean初始化为false,对象初始化为null

2. 构造函数

构造函数 是一种特殊的方法 主要用来在创建对象时初始化对象 即为对象成员变量赋初始值 。总与new运算符一起使用在创建对象的语句中 特别的一个类可以有多个构造函数 可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载
构造函数与其他方法的区别
1. 构造函数的命名必须和类名完全相同;而一般方法则不能和类名相同.
2. 构造函数的功能主要用于在类的对象创建时定义初始化的状态.它没有返回值,也不能用void来修饰.这就保证了它不仅什么也不用自动返回,而且根本不能有任何选择.而其他方法都有返回值.即使是void返回值,尽管方法体本身不会自动返回什么,但仍然可以让它返回一些东西,而这些东西可能是不安全的.
3. 构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用,一般方法在程序执行到它的时候被调用.
4. 当定义一个类定义的时候,通常情况下都会显示该类的构造函数,并在函数中指定初始化的工作也可省略,Java编译器会提供一个默认的构造函数.此默认构造函数是不带参数的.而一般方法不存在这一特点
补充:
构造函数的名字必须与类名相同,而且不可以有返回值,也不能有return 语句。
构造函数往往执行一些初始化的操作。

3. 访问属性
  1. 访问修饰符只能修饰成员变量与成员函数
  2. 访问修饰符只针对类而不是针对对象
  3. 如果Public修饰的是类,那说明可以拿这个类来定义对象(文件名要与这个类名相同)
  4. private修饰的量与函数的访问都是针对类而不是对象。比如,其他类中去调用对象.变量就会错,而调用类.变量就对了。
4. 类变量
  1. static修饰的变量就是类变量,类变量可以通过对象与类名访问赋值,即所有对象共有的,一个对象改变了值,其他对象在此访问时就是获得改变后的值。
  2. 类函数只能调用类函数或者类变量,不能调用非static的函数与变量。
  3. java中不鞥在类体中先声明在赋值
5.数组与容器

区别:容器可以随元素增加自动扩容,而且有对应的操作方法(注:添加或者删除数据,后面的数据会自动排列,而数组不可以)。数组没有这些功能
对象数组是指元素类型是对象(即需要new),普通数组就是我们常用的基本数据类型定义的数组,不需要创建对象。对象数组类型中元素对象没赋值的默认是null,且对象相当于C语言中的指针,存放对象内容的地址,不存放实体。本质其实就是基本数据类型与引用数据类型的区别。在这里
for-each 的用法在普通数组里只鞥访问,不能修改元素;而在其他数组可以进行数据的修改。
hashset也是一种容器,但是它包含的元素具有唯一性,不鞥重复。

注: 无论是容器、数组还是其他类型对象,在调用system.out.println()时,如果类中有public String tostring()语句,系统会自动调用。一个包裹类型(java为每一个基本类型变量提供了包裹类型)的变量可以接受一个Int类型的变量

6.子类与父类

对理解继承来说,最重要的事情是,知道哪些东西被继承了,或者说,子类从父类那里得到了什么。答案是:所有的东西,所有的父类的成员,包括变量和方法,都成为了子类的成员,除了构造方法。构造方法是父类所独有的,因为它们的名字就是类的名字,所以父类的构造方法在子类中不存在。除此之外,子类继承得到了父类所有的成员。
但是得到不等于可以随便使用。每个成员有不同的访问属性,子类继承得到了父类所有的成员,但是不同的访问属性使得子类在使用这些成员时有所不同:有些父类的成员直接成为子类的对外的界面,有些则被深深地隐藏起来,即使子类自己也不能直接访问。下表列出了不同访问属性的父类成员在子类中的访问属性:

父类成员访问属性对于父类中的含义对于子类中的含义
public对所有人开放对所有人开放
protected只有包内其它类、自己和子类可以访问只有包内其它类、自己和子类可以访问
缺省只有包内其它类可以访问如果子类与父类在同一个包内:只有包内其它类可以访问 否则:相当于private,不能访问
private只有自己可以访问不能访问

public的成员直接成为子类的public的成员,protected的成员也直接成为子类的protected的成员。Java的protected的意思是包内和子类可访问,所以它比缺省的访问属性要宽一些。而对于父类的缺省的未定义访问属性的成员来说,他们是在父类所在的包内可见,如果子类不属于父类的包,那么在子类里面,这些缺省属性的成员和private的成员是一样的:不可见。父类的private的成员在子类里仍然是存在的,只是子类中不能直接访问。我们不可以在子类中重新定义继承得到的成员的访问属性。如果我们试图重新定义一个在父类中已经存在的成员变量,那么我们是在定义一个与父类的成员变量完全无关的变量,在子类中我们可以访问这个定义在子类中的变量,在父类的方法中访问父类的那个。尽管它们同名但是互不影响。
在构造一个子类的对象时,父类的构造方法也是会被调用的,而且父类的构造方法在子类的构造方法之前被调用。在程序运行过程中,子类对象的一部分空间存放的是父类对象。因为子类从父类得到继承,在子类对象初始化过程中可能会使用到父类的成员。所以父类的空间正是要先被初始化的,然后子类的空间才得到初始化。在这个过程中,如果父类的构造方法需要参数,如何传递参数就很重要了。

7.多态

多态的作用其实把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。
多态有常常与强制类型转换联系在一起,实现类型还原。
强制类型转换,又叫造型。分为基本数据类型和引用数据类型两种情况,这里探讨后者,即引用类型的强制类型转换。但是否转换成功是有条件的!

举个栗子来说,比如原来定义了两个类型,FatherClass和SonClass,然后构造了一个SonClass类型的对象,用一个FatherClass类型的变量father引用了,就像这样:
FatherClass father = new SonClass();
那么,需要将这个对象的类型还原的时候,就可以用这个表达式。
SonClass son = (SonClass)father;
其实,father仍然是FatherClass类型,这一切都交给了son这个变量。

在于这个的对象的真实类型,也就是它是使用什么类的构造方法构造出来的。如果它本身就是父类的类型,那么强制类型转换是不会成功的。

还是举个例子:
FatherClass f = new FatherClass();
SonClass s = (SonClass)f; //这时候就会报错,运行时报错,编译能通过的,编译器只检查类型之间有无继承关系,有则通过;运行时检查真正类型,是则通过。

@override 作用:声明检查覆盖父类中的函数,使当遇到调用该函数的时候不在使用系统默认的函数,而是用我们定义的函数

8.代码优化

耦合与聚合
要评判某些设计比其他的设计优秀,就得定义一些在类的设计中重要的术语,以用来讨论 设计的优劣。对于类的设计来说,有两个核心术语:耦合和聚合。 耦合这个词指的是类和类之间的联系。之前的章节中提到过,程序设计的目标是一系列通 过定义明确的接口通信来协同工作的类。耦合度反映了这些类联系的紧密度。我们努力要获得 低的耦合度,或者叫作松耦合(loose coupling)。
耦合度决定修改应用程序的容易程度。在一个紧耦合的结构中,对一个类的修改也会导致 对其他一些类的修改。这是要努力避免的,否则,一点小小的改变就可能使整个应用程序发生 改变。另外,要想找到所有需要修改的地方,并一一加以修改,却是一件既困难又费时的事情。 另一方面,在一个松耦合的系统中,常常可以修改一个类,但同时不会修改其他类,而且 整个程序还可以正常运作。
聚合与程序中一个单独的单元所承担的任务的数量和种类相对应有关,它是针对类或方法 这样大小的程序单元而言的理想情况下,一个代码单元应该负责一个聚合的任务(也就是说,一个任务可以被看作是 一个逻辑单元)。一个方法应该实现一个逻辑操作,而一个类应该代表一定类型的实体。聚合 理论背后的要点是重用:如果一个方法或类是只负责一件定义明确的事情,那么就很有可能在 另外不同的上下文环境中使用。遵循这个理论的一个额外的好处是,当程序某部分的代码需要 改变时,在某个代码单元中很可能会找到所有需要改变的相关代码段。

  1. 消除重复代码,提高聚合度。代码重复是程序不良的表现。
  2. 封装,也就是把对象与操作捆绑在一起。(在视频中,老师讲到当在连续添加字符段时,管理者变量要用StringBuffer类型,不能用String,以为后者的类型在每加一段字符串时就创建一个对象,管理者指向新的对象,增加运行空间;而StringBuffer类型是可以在对象上课删减的)其实就是降低耦合度,减少类与类之间的变量的使用。
    3.可扩展性,建立框架+数据的形式可提高代码的质量(比如在视频中用了hashmap容器、接口)
9.抽象

抽象类表达的是一种概念,一种共同属性的抽象集合,我们并不希望任何抽象类的对象会被创建出来,抽象类的作用仅仅是表达接口,而不是具体的实现细节
抽象函数:表达概念而无法实现具体代码的函数
抽象类:表达概念而无法创建对象的类
带有abstract修饰的类就是抽象类
有抽象函数的类一定是抽象类
抽象类可以定义 变量(任何继承抽象类的非抽象类穿创建的对象可以赋给该变量)
继承于抽象类的类中定义的方法必须覆盖抽象类中的抽象函数,否则这个子类也会变成抽象类

10. 接口

Java把抽象的概念又更推进了一步。这就是接口(Interface)。接口其实就是完全抽象的类,因此接口和类的地位是一样的,此前所有针对类的所有法则同样适用于接口。接口所有的方法都是没有方法体的,而且都是public abstract,即使你没有这样声明。而接口中的所有成员变量都是public static final的变量,并且必须有定义初始化,因为所有变量都必须在编译的时候有确定值。
接口和类的地位是一样的。因此我们可以看到其定义方式跟类也是基本上一样的。当然,其中的所有方法都没有方法体。而当类从接口得到继承的时候,Java用另外一个动词:实现(implements)。
Java不允许多继承,但是允许一个类实现多个接口,也允许一个接口从多个接口得到继承,但是不允许接口从类继承。
接口是纯都抽象类,即所有的函数与变量都是抽象的。所以继承于接口的类中定义的方法必须覆盖接口中的所有函数,否则这个子类也会变成抽象类,另外类可以继承多个接口,但不可以是多个类

11.内部类

内部类就是指一个类定义在另一个类的内部,从而成为外部类的一个成员。因此一个类中可以有成员变量、方法,还可以有内部类。实际上Java的内部类可以被称为成员类,内部类实际上是它所在类的成员。所以内部类也就具有和成员变量、成员方法相同的性质。比如,成员方法可以访问私有变量,那么成员类也可以访问私有变量了。也就是说,成员类中的成员方法都可以访问成员类所在类的私有变量。内部类最重要的特点就是能够访问外部类的所有成员。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值