面向对象2
1static关键字
/**
* static关键字:static修饰类的属性\方法\代码块\内部类
* 跟类一起加载,只有一份,存在方法区里
* 静态属性两种调用:1
*/
public class Chinese {
//属性
String name;
int age;
/*String country;不用static修饰的话,每创建一个对象,都会复制一份在堆空间,浪费内存空间*/
static String country = "中国";
}
public class TestChinese {
public static void main(String[] args) {
Chinese c1 = new Chinese();
c1.name = "张三";
c1.age = 18;
Chinese c2 = new Chinese();
c2.name = "李四";
c2.age = 20;
System.out.println(c1.country);
System.out.println(Chinese.country);
}
}
2static方法
/**
* static修饰的静态方法:不能访问非静态成员变量
* 成员方法:可以访问非静态成员变量 也可以访问静态成员变量
*
*/
public class StaticMethod {
int num1;//成员变量
static int num2;//静态成员变量
//成员方法
public void get1(){
System.out.println("成员方法 "+num1);
System.out.println("静态方法 "+num2);
}
//静态方法
public static void get2(){
System.out.println("静态方法 "+num2);
}
public static void main(String[] args) {
StaticMethod.get2();//通过类名访问静态方法
StaticMethod s = new StaticMethod();//通过对象名访问成员方法.要先创建对象
s.get1();
}
}
3代码块
/**
* 代码块 : 在类中定义,类似一个没有名称的方法
* 分为:实例块 静态块
* 实例块:在创建对象时自动调用
* 静态块:在类加载时自动调用
*/
public class Demo {
static int num = 10;
//实例块
{
System.out.println("实例块");
}
//静态块
static{
System.out.println("静态块");
}
public static void main(String[] args) {
//创建一个对象时,类加载了,所以两个块都会被调用
/*new Demo();*/
//通过类名访问一个静态属性时类加载了,所以静态块自动调用
System.out.println(Demo.num);
}
}
4包
/**
* 包:
* 概念:物理上的文件夹
* 作用:管理类; 具体体现: 1 避免类重名(全类名=包名(类地址)+类名)
* 2
* 3
*/
public class PackageDemo {
//默认使用了上面import导入的类
Date d1 = new Date();
//d2类型与d1类型是同名类,d1类型默认使用了import导入的类;d2类型只能全包名类
java.sql.Date d2 = new java.sql.Date(100);
}
/**
* 访问权限修饰符
* public 公共权限
* protected 受保护的
* 默认 同包权限
* private 私有权限
*/
public class PackageDemo2 {
public int numpub;
protected int numpro;
int numint;
private int numpri;
public void test(){
//同类权限 public protected 默认 private
System.out.println(numpub);
System.out.println(numpro);
System.out.println(numint);
System.out.println(numpri);
}
}
public class PackageDemo3 {
public void test(){
PackageDemo2 p = new PackageDemo2();
//同包权限 public protected 默认
System.out.println(p.numpub);
System.out.println(p.numpro);
System.out.println(p.numint);
//numpri被private修饰,只能在同类中被访问
/*System.out.println(p.numpri);*/
}
}
public class PackageDemo4 extends PackageDemo2 {
public void test(){
PackageDemo2 p = new PackageDemo2();
PackageDemo4 p1 = new PackageDemo4();//创建本类对象 跨包访问
//不同包的子类权限 public protected
System.out.println(p.numpub);
System.out.println(p1.numpro);
//numpri被private修饰,只能在同类中被访问
/*System.out.println(p.numpri);*/
}
}