走进 Java2
什么是构造方法
1.方法名和类名一致
2.没有具体的返回值类型
3.连void都没有
public 方法名和类名一致(要么空参要么带上形式参数列表)
构造方法支持方法重载
注意事项:
1.一个类中如果没有提供任何构造方法,系统会默认提供一个无参构造方法.
2.一个类中如果提供了很多有参构造方法,系统不会提供无参构造方法.如果还要使用无参构造方法来创建
对象,会报错,永远给出无参构造方法.
类名 对象名 = new 类名(); 默认为无参构造方法执行
快捷键 alt+ins constructor 全选 生成有参无参 ,给所有成员变量赋值
给成员变量的赋值方式 1.set xxx(xx) 赋值 2.有参构造方法赋值
关于变量的使用问题(细节):
什么是将变量定义为成员变量?
变量定义的时候,如果能够描述这个事物的属性-----定义成员变量
一个类的成员:
成员变量:属性私有化
构造方法:有参构造和无参构造
成员方法:带参无参有无返回值类型 都用void代替
static关键字
本身含义:共享,共用的意思,随着类的加载而加载
特点:
1.随着类的加载而加载,类在加载的时候,静态相关成员(类成员:静态的变量或静态方法)
随着类的加载先进内存(静态区)
2.优先于存在,不能和this共存
3. 体现的是共享共用的意思,如需求中有"共有"的含义 ,这个变量直接使用static修饰
4. 被static修饰的成员(变量/方法),推荐的访问方式是使用类名.静态变量 或 类名.静态方法名
不推荐使用对象名来访问静态方法/静态成员方法
使用静态相关变量/方法注意事项:
1.静态方法既可以访问静态也可以访问非静态(静态变量/静态方法)
2.静态只能访问静态的东西(静态变量/静态方法)
私有方法加入 static 可以访问
**工具类中 构造方法私有化,对外提供静态的公共的方法
代码块
Java中的代码块 重点掌握代码块的优先级(静态>构造>方法)
局部代码块:比较简单 在局部位置(方法定义中)定义的{}
作用:限定某个变量的生命周期
构造代码块: 在类的成员位置
作用:在执行构造方法之前,如存在构造代码块,优先执行构造代码块然后执行构造方法
可将构造方法的共性内容放在构造代码块中,优先级 构造代码块>构造方法
类加载一次,静态代码块也就执行一次就完毕(构造代码块还会继续执行)
执行优先级:静态代码块>构造代码块>构造方法
继承
概念:将多个事物的共性内容抽取到一个独立的事物中,这个事物和其他事物之间产生一种关系,称为继承
这个事物也就是类
关键字"extends"
继承的好处:
1.提高了代码的复用性
2.提高了代码的维护性(方便后期维护)
3.类与类产生的继承关系是多态的前提条件
弊端:
继承关系存在局限性,不要为了使用部分功能去使用继承
开发原则:
低耦合(类与类的关系越少越好,耦合度只能降低不能避免)
高内聚(某个类完成某件事情的能力,一个类能完成尽量一个类去完成)
什么时候使用继承?
如果类A是类B 的一种,或者B是A的一种,这时候使用继承体现的是一种 is a 的关系
继承的特点:
1.类和类之间的关系只支持单继承
2.不支持多继承但是可以多层继承
成员变量和静态变量的区别?
1.存储位置不同
2.生命周期不同
3.初始化不同
4.访问方式不同
继承的注意事项:
1.子类继承父类,只能继承父类的非私有成员,私有成员可以间接访问
2.子类继承父类,构造方法不能继承,只能间接访问
通过super访问 super() 默认访问父类无参构造 super(xx)访问父类有参构造方法
子类所有构造方法都是默认访问父类无参构造方法,因为jvm校验语法时,存在继承,需要先让父类初始化,
因为子类可能用父类的数据,所以采用分层初始化,子类所有构造方法第一句话的super()可省略不写
继承中关于成员变量访问的问题:
1.如果子类继承父类,子类成员变量名称和父类成员变量不一致,分别访问即可
2.如果子类继承父类,两个成员变量名称一致,如何访问?
就近原则机制:1>首先在子类 局部位置(成员方法)找,如果有就用
2>如果子类局部位置没有,那么就在子类的成员位置找,有就使用
3>如果子类没有,就在父类的成员位置找,有就使用
4>如果父类也没有,继续往上找,顶层父类中没有会报错
this:代表当前类的对象地址值
super:代表父类的空间表示,理解为父类对象地址值用
构造方法的目的就是类成员进行数据初始化
继承中的成员方法访问问题:
1.子类继承父类,如果子类和父类成员方法名(公共的)不一致,分别调用即可
2. 如果子类出现江河父类一模一样的方法,子类会将父类方法进行覆盖,也就是方法重写override
什么是方法重写:
继承中使用,子类与父类出现一模一样的方法,目的就是为了将父类的方法进行重写
注意事项: 访问权限不能更低 有时候子类继承父类,父类不想让子类将父类方法重写,为了保证数据的安全性
Java提供关键字 final (状态修饰符) 最终的无法更改
关键字final的特点:
1.可以修饰类,该类不能被继承
2.修饰成员变量,此时这个变量是常量(自定义常量)
3.final也可以修饰成员方法,此时这个方法不能被重写
实际开发中,static和final是一块的
面试题: final 修饰基本数据类型和修饰引用类型区别?
修饰基本数据类型,他的数据值不能被改变(不能在赋值了)
修饰引用类型,引用类型空间地址值不在改变(不能重新new)
this和super的区别:
this代表当前类对象
super代表父类对象的地址值用
使用方式不同: .变量名/.方法名/.()/.(xx)只要是this就是和本类有关 , 只要是super 就和父类有关
方法重载和重写的区别?
overload重载 override 重写
方法重载:定义方法的时候,多个方法名相同,参数列表不同,与返回值无关(目的:提高方法扩展性)
方法重写:在继承中子类出现和父类一模一样的方法声明(一模一样,返回值,方法名,参数列表)
子类将父类的方法覆盖,使用子类的一些自己的功能,重写时,要保证访问权限足够大
目的为了沿用父类功能,然后还可以优化自己的功能
多态
从现实世界事物考虑:一个事物的多种形态,从程序中考虑,一个类体现出内存的变化
多态:能够体现书事物的不同形态(程序中内存的变化)
多态的前提条件:
1.必须有继承关系,如果没有继承,不谈多态
2.必须存在方法重写
3.必须存在父类引用指向子类对象 父类名 对象名 = new 子类名();向上转型
多态的成员访问特点:
1.成员变量:编译看左,运行看左
2.成员方法:编译看左,运行看右
3.构造方法:由于存在继承构造方法,执行时,分层初始化,先让父类初始化再让子类进行构造初始化
多态的好处:
1.可以提高代码的扩展性,父类引用指向子类对象
2.可以提高代码的复用性以及维护性(继承保证)
多态的弊端:
无法访问子类特有功能
解决方案:
1.直接创建子类对象
2.推荐向下转型 将父类引用转子类引用 强制类型转换,大类型转为小类型
向下转型的前提是必须有向上转型
多态使用向下转型可能会出现问题,使用不当会造成程序异常classCastException,类型转换异常
抽象类
什么是抽象类:
一个事物的某个行为 具体的事物的具体体现,将这个事物定层次父类定义"抽象"
有抽象方法的类一定是抽象类
抽象方法:仅仅给出一个方法声明,没有方法体
有抽象方法的类一定是抽象类,抽象类不一定都是抽象方法
非抽象不需要被子类重写 抽象的方法,强制子类必须重写
抽象类的特点:
1.抽象类不能进行实例化,不能new
2.抽象类的子类如果也是抽象类,不能实例化,一定会提供一个具体子类
父类名 对象名 = new 具体子类名 (抽象类多态)
3.强制子类必须完成的事情,将抽象类中的抽象方法必须重写
抽象类的成员特点:
成员变量:既可以是变量也可以是常量
成员方法:既可以存在抽象方法(强制重写)也可以定义非抽象方法
构造方法:无参有参都可存在,构造方法都需要让父类先初始化,然后再是子类进行初始化
如果一个类没有任何抽象方法,把这个类定义为抽象类的意义?
意义:不让外界类直接创建对象,需要提供具体子类进行实例化
abstract和哪些关键字冲突:
private 被private修饰成员,需在当前类进行访问,加入abstract强制子类转换
final 被final修饰的成员方法,不能被重写
static 被static修饰的成员方法,算不上重写
abstract 的应用范围
1.定义类 抽象类
2.定义方法 抽象方法
接口
什么是接口?
接口就是体现的事物本身不具备的工具,额外的功能;
接口的定义:
interface 接口名 {}
要实现接口里面的额外的功能,才具备这功能
开发中接口的实现类名
class 接口名+Impl inplement 接口名{}
接口的特点:
1.接口的方法是不能有方法体的,只能是抽象方法,二亲隐藏public abstract(可省略不写)
2.接口不能实例化(不能new)
3.如果接口的实现类他是一个抽象类,肯定有一个具体的接口的实现类来进行new
接口名 对象名 = new 具体子实现类 (接口多态)
接口成员特点:
成员变量:只能是常量 存在默认修饰符 public static final 可省略
成员方法:只能是抽象方法 村子默认修饰符 public abstract 可省略
构造方法:接口没有构造方法
类与接口的关系:
是实现关系 implements class 子实现类名 implement 接口名{}
类与类 接口与类 接口与接口
Java中最基本的单元就是类
类与类 只支持单继承 不支持多继承 但不支持多层继承
类与接口 是实现关系 一个类继承另一个类的同时 可实现多个接口
class 子类extends 父类 implent 接口1,接口2....{}
接口与接口 是继承关系 不仅可以单继承也可以多继承
面试题:
接口和抽象类的区别?
1.成员的区别:
2.关系区别:
3.设计理念区别
方法形参问题
方法形参如果是引用类型
数组:需传递数组对象
类:
具体类: 实际参数 需传递当前类对象
抽象类: 实际参数 需传递抽象类的子类对象(抽象类多态)
接口:实际参数 需传递该接口的子实现类对象(接口多态)
方法返回值问题
1.返回值基本类型:需要什么基本数据类型就使用对应类型接收
2.研究引用类型:
类: 具体类: 需要返回当前类的具体对象
抽象类: 需要返回的是当前抽象类的子类对象
接口:需要返回接口的子实现类对象(接口多态)
关于权限修饰符的应用范围
在同一个包下的本类 private 默认修饰符 protected public
在同一个包下的子类或同一个包下的无关类 默认修饰符 protected public
在不同包下的子类 protected public
在不同包的无关类 public
私有权限修饰符private的权限最小 public的权限最大
包 package
包的本质就是文件夹(目录)
程序员在编写代码存储的地址 包在开发中(公司域名反写.多个包中间.隔开)
包是为了维护代码结构的
带包的编译和运行:
1.不推荐手动方式
2.自动方式(推荐)
如果使用另一个包下的类,进行导包之后的下面操作一样
1>进入dos黑窗口,进入到xx.java文件目录
2>javac - d.java源文件 ---->会自动将pacakge包的结构创建出来将类名.class放进去
3>直接java 包名.类名 运行即可
内部类
一个类A中,有一个类B,将类B称为类A的内部类 类A也就是类B的外部类
内部类的两种格式:
1.成员内部类: 在一个外部类的成员位置(类中方法外)定义的类
2.局部内部类:在外部成员的局部位置(方法定义中)的类
成员内部类:
员内部类可以访问外部类的成员,包括私有相关的
如何直接通过外部类去访问内部类的成员?
外部类名.内部类名 对象名 = new 外部类名().new 内部类名
成员内部被私有修饰,保证数据安全这个方式就不能使用了
成员内部类修饰符:
可以有private修饰,目的是为了数据安全性
**可以有static修饰符
1.静态的成员内部只能外部类的静态成员
2.静态的成员内部类中无论是静态方法还是非静态方法,访问外部类的成员必须静态
3.想直接通过外部类来访问静态成员内部类的成员信息
访问格式: 外部类名.内部类名 对象名 = new 外部类名.内部类名();
访问静态成员内部类成员
外部类名.内部类名 对象名 = new 外部类名.内部类名();
对象名.静态成员内部类成员;
如果静态的成员内部类的成员方法也是静态的: 外部类名.内部类名.静态方法名();
匿名内部类
没有名字的类
应用范围:在局部位置中的方法定义或者声明上
匿名内部类本质就是继承该类(抽象类)或者是实现类的该接口的子类对象
匿名内部类在开发中的应用:
形参问题:
如果方法形参是一个抽象类,调用方法时实参需为抽象类的子类对象
如果方法形参是一个接口,调用方法时实参需为子实现类对象
Object
java常用类之 java.lang.Object
表示所有类的跟类(超类或者父类)
所有的类默认继承自Object 拥有这个类的所有非私有方法
用==符号连接的两个引用类型比较的是地址值是否相同
获取任意字节码文件对象 .class类对象
public final class getClass(); 返回值表示正在运行的那个类
面试题:
在java中获取一个类的字节码文件对象的方式有几种?
三种:
public final class getClass(); 任意java对象调用getClass ();
任意java类型的class属性
Class类有一个静态方法forName('"包名.类名") "反射"