权限修饰符是用来控制一个成员能够被访问的范围,可以修饰成员变量,方法,构造器,内部类,不同权限修饰符修饰的成员能够被访问的范围将受到限制.
权限修饰符四种作用范围由小到大:private->缺省->protected->public
修饰符 | 同一个类中 | 同一个包中其他类 | 不同包下的子类 | 不同包下的无关类 |
---|---|---|---|---|
private | √ | |||
缺省 | √ | √ | ||
protected | √ | √ | √ | √ |
public | √ | √ | √ | √ |
package com.itheima.d2_modifier;
public class Fu {
protected void protectedMethod(){
System.out.println("---protected--");
}
}
package com.itheima.d2_modifier.itcast;
import com.itheima.d2_modifier.Fu;
public class Zi extends Fu {
public static void main(String[] args) {
/**
* 访问protected修饰的成员时,并不是在子
* 类中创建父类对象访问,而是创建子类对象访问
*/
Fu fu = new Fu();
// fu.protectedMethod();//报错
Zi zi = new Zi();
zi.protectedMethod();
}
}
变量有几种:
public class Test2 {
//2.修饰静态成员变量(public static final修饰的也称为常量了)
public static final String schoolName = "情话";
//3.修饰实例成员变量(创建的所有对象的某个属性一模一样且不能更改,几乎不用)
private final String name = "猪八戒";
public static void main(String[] args) {
// 1.1 修饰局部变量
final double rate = 3.14;
// rate = 3.19; // 第二次赋值了
buy(0.8);
}
// 1.2修饰局部变量
public static void buy(final double z){
// z = 0.1; // 第二次赋值了
}
}
final修饰变量的注意:
枚举是java中一种特殊类型,是为了做信息的标志和信息的分类
定义枚举类的格式:
修饰符 enum 枚举名称{
第一行都是罗列枚举类实例的名称,建议全部大小写
}
下面用反编译的方法了解枚举特点:
桌面建Season.java文件,并编写代码
public enum Season {
SPRING, SUMMER, AUTUMN, WHITE;
}
打开命令行窗口,先cd C:\Users\mxy\Desktop切换到桌面,再javac Season.java进行编译,最后javap Season.class即可得到反编译后的代码,如下所示:
Compiled from "Season.java"
public final class Season extends java.lang.Enum<Season> {
public static final Season SPRING = new Season();
public static final Season SUMMER = new Season();
public static final Season AUTUMN = new Season();
public static final Season WHITE = new Season();
public static Season[] values();
public static Season valueOf(java.lang.String);
static {};
}
观察上述代码可以知道枚举的以下特征:
选择常量和枚举做信息标志和分类的区别:
为什么说使用常量入参值不受约束而使用枚举入参约束严谨呢:
public class MyTest {
public static void main(String[] args) {
write_1(Contant_1.UP);
write_1(5);//只要传入的参数是int就不会报错.那我传个5,就是偏
//偏不传Contant_1.UP,Contant_1.DOWN,程序仍能运行,这就是入参值不受约束
write_2(Contant_2.DOWN);//传入的必须是Contant_2类型的对象,否则
// 程序直接报错,这就是入参约束严谨
}
public static void write_1(int num) {
switch (num) {
case Contant_1.UP:
System.out.println("玛丽往↑飞了一下~~");
break;
case Contant_1.DOWN:
System.out.println("玛丽往↓蹲了一下~~");
break;
}
}
public static void write_2(Contant_2 contant_2) {
switch (contant_2) {
case UP://这里直接UP而不再需要Contant_2.UP是因为Switch已经兼
//容枚举,这是java做的优化,如果用Contant_2.UP反而报错
System.out.println("玛丽往↑飞了一下~~");
break;
case DOWN:
System.out.println("玛丽往↓蹲了一下~~");
break;
}
}
}
class Contant_1 {
public static final int UP = 1;
public static final int DOWN = 2;
}
enum Contant_2 {
UP,DOWN;
}
1.使用场景:当父类知道子类一定要完成某些行为,但是每个子类行为的实现又不同,于是该父类就把该行为定义成抽象方法的形式,具体实现交给子类去完成,此时这个类就可以声明成抽象类
2.抽象类和抽象方法的特点:
3.final和abstract的关系:
1.使用场景:当系统中出现同一个功能多处在开发,而该功能中大部分代码是一样的,只有其中部分可能不同的时候
2.模板方法模式实现步骤
public class Test {
public static void main(String[] args) {
StudentMiddle s = new StudentMiddle();
s.write();
}
}
public abstract class Student {
public final void write(){
System.out.println("\t\t\t\t《我的爸爸》");
System.out.println("你的爸爸是啥样,来说说:");
System.out.println(writeMain());//因为子类已经重写了writeMain方法,就近原则调用子类的该方法而不是调用父类的(感觉这样理解不太对)
System.out.println("我的爸爸简直太好了~~");
}
public abstract String writeMain();
}
public class StudentMiddle extends Student{
@Override
public String writeMain() {
return "我爸爸很牛,开车都不看红绿灯的~~";
}
}
1.接口中有什么:JDK8之前接口中只能有常量(public static final修饰)和抽象方法.由于接口的作用的规范思想(就是规定你干嘛),规范默认都应该是公开的,所以修饰常量的public static final和修饰方法的public abstract都可以省略
2.接口的特点:
3.JDK8以后允许接口中有非抽象方法(为什么要这样做呢:我写好了一个项目,后来有一天业务需求我必须向接口中加一个新的规范,那这样的话就会出现实现该接口的类都会爆红需要重新处理,这样的话太麻烦了,所以JDK8后允许接口中有非抽象方法,这样的话有新的业务需求我们就可以直接在接口中写非抽象方法,与此同时实现该接口的类也会自动拥有该方法)
新增的三种非抽象方法:
上述的三种方法我们自己在开发中很少使用,通常是java源码涉及到
public class Test {
public static void main(String[] args) {
PingPongMan p = new PingPongMan();
p.run();
SportMan.inAddr();//用接口名调用自己的静态方法
}
}
public interface SportMan {
default void run(){
go();
System.out.println("==跑的贼溜==");
}
static void inAddr(){
System.out.println("我们在美国");
}
private void go(){
System.out.println("开始跑~~");
}
}
public class PingPongMan implements SportMan{
}
4.接口的注意事项:
我认为的规范冲突(以下几点缺一不可):
//报错
interface a {
default void m1() {
System.out.println("m1");
}
}
interface b {
default void m1() {
System.out.println("m1");
}
}
interface c extends a,b{
}
//不报错
interface a {
static void m1() {
System.out.println("m1");
}
}
interface b {
static void m1() {
System.out.println("m1");
}
}
interface c extends a,b{
}
//报错
interface a {
void m1();
}
interface b {
default void m1() {
System.out.println("m1");
}
}
interface c extends a,b{
}
//报错
interface a {
int m1();
}
interface b {
default void m1() {
System.out.println("m1");
}
}
interface c extends a,b{
}
//不报错
interface a {
int m1(int a);
}
interface b {
default void m1() {
System.out.println("m1");
}
}
interface c extends a,b{
}
//报错
interface a {
static void m1() {
System.out.println("m1");
}
}
interface b {
void m1();
}
interface c extends a,b{
}
//不报错
interface a {
private void m1() {
System.out.println("m1");
}
}
interface b {
void m1();
}
interface c extends a,b{
}