java学习---面向对象进阶
Posted 易小顺
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java学习---面向对象进阶相关的知识,希望对你有一定的参考价值。
面向对象进阶
1、权限访问
1.1 封装对象
我们在创建实体类的初衷就是为了能够更好地 管理数据对象,但是有时候就可能会出现一些外部的非法访问(例如数据逻辑出错、外部随意修改对象内部数据),就向下面的栗子:
-
class Person{ public String name ; public int age ; }; public class Demo{ public static void main(String args[]){ Person per = new Person() ; per.name = "张三" ; per.age = -30 ; } };
三大思想之一便是 封装,但上面的代码没有体现出封装性,因此我们需要为对象属性字段加上访问权限修饰符。java
中的权限访问修饰符有四个: public
、protected
、 default
、 private
依次增强,访问范围逐渐减小。
1.2 权限修饰符
public
公有属性修饰,可修饰 类、接口、变量 、方法 ,对所有的类或者包都是可见的,可通过对象打点属性等方式直接进行访问。
protected
保护属性修饰,可修饰 对象、方法,对于同一个包内的访问和public
是一样的,不同包间只有子类能通过继承访问。
default
默认修饰,可修饰 类、接口、变量 、方法 ,同一个包内可进行继承和访问。
private
私有访问,可修饰 方法、变量,(不能对类进行修饰)只有当前类可进行数据对象的直接访问,外部访问可给出对应的getter
setter
方法。
2、代码块
2.1 普通代码块
在执行流程中出现的代码块,例如一个方法中的代码、或者是一个 if
语句的代码块等等,按照执行的顺序进行代码的解析执行。
-
class Demo{ public void demo() { boolean flag = true; if (flag) { System.out.println("执行"); } } }
2.2 构造代码块
类中的成员代码块,在每次对象创建之前执行,并且比构造函数先执行(可完成一些预先初始化的工作)。
-
代码演示
class Demo{ private String name; // 构造代码块 { System.out.println("构造代码块执行了"); name = "张三"; } public Demo() { System.out.println("构造函数执行了"); System.out.println(name); } }
-
执行结果
构造代码块执行了 构造函数执行了 张三
2.3 静态代码块
在了解静态代码块之前得先知道静态修饰符 static
, static
关键字属于类,而不是类的实例,也就是通过其修饰的对象将变成类的属性,而不是对象的实例属性,常用用于修饰同一个类不同对象之间共享的数据属性。可修饰 变量、方法、代码块、嵌套类。可直接通过 类名
或 对象
打点的方式进行访问。
通过 static
就叫做静态代码块, 在类加载时执行,每次程序启动到关闭 ,只会 执行一次 。
因为是在类加载时执行,因此运行期间才会生产的对象属性是不能在静态代码块中进行调用执行的,反过来可以。
-
代码演示
public class Person { private static String name; static { System.out.println("静态代码块执行了"); name = "张三"; } public Person() { System.out.println("构造方法执行了"); } public static void main(String[] args) { Person person = new Person(); System.out.println(person.name); } }
-
执行结果
静态代码块执行了 构造方法执行了 张三
-
重点
静态成员在类加载时加载并初始化。 无论一个类存在多少个对象,静态的属性,永远在内存中只有一份。 在访问时:静态不能访问非静态,非静态可以访问静态。
3、当前对象和父类对象的访问
3.1 this(当前对象)
this
关键字是一个最重要的概念,在类中进行使用相当于正在使用的类对象,可通过打点调用 类中的属性、调用类中的 方法或是构造方法,在通过 this()
来调用构造方法时只能放在第一行进行使用,而且不能出现循环嵌套构造的现象。
不能通过 this
打点的方式直接在类的内部访问 static
修饰的属性。
-
代码演示
public class Person { private String name; public Person() { } public Person(String name) { this(); this.name = name; } public static void main(String[] args) { Person person = new Person("张三"); } }
3.2 super(父类对象)
在子类中可通过 super
来访问父类的 方法 、属性 和 构造函数。
-
代码演示
public class Person { protected String name; public Person() { } } class Student extends Person{ private Integer age; public Student() { super(); System.out.println(super.name); } }
4、包
4.1 包的含义
- 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。
- 包如同文件夹一样,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。
- 包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。
4.2 包的使用
包中java文件的定义,在 .java
文件的首部首先进行包的定义,声明当前 java
文件中所定义的类属于哪一个包访问。
-
package com.beordie.model;
包名通常由多个单词组成,所有单词的字母小写,单词与单词之间使用 .
隔开 ,一般命名为 com.公司名.项目 名.模块名....
。
由于Java面向对象的特性,每名Java开发人员都可以编写属于自己的 Java Package
,为了保障每个 Java Package
命名的唯一性,在最新的 Java
编程规范中,要求开发人员在自己定义的包名前加上唯一的前缀。由于互联网上的域名称是不会重复的,所以多数开发人员采用自己公司在互联网上的域名称作为自己程序包的唯一前缀。
4.3 import 关键字
import
关键字的作用便是指明导入哪个包中的类进行使用,在包名定以后即可使用。
-
import com.beordie.model;
5、入口方法详解
和 C
、 C++
一样,java
也有自己的程序入口方法
-
public static void main(String[] args) {}
-
· public:表示公共的内容,可以被所有操作所调用 · static
:表示方法是静态的,可以由类名称直接调用。· void
:表示没有任何的返回值操作· main
:系统规定好的方法名称。如果main写错了或没有,会报错:NoSuchMethodError: main
· String[] args
:字符串数组,接收参数的
通过命令行编译执行 java
文件时,可在后面跟上需要使用的参数,由 args
数组进行参数接收。
-
java Person 1 2 3 4 5 6 7
如果传递的参数的数量没有满足程序使用的数量,会出现越界访问的执行异常。
以上是关于java学习---面向对象进阶的主要内容,如果未能解决你的问题,请参考以下文章