学习Java的进阶过程,是理解面向对象的思想,掌握面向对象的基本原则以及Java面向对象基本实现原理,熟练使用封装、继承、多态的三大特征,接下来我会带大家进一步探索Java世界的奥秘!
一、类和对象
类:是抽象的概念集合,表示的是一个共性的产物,类之中定义的是属性和行为(方法);
对象:对象是一种个性的表示,表示一个独立的个体,每个对象拥有自己独立的属性,依靠属性来区分不同对象。
1.定义类
[修饰符] class 类名
{
零到多个构造器定义...
零到多个field...
零到多个方法...
}
- 定义field的语法格式:
[修饰符] field 类型 field名[=默认值]
; - 定义方法的语法格式:
[修饰符]方法返回值类型 方法名(形参列表)
{
//由零条到多条可执行性语句组成的方法体
}
- 定义构造器是一个特殊的方法:
[修饰符]构造器名(形参列表)
{
//由零条到多条可执行性语句组成的构造器执行体
}
值得指出的是,构造器既不能定义返回值类型,也不能使用void没有返回值定义构造器
定义一个类
class Person { // 类名称首字母大写
//定义两个Field
String name ;
int age ;
//定义一个tell方法
public void tell() { // 没有static
System.out.println("姓名:" + name + ",年龄:" + age) ;
}
}
2.对象的产生和使用
定义和使用对象
public static void main(String args[]) {
Person per = new Person() ;// 声明并实例化对象
per.name = "张三" ;//操作属性内容
per.age = 30 ;//操作属性内容
per.tell() ;//调用类中的get()方法
}
二、封装
1.什么是封装?
将类的某些信息隐藏在类的内部,不允许外部程序直接访问,而是通过该类的提供方法来实现对隐藏信息的操作和访问
-
封装的好处
只能通过规定的方法来实现访问
2.实现步骤
修改属性的可见性—>设为private
创建Getter/setter方法—>用于属性的读写
在getter/setter方法中加入属性控制语句—>对属性值的合法性进行判断
3. 使用 java中的包管理类
1.包的作用
- 管理文件
- 解决同名文件冲突
2.定义包:package 包名
3.其他文件中使用另一个文件的包通过import关键字
全部必须是小写
4.java中的访问修饰符
访问修饰符 | 本类 | 同包 | 子类 | 其他 |
---|---|---|---|---|
private | Y | |||
默认 | Y | Y | ||
protect | Y | Y | Y | |
public | Y | Y | Y | Y |
5. 内部类
内部类顾名思义就是定义在类内部的另一个类
内部类常用的几种形式分为
从上面的代码中我们可以看到,成员内部类的使用方法:
1、 Inner 类定义在 Outer 类的内部,相当于 Outer 类的一个成员变量的位置,Inner 类可以使用任意访问控制符,如 public 、 protected 、 private 等
2、 Inner 类中定义的 test() 方法可以直接访问 Outer 类中的数据,而不受访问控制符的影响,如直接访问 Outer 类中的私有属性a
3、 定义了成员内部类后,必须使用外部类对象来创建内部类对象,而不能直接去 new 一个内部类对象,即:内部类 对象名 = 外部类对象.new 内部类( );
4、 编译上面的程序后,会发现产生了两个 .class 文件
其中,第二个是外部类的 .class 文件,第一个是内部类的 .class 文件,即成员内部类的 .class 文件总是这样:外部类名$内部类名.class
另外,友情提示哦:
1、 外部类是不能直接使用内部类的成员和方法滴
可先创建内部类的对象,然后通过内部类的对象来访问其成员变量和方法。
2、 如果外部类和内部类具有相同的成员变量或方法,内部类默认访问自己的成员变量或方法,如果要访问外部类的成员变量,可以使用 this 关键字。如:
(2)静态内部类
静态内部类是 static 修饰的内部类,这种内部类的特点是:
1、 静态内部类不能直接访问外部类的非静态成员,但可以通过** new 外部类().成员** 的方式访问
2、 如果外部类的静态成员与内部类的成员名称相同,可通过“类名.静态成员”访问外部类的静态成员;如果外部类的静态成员与内部类的成员名称不相同,则可通过“成员名”直接调用外部类的静态成员
3、 创建静态内部类的对象时,不需要外部类的对象,可以直接创建 内部类 对象名= new 内部类();
运行结果 :
(3)方法内部类
方法内部类就是内部类定义在外部类的方法中,方法内部类只在该方法的内部可见,即只在该方法内可以使用。
一定要注意哦:由于方法内部类不能在外部类的方法以外的地方使用,因此方法内部类不能使用访问控制符和 static 修饰符。
匿名内部类这里不做讲述,如有兴趣可以自行学习
三、继承
1.什么是继承
定义一个父类,再定义一个子类,让子类继承父类,则子类可以使用父类中定义的方法和成员。但是private属性是不能继承的。
2.方法的重写
我们经常会遇到这样的方法,子类继承了父类的方法,但是对父类方法不满意,则可以重写父类的方法,这样调用时会优先调用子类重写的方法,也就是重写过的方法
继承的初始化顺序
1.初始化父类再子类
2.先初始化对象中的属性,再执行构造方法中的初始化
3. java中final的使用
final刻意修饰类、方法、属性和变量
修饰类不允许被继承,修饰方法不允许被重写,修饰属性不允许隐式的初始化必须有值或在构造方法中赋值,修饰变量只能赋一次值变为常量
4. java中的super的使用
- 在对象的内部使用表示父类的对象
例:如果在子类重写了父类的方法,想调用父类的方法时super.父类的方法名()
- 子类的构造过程中必须调用父类的构造法方法相当于默认写了super()
- 如果显式调用构造方法(必须运用super方法调用)必须放在构造方法第一行,也就是说super()必须放在子类构造方法的第一行
- 如果父类有一个有参的构造法方法,子类又没有显式调用构造方法则报错
5. java中的Object类
object类式所有类的父类,如果一个类没有使用extends关键字明确标识继承另一个类,那么这个类继承object类
object类中的方法适合所有子类。
1.tostring()方法
返回对象式哈希code码(对象地址字符串)
2.equals()方法
比较的是对象的引用是否指向同一块内存地址
Dog dog = new Dog();
Dog dog2 = new Dog();
dog,dog2对象其实是dog指向了两个个不同的内存地址
if(dog.equals(dog2)){
System.out.println("地址值相同");
}else{System.out.println("地址值不相同");}
结果:地址值不相同
四、多态
对象的多种形态
1.引用多态
父类的引用可以指向本类的对象
父类的引用可以指向子类的对象
2.方法多态
创建本类的对象时,调用本类方法
创建子类对象时调用子类的重写方法或继承的方法
3. java 中的抽象类
就像公交车,出租车,摩托车等可以抽象出一个公共的特征是交通工具,有相同的使用方法是出行,那么类似的我们可以把许多类抽象出一个公共类,里面定义共有的成员变量以及方法,这样的类就是抽象类。定义一个抽象类,包括我们在c++中定义虚函数,这样的模块化使用不仅减少了代码的重复率,还减轻了开发人员的工作量,所以在面向对象的编程思想中,抽象类是一个很重要的运用。
-
抽象类的定义
abstract class Instrument {
// 抽象类中可以有非抽象方法。
private int i;
public abstract void play(Note n);
public String what() { return "Instrument"; }
public abstract void adjust();
}
4.java 中的接口
接口则是一个抽象类型,是抽象方法的集合,接口是为了实现不能抽象到一个类的两个有公共方法的类的方法的抽象。比如飞机和鸟,两个都具有相同的方法就是飞行,但是我们不能将飞机和鸟抽象到一个类里,那么飞机是一个类,鸟是一个类,同时我们定义一个接口,接口里抽象了飞行这个方法,则飞机和鸟两个类都可以通过调用这个接口实现飞行这个方法的实例化。
-
定义接口
[修饰符]interface 接口名[extends 父接口1,extends 父接口2,....]
{
零到多个常量定义...public static final
零到多个抽象方法的定义...public abstract
}
-
继承父类实现接口的语法为:
[修饰符]class 类名 extends 父类 implements 接口1,接口2 。。
{
类体部分//如果继承了抽象类,需要实现继承的抽象方法;要实现接口中的抽象方法
}
5.抽象类和接口的区别
要知道接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。
1、抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。
2、抽象类要被子类继承,接口要被类实现。
3、接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现
4、接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
5、抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。
6、抽象方法只能申明,不能实现,接口是设计的结果 ,抽象类是重构的结果
7、抽象类里可以没有抽象方法
8、如果一个类里有抽象方法,那么这个类只能是抽象类
9、抽象方法要被实现,所以不能是静态的,也不能是私有的。
10、接口可继承接口,并可多继承接口,但类只能单根继承。
end.
作者有话说:
我也是一个java方向技术小白,所以文章更多的是知识点干货内容,我会往自己的理解方面更多的努力,此篇文章希望可以给予有一定的java语言基础的程序猿们更多的帮助。如果喜欢我的文章记得关注我并给我点个赞哦~