一、Static关键字
static 是一个关键字,意思是静态的,是一种修饰符
1.可以修饰属性(成员变量),修饰的属性叫静态变量或者类变量;
2.可以修饰方法 叫做静态方法,也叫类方法;(可以用类名直接调用)
3.代码块 叫做静态代码块
4.类 静态内部类
静态的方法不能调用非静态的属性或者非静态的方法
对象的方法可以使用static的属性或者方法,也可以使用实例方法
public class StaticDemo {
//静态方法可以直接用类名调用
public static void test() {
System.out.println("static");
}
//非静态方法 只能通过对象名来调用
public void test02() {
System.out.println("无static");
}
public class Student {
//用static 来修饰的成员变量是静态成员变量
//静态成员变量属于整个类所有,被该类创建出来的所有的对象所共享
String name;
//普通方法可以直接使用静态成员变量
static String city;
public void test() {
System.out.println(name);
}
//静态的成员方法不能使用非静态的成员变量
public static void test02() {
System.out.println(city);
}
// static 修饰一个代码块,则该代码块为静态代码块
// 静态代码块只能使用静态成员变量,不能使用非静态成员变量
// 当当前类被系统成功加载以后,系统会自动调用静态代码块
// 在静态代码块中可以用来初始化对象的静态成员变量
static{
city = "广州";
System.out.println("静态代码块");
}
{
// 普通代码块,当对象创建的时候自动调用
System.out.println("普通代码块");
}
单例模式
package 单例;
public class Dog {
String name;
int age;
static Dog dog = null;
//单例方法,创建dog的对象必须要用该方法创建
public static Dog creatDog() {
//不能使用普通方法:因为普通方法调用之前要先创建一个对象
//每次来调用单例方法创建对象的时候先判断一下dog的引用是否为空
//如果dog的引用为空 证明从来没有创建过对象
//所以,就新建一个Dog的对象并且给dog的引用赋值
if (dog == null) {
//从此刻开始 dog引用就不为空了,指向的值此次创建出来的Dog的对象
dog = new Dog();
}
return dog;
}
}
package 单例02;
import java.util.Scanner;
public class UserInfo {
String userName;
String psw;
static UserInfo info = null;
public static UserInfo getUserInfo() {
if (info == null) {
info = new UserInfo();
Scanner input = new Scanner(System.in);
System.out.println("请输入用户名");
info.userName = input.next();
System.out.println("请输入密码");
info.psw = input.next();
}
return info;
}
}
package 单例02;
public class GoodsList {
public void showGoodsList() {
System.out.println("商品列表");
UserInfo info = UserInfo.getUserInfo();
System.out.println(info.userName);
System.out.println(info.psw);
}
}
package 单例02;
public class GoodsInfo {
public void showGoodsInfo() {
System.out.println("商品详情");
UserInfo info = UserInfo.getUserInfo();
System.out.println(info.userName+info.psw);
}
}
package 单例02;
public class Test {
public static void main(String[] args) {
UserInfo info = UserInfo.getUserInfo();
GoodsList list = new GoodsList();
list.showGoodsList();
GoodsInfo ginfo = new GoodsInfo();
ginfo.showGoodsInfo();
}
}
二、this关键字
作用:
this表示的是当前对象本身;
this代表当前对象的一个引用
调用属性;调用方法;调用构造方法
静态成员方法不能使用this关键字;
因为静态方法用类名直接调用,所以没有对象,也就没有当前对象
普通方法中使用this。
位置:任意;
调用当前对象的其他方法
构造方法中使用this。
位置:必须是第一条语句
使用this来调用其他构造方法
package thisdemo;
/**
* this 是当前对象的引用
* 那个对象调用了当前方法,,那个对象就是当前对象
* @author tang
*
*/
public class Dog {
String name;
int age;
public void test() {
System.out.println(this);
this.test02();
}
public void test02() {
System.out.println(this);
}
}
三、构造方法
-一个在创建对象是被自动调用的特殊方法
作用:
为对象进行初始化(成员变量)工作。
构造方法是一种特殊的方法:
构造方法是创建对象的时候自动调用的方法;
构造方法的名字必须跟类名保持一致;
构造方法返回的类型是当前类的类型,但是在定义方法的时候无需声明返回值;
同时构造方法也不能return
当一个类中没有任何构造方法,系统会自动生成一个无参的构造方法;
如果类中声明了构造方法,则系统不会再生成无参构造方法
构造方法也可以重载
package 构造方法;
public class Dog {
String name;
int age;
/**
* 构造方法是创建对象的时候自动调用的方法
* 构造方法的名字必须跟类名保持一致
* 构造方法返回的类型是当前类的类型,但是在定义方法的时候无需声明返回值
* 同时构造方法也不能return
*
* 当一个类中没有任何构造方法,系统会自动生成一个无参的构造方法
* 如果类中声明了构造方法,则系统不会再生成无参构造方法
*
* 构造方法也可以重载
*/
public Dog(){
name = "旺财";
age = 2;
System.out.println("无参构造");
}
public Dog(String name){
name = "旺财";
age = 2;
}
public Dog(String name,int age) {
//this在构造方法中可以用来调用其他的构造方法
//必须出现在构造方法的第一行
this();
this.name = name;
this.age = age;
}
}
四、静态导入
静态导入就是直接将目标类中的静态成员变量和静态成员方法直接导入到当前类中
五、inport
为什么需要import?
如果不适用import,我们如果用到其他包的类时,只能这么写:java.util.Date,代码量太大,不利于编写和维护。通过import可以导入其他包下面的类,从而可以在本类中直接通过类名来调用。
import怎么使用?
import java.util.Date;
import java.util.*; //导入该包下所有的类。会降低编译速度,但不会降低运行速度。
注意要点:
java会默认导入java.lang包下所有的类,因此这些类我们可以直接使用。
如果导入两个同名的类,只能用包名+类名来显示调用相关类:
java.util.Date date = new java.util.Date();
六、面向对象的三大特征
继承,封装,多态
面向过程只有封装性(功能的封装,而没有数据的封装),没有继承和多态。
封装:
隐藏对象内部的复杂性,只对外公开简单的接口。便于外界调用,从而提高系统的可扩展性,可维护性。
高内聚:就是累的内部数据操作细节自己完成,不允许外部干涉;
低耦合:仅暴露少量的方法给外部使用。
七、使用访问控制符,实现封装
成员(成员变量或成员方法)访问权限共有四种:
——public 公共的
--可以被项目中所有的类访问。(项目可见性)
——protected 受保护的
--可以被这个类本身访问;同一个包中的所有其他的类访问;被它的子类(同一个包以及不同包中的子类)访问
——default / friendly 默认的/友好的(包可见性)
--被这个类本身访问;被同一个包中的类访问
——private 私有的
--只能被这个类本身访问 (类可见性)
类的访问权限只有两种:
——public 公共的
--可被同一个项目中所有的类访问。(必须与文件名同名)
——default / friendly 默认的/友好的
--可被同一个包中的类访问
同一个类同一个包中子类所有类
private*
default**
protected***
public****
封装要点:
类的属性的处理:
1.一般使用private。(除非本属性确定会让子类继承)
2.提供相应的get/set 方法来访问相关的属性。这些方法通常是public,从而提供对属性的读取操作
(注意:Boolean变量的get方法是用:is开头)
一些只用于本类的辅助性方法可以用private
希望其他类调用的方法用public