1. This
1.1. 概念
This : 是对象中第一个成员变量 , 保存了当前对象的内=内存地址
this只能出现在成员方法中 , 不能出现在静态方法中 , 在成员方法中, 谁调用的这个成员方法 , this就代表谁
1.2. 作用
this的作用 :
1 当他用在成员方法或者构造方法中时 , 用来区分同名的成员变量和局部变量
(局部变量和静态变量可以重名 用类名来区分)
(静态变量和成员变量 不可以同名 使用this 区分同名的局部变量和成员变量)
2 当用在构造方法中时 , 用于重载调用当前类中其他的构造方法
3 返回this, 用于链式调用
1.3. this的用法
1.3.1. 区分成员变量和局部变量
public class User {
private String username;
private String password;
//成员方法中用来区分成员变量和局部变量
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
//构造方法中用来区分成员变量和局部变量
public User(String username, String password) {
super();
this.username = username;
this.password = password;
}
}
1.3.2. 重载调用构造方法
class MyDate{
//创建私有变量年月日
private int y;
private int m;
private int d;
//需求 : 当不输入年月日的时候 默认为1970-1-1
public MyDate() {
//调用当前类中的有参构造,该用法必须在构造方法的第一行
this(1970, 1, 1);
}
public MyDate(int y, int m, int d) {
this.y = y;
this.m = m;
this.d = d;
}
public void print() {
System.out.println(y+"-"+m+"-"+d);
}
}
1.3.3. 链式调用
public class This_02 {
public static void main(String[] args) {
This_02 t1 = new This_02();
User user = new User();
This_02 t2 = t1.m1();
This_02 t3 = t2.m2();
This_02 t4 = t3.m4();
//链式调用
//原理 : 方法返回值,调用下一个方法的应用
t1.m1().m2().m4().m4();
}
public This_02 m1() {
return this;
}
public This_02 m2() {
return this;
}
public This_02 m3() {
return this;
}
public This_02 m4() {
return this;
}
}
1.4. 注意事项
this不能出现在静态方法中
会报错提示无法从静态上下文中引用非静态变量 this
2. 静态的static
2.1. static概念
static : 修饰符 , 用来标注静态属性 , 如果没有使用static , 则为成员属性
2.2. static作用
功能 :
1 静态变量 : 在类体中使用static修饰的变量是静态变量
2 静态方法 : shiyongstatic修饰的方法是静态方法
3 静态语句块 : shiyongstatic修饰的语句块是静态语句块
2.3. 静态语句块
语句块 : 一个大括号就是一个语句块 : { } 可以理解为没有名字、返回值和修饰的方法
静态语句块 : 用static修饰的大括号 static { } 不能调用 , 在程序加载的时自动调用 , 并且只执行一次(执行顺序在main方法之前 , 在类加载时就会加载静态属性)
所有的静态属性都是在加载时进行的初始化
访问一个类的静态属性的时候 , 会加载该类到内存中
由于在整个程序生命周期中 , 类只会加载一次 , 所以静态语句块只会执行一次 , 并且在最开始执行 , 所以适合执行一些初始化的准备工作
2.4. 实例语句块
实例语句块 : 没有static修饰的大括号 { } 语句块就是实例语句块 可以等同看做没有名字的成员方法
实例语句块在创建对象时 , 立即执行 , 并且在构造方法之前执行 ,(当对象创建完成后 构造方法里面的语句暂时不会执行 , 待实例语句块执行完之后才会执行) , 并且每创建一个对象就会执行一次
3. 封装
把所有组成部分组合到一起,还可以通过权限控制修饰符将数据隐藏起来 , 可以控制用户对类数据的修改程度
适当的封装可以让代码更容易理解,易于维护,更提高了代码的安全性
3.1. 包机制
3.1.1. Package
package : 引入包机制 , 可以解决命名冲突问题
类名的完整写法是带包名的
注意 : package 是规定,编译之后的class文件的放置目录,不是java文件的放置目录
带package的java文件 编译 : javac -d ./ -encoding UTF-8 java文件.java 运行 : java 包名.类名
package 必须放在文件的第一行
3.1.2. Import
import : 导入其他类,使当前类中可以直接使用该类,而不用编写类全名
import 包名.类名; 导入某个包下的某个类
import 包名.*; 导入某个包下所有类;
import 语句 可以有多个,但是必须放在class语句之上,如果有package的话,必须放在package之下
注意 : 按空格 或者回车的时候 会自动导包,如果程序没有问题,但是报错,可以查看
一下是否导包错误
3.2. 权限控制
4. 继承
4.1. 继承的概念
继承 : 是从一个已有的类中,衍生出一个新的类,该类往往包含着父类的特征,还可以新增 特有的属性
java中只支持单继承,一个类只能有一个父类,并且继承是可以传递的
一个类虽然只能继承一个类,但是一个类确可以有很多子类
如果一个类没有显示继承另一个类,则该类默认继承 java.lang.Object
Object 是java提供的根类,所有类都会直接或者间接的继承Object
4.2. 继承的作用
继承的好处 : 代码复用
继承最大的功能 : 方法覆写
4.3. 继承的用法
语法 : class 类名 extends 父类名 {类体 }
5. super
5.1. super的概念
super : 在子类中,表示了父类特征(可以理解为父类对象)
5.2. super的作用
功能 :
1 区分子类和父类同名的属性和方法
2 在子类构造方法中,重载调用父类的构造方法
5.3. super的用法
5.3.1. 区分父子类同名的属性
public class Super_01 {
public static void main(String[] args) {
Sub sub = new Sub();
sub.test();
}
}
class Sup {
int age = 22;
String name = "张三";
public void m1() {
System.out.println("父类111");
}
public void m2() {
System.out.println("父类222");
}
}
class Sub extends Sup {
int age = 11;
public void m1() {
System.out.println("子类111");
}
public void test(){
System.out.println(age);
System.out.println(super.age);
System.out.println(name);
m1();
super.m1();
m2();
}
}
5.3.2. 调用父类构造方法
super : 可以再子类构造方法中调用父类构造方法
在子类构造方法中,如果第一行没有写super() 或 this() 那么 默认有个super() 去调用父类无参构造
如果父类没有无参构造,则子类构造方法中,必须在第一行手写super(参数)进行调用
5.4. 注意事项
如果在子类构造方法中,没有显示出现super() 也没有出现 this(xxx) 则 默认有一个super() 调用父类无参构造
并且 super(xxx) 必须出现在子类构造方法 第一行 所以 this(xxx) 和 super(xxx) 不能同时出现
因为构造方法第一行有super()调用父类构造,所以 某一个类如果构造方法私有化了,那么该类不会再被继承