概念:隐藏类的内部实现细节,对外提供可访问的方法
把尽可能多的东西藏起来,对外提供便捷的接口
只提供给用户用到的接口,封装得越多越安全
举例:电脑中有很多插口,只提供给用户有用的
把所有的属性藏起来
属性是无法屏蔽错误的,用户输入什么就接受什么,不安全
封装的好处:
便于使用者正确使用系统,防止错误修改属性
有助于系统之间的松耦合,提高系统独立性
提高软件的可重用性
降低了构建大型系统的风险
包
创建包package:
允许类组成较小的单元(类似文件夹),易于找到和使用相应的文件
防止命名冲突,区分名字相同的类
有助于实施访问权限的控制
如何创建包:
package cn.jbit.inherit; //声明包
public class School{
……
}
-
包名由小写字母组成,不能以圆点开头或结尾
package test; //声明包
-
包名之前最好加上唯一的前缀,通常使用组织倒置的网路域名
package net.javagroup.mypackage;
-
包名后续部分依不同机构内部的
package net.javagroup.research.powerproject; 部门名.项目名
com:商业机构、edu:教育机构、gov:政府机关、net:网络机构、org:非盈利机构
使用组织倒置的网络域名:www.bdqn.cn 这个域网是唯一的,
一般公司命名为:com.公司名。项目名.模块名
导入包import:
import 包名.类名 import java.util.*; //导入java.util包中所有类,*包中所有类 //导入指定包中指定类,指包中School类 import cn.jtest.classandobject.School; 不同包下使用对象: com.test01.User u1 = new com.test01.User(); com.test01.User u2 = new com.test02.User();
注意:
1、一个类同时引用了两个来自不同包的同名类
必须通过完整类名来区分
2、 每个包都是独立的,顶层包不会包含子包的类
3、 package和import的顺序是固定的
package必须位于第一行(忽略注释行)
只允许有一个package语句
其次是import
接着是类的
访问权限控制
类的访问修饰public:
-
public修饰符:公有访问级别
-
默认修饰符:包级私有访问级别
| 修饰符作用域 | 同一个类中 | 同一个包中 | 子类中 | 任何地方 |
|---|---|---|---|---|
| private | 可以 | 不可以 | 不可以 | 不可以 |
| 默认修饰符 | 可以 | 可以 | 不可以 | 不可以 |
| protected | 可以 | 可以 | 可以 | 不可以 |
| public | 可以 | 可以 | 可以 | 可以 |
static修饰符:
可以用来修饰:
成员变量:静态变量,可以直接通过类名访问
成员方法:静态方法,可以直接通过类名访问
代码块:静态代码块,当Java虚拟机加载类时,就会执行该代码块
static代码块:
JVM加载类时,加载静态代码块:如果有多个静态块,按顺序加载;每个静态代码块只会被执行一次
package test;
class StaticTest{
static int num = 100;
static{
num+=100;
System.out.println(num); //200
System.out.println("静态代码块1");
}
static{
num+=100;
System.out.println(num); //300
System.out.println("静态代码块2");
}
}
public class Test04 {
public static void main(String[] args) {
StaticTest st1 = new StaticTest();
StaticTest st2 = new StaticTest();
System.out.println(StaticTest.num); //300
}
}
//输出:
200
静态代码块1
300
静态代码块2
300
static变量:
static变量的作用:
(1)能被类的所有实例共享,可作为实例之间进行交流的共享数据
(2)如果类的所有实例都包含一个相同的常量属性,可把这个属性定义为静态常量类型,从而节省内存空间 (定义一个静态常量,用类.name 去调用,避免每次new User())
static方法:
1.静态方法:可直接通过类名访问
静态方法中不能使用this和super
不能直接访问所属类的实例变量和实例方法
可直接访问类的静态变量和静态方法
2.实例方法:通过实例访问
可直接访问所属类的静态变量、静态方法、实例变量和实例方法
3.静态方法必须被实现
main是最常用的静态方法,静态方法里面只能调用静态方法
package test;
public class User {
//public static String name = "张安"; //静态变量
public static final String NAME = "张安"; //静态常量,名字大写
//静态方法:
public static void show(){}
//构造方法:
public User(){
System.out.println("构造方法");
}
static{
System.out.println("加载static代码块");
}
static{
System.out.println("加载static代码块");
}
//测试类中:
System.out.print(User.NAME); //张安
User.show(); //调用静态方法语法(Arrays.toString等也是静态方法)
new User(); //先读取静态,才调构造。并且只会加载一次
new User();
//输出:加载代码块*2 构造方法 构造方法
继承
使用继承:
Java中只支持单根继承,即一个类只能有一个直接父类
将子类共有的属性和行为放到父类中
编写父类(基类,超类)
[访问修饰符] class Pet{
//公共的属性和方法
}
编写子类(派生类),继承父类
[访问修饰符] class Dog extends Pet {
//子类特有的属性和方法
}
super关键字:
子类访问父类成员:
-
使用super关键字,super代表父类对象;super只能出现在子类的方法和构造方法中。
-
在子类构造方法中调用且必须是第一句。
-
不可以访问父类中定义为private的属性和方法
访问父类构造方法:super(); super(name); 访问父类属性:super.name; 访问父类方法:super.print();
继承条件下构造方法的调用规则如下:
Ø 如果子类的构造方法中没有通过super显式调用父类的有参构造方法,也没有通过this显式调用自身的其他构造方法,则系统会默认先调用父类的无参构造方法。在这种情况下,写不写“super();”语句,效果是一样的。
Ø 如果子类的构造方法中通过super显式调用父类的有参构造方法,那将执行父类相应构造方法,而不执行父类无参构造方法。
Ø 如果子类的构造方法中通过this显式调用自身的其他构造方法,在相应构造方法中应用以上两条规则。
Ø 特别注意的是,如果存在多级继承关系,在创建一个子类对象时,以上规则会多次向更高一级父类应用,一直到执行顶级父类Object类的无参构造方法为止。
public class Fu {
public int age = 40;
}
public class Zi extends Fu{
public int age = 30;
public void show(){
int age = 20;
System.out.println(age); //20
//访问本类的成员变量
System.out.println(this.age); //30
//访问父类的成员变量
System.out.println(super.age); //40
}
}
publiv class Demo{
Zi zz = new Zi();
zz.show();
}
理解继承:
子类调用父类的什么?
-
继承public和protected修饰的属性和方法,不管子类和父类是否在同一个包里
-
继承默认权限修饰符的属性和方法,但子类和父类必须在同一个包里
-
不能继承父类private成员
-
构造方法
java中继承的注意事项:
-
java中类只能继承一个父类,不能多继承
-
java中类支持多层继承



