目录
一.多态
二.封装
三.包
四.static
五.初始化块
相同类型的变量,调用同一个方法时呈现出多种不同的行为特征。
前提:继承与覆写
出现:向上转型
判断:左为编译类型,右为运行类型
#意义:允许添加更多类型的子类实现功能扩展,却不需要修改基于父类的代码。
public class Main {
public static void main(String[] args) {
Animal A=new Cat();
Animal B=new Dog();
A.Call();//喵喵喵
B.Call();//汪汪汪
}
}
class Animal{
String name;
public void Call(){
}
}
class Cat extends Animal{
public void Call()
{
System.out.println("喵喵喵");
}
}
class Dog extends Animal{
public void Call()
{
System.out.println("汪汪汪");
}
}
指将对象的状态信息隐藏在内部,不允许外部直接访问,而是通过该类中的方法操作/访问
意义:
实现:
依赖于三个访问控制符:private,protect,public
不加默认为default
控制级别表:
外部类 只能被public与default修饰
对于一个封装良好的类,使用setter与getter方法来操作与访问成员变量
setter方法中常常包含控制逻辑
public class Main {
public static void main(String[] args) {
Person p=new Person();
p.setName("Elysia");
p.setAge(18);
p.setSex("Female");
System.out.println(p.getName()+"\n"+p.getSex()+"\n"+p.age());
}
}
class Person{
private int age;
private String name;
private String sex;
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
public String getSex(){
return sex;
}
public void setSex(String sex){
if(sex.equals("Man")||sex.equals("Female")) {
this.sex = sex;
}
}
public int age(){
return age;
}
public void setAge(int age){
if(age>=0&&age<=150){
this.age=age;
}
}
}
理解:包即文件夹,其中存放了类,不同的包中类可以重名。
意义:解决了类的命名冲突、类文件管理等问题
(一)package
1.使用package将类放于指定包中
package packageName;//第一行
2.规定:位于包中的类,在文件系统中也必须有与包名层次相同的目录结构
即java文件的目录结构与class的目录结构相一致
3.先给java源文件建包,再使用package声明
执行package命令时,将自动在相应的位置建立class文件
(二)import
导入指定包层次下的某个类或全部类
1.使用:
2.意义:
简化代码
可将 pack.sub. ... .ClassName x=new pack.sub. ... .ClassName();
//import package1.name1;
//import package2.name2;
public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
//name1 x1=new name1();
package1.name1 x1=new package1.name1();
//name2 x2=new name2();
package2.name2 x2=new package2.name2();
x1.test();//package1下的类
x2.test();//package2下的类
}
}
简化为 ClassName x=new ClassName();
import package1.name1;
import package2.name2;
public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
name1 x1=new name1();
//package1.name1 x1=new package1.name1();
name2 x2=new name2();
//package2.name2 x2=new package2.name2();
x1.test();//package1下的类
x2.test();//package2下的类
}
}
即省略文件路径
3.java默认导入java.lang包
(三)import static
导入指定类的单个/全部静态成员、方法
1.使用:
import static pack.sub. ... .Class.field|method;
import static pack.sub. ... .*;
(四)java源文件大体结构
package ...;
import|import static ...;
public class|interface|enum{}
class|interface|enum{}
可用与修饰成员变量、方法等成员。
static修饰的成员属于类本身,不独属于该类的单个实例
(一)静态变量
1.理解:又称类变量,是所有该类实例共享的。
2.区别:
public class Main {
public static void main(String[] args) {
System.out.println(Family.F_property);//输出这个家庭的总资产
Family Dad=new Family("Dad",80000);
Family.F_cost(200);
System.out.println(Family.F_property);
}
}
class Family{
static double F_property=200000;//家庭总资产
double personal;//个人资产
String identify;//家庭身份
public Family(String identify,double personal){
this.identify=identify;
this.personal=personal;
}
public void increase(double income){
F_property+=income;
}
public void get_living(int get){
personal+=get;
F_property-=get;
}
public static void F_cost(double cost){
F_property-=cost;//家庭开销
personal+=cost;//企图占据家庭资产,报错,F_cost,无法访问personal
}
}
3.意义:
(二)静态方法 类方法
意义:1.使用方便 2. 用于工具类中的方法定义,类似于函数
在类的内部:任意成员可以访问静态成员,静态成员不能直接访问非静态成员
(三)静态代码块
用static修饰的代码块{ }
1.格式 [修饰符]{
//可执行语句
} //修饰符要么不加,要么只能加static
2.执行顺序
初始化块和声明时赋的值,谁在前,谁先执行。
二者都先于构造器执行(编译后,初始化代码会“还原”到构造器中的前面)
先执行父类,在执行子类。
普通在创建对象时执行,静态在加载类时执行。
3.意义:将多个构造器中的相同无参初始化代码 提取到初始化块中。让代码更简洁,提高可维护性。
public class Main {
public static void main(String[] args) {
new SubClass();
new SubClass();
}
}
class SuperClass{
{
System.out.println("SuperClass的普通初始化块,创建对象时执行");//2次
}
static{
System.out.println("SuperClass的静态初始化块,加载类时只执行一次");//一次
}
public SuperClass(){
System.out.println("SuperClass的构造器");//2次
}
}
class SubClass extends SuperClass{
{
System.out.println("SubClass的普通初始化块,创建对象时执行");//2
}
static{
System.out.println("SubClass的静态初始化块,加载类时只执行一次");//1
}
public SubClass(){
System.out.println("SubClass的构造器");//2
}
}