Java修饰符、四大储存域、匿名内部类、面向接口

目的与要求

  1. 掌握Java修饰符
  2. 掌握Java四大储存域
  3. 掌握Java匿名内部类
  4. Java面向接口

Java修饰符

Java语言提供了两类修饰符:

  • 访问修饰符
  • 非访问修饰符

1、访问修饰符

修饰符当前类同一包内子孙类(同一包)子孙类(不同包)其他包
publicYYYYY
protectedYYYY/N(说明N
默认YYYNN
privateYNNNN

2、非访问修饰符

static静态:
1、静态变量

​ static 关键字用来声明独立于对象的静态变量,无论一个类实例化多少对象,它的静态变量只有一份拷贝。 静态变量也被称为类变量。局部变量不能被声明为 static 变量。

2、静态方法

​ static 关键字用来声明独立于对象的静态方法。静态方法不能使用类的非静态变量。静态方法从参数列表得到数据,然后计算这些数据。

3、静态代码块

​ static修饰的代码块具有类级别的优先级,子啊类被加载的时候自动执行

static关键字修饰的静态变量和静态函数使用:类名.变量名;类名.函数名

package com.star.demo11;

public class Student {
	private String name;
	// 私有静态变量
	private static int count;

	public Student(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public static int getCount() {
		return count;
	}

	public void setName(String name) {
		this.name = name;
	}

	// 静态方法在类的内外都使用【类名.】来调用
	public static void setCount(int count) {
		// 静态变量在类的内外都使用【类名.】来调用
		Student.count = count;
	}
}

----------------------------------------------------------------------------

package com.star.demo11;

public class Main {
	
	public static void main(String[] args) {
		Student student1 = new Student("张三");
		student1.setCount(1);
		Student student2 = new Student("李四");
		student2.setCount(2);
		Student student3 = new Student("王五");
		student3.setCount(3);
		Student student4 = new Student("麻子");
		student4.setCount(4);
		//System.out.println("创建学生总数为:"+Student.count);
		System.out.println("创建学生总数为:"+Student.getCount());
		System.out.println("创建学生总数为:"+student1.getCount());
		System.out.println("创建学生总数为:"+student2.getCount());
		System.out.println("创建学生总数为:"+student3.getCount());
		System.out.println("创建学生总数为:"+student4.getCount());
	}
}
final最终

final 表示"最后的、最终的"含义。变量一旦赋值后,不能被重新赋值。

final的特征:

  • final 修饰的实例变量必须显式指定初始值。可以在构造函数和普通代码块中赋值,但是只能赋值一次
  • final 修饰符通常和 static 修饰符一起使用来创建类常量。可以在静态代码块中赋值,但是只能赋值一次
  • final 类不能被继承,没有类能够继承 final 类的任何特性。
  • 父类中的 final 方法可以被子类继承,但是不能被子类重写。

**注:**声明 final 方法的主要目的是防止该方法或者类的内容被修改。

package com.star.demo12;

public class Math {
	// 圆周率常量:static final
	private static final double PI = 3.1415926;

	// 求圆面积
	public static final double area(double radius) {
		//PI = 3;//报错
		return PI * radius * radius;
	}

	// 求矩形面积
	public double area(double width, double height) {
		return width * height;
	}
}

----------------------------------------------------------------------------

package com.star.demo12;

//final修饰类,这个类不能被继承
public final class Child extends Math{
	//只能复写父类的非final 和 static的方法
	@Override
	public double area(double width, double height) {
		System.out.println("复写了父类的方法,并且调用父类的实现");
		return super.area(width, height);
	}
}

//报错,最终类不能被继承
//class son extends Child{}

----------------------------------------------------------------------------

package com.star.demo12;

public class Main {
	public static void main(String[] args) {
		System.out.println("半径为12.5的圆面积:"+Child.area(12.5));
		System.out.println("长为20,宽为10的矩形面积:"+new Child().area(20,10));
	}
}

结果:

abstract 抽象

abstract可以修饰类和方法。

  • abstract修饰的类叫做抽象类,抽象类不能用来实例化对象
  • abstract修饰的方法叫做抽象方法,抽象方法没有方法体

注:

  • 一个类不能同时被 abstract 和 final 修饰
  • 抽象方法不能被声明成 final 和 static。

如果一个类包含抽象方法,那么该类一定要声明为抽象类,否则将出现编译错误

声明抽象类的唯一目的是为了将来对该类进行扩充

任何继承抽象类的子类必须实现父类的所有抽象方法,除非该子类也是抽象类。

如果一个类包含若干个抽象方法,那么该类必须声明为抽象类。抽象类可以不包含抽象方法。

package com.star.demo13;
//带有抽象方法的类必须加abstract申明为抽象类
public abstract class AbsClass {
	//抽象方法,不能写方法体{...}
	public abstract void fun1();
	//非抽象方法必须写方法体{...}
	public void fun2() {
		System.out.println("AbsClass的抽象方法:fun2");
	}
}

----------------------------------------------------------------------------

package com.star.demo13;

public class Child extends AbsClass{
	//继承抽象类必须实现抽象类未实现的抽象方法
	@Override
	public void fun1() {
		System.out.println("被子类实现的方法:fun1");
	}

}

----------------------------------------------------------------------------

package com.star.demo13;

public class Main {

	public static void main(String[] args) {
		//AbsClass absClass = new AbsClass();//抽象类不能被实例化
		AbsClass absClass = new Child();//能被实例化
		Child child = new Child();
		absClass.fun1();
		absClass.fun2();
		child.fun1();
		child.fun2();
	}
}

Java四大存储域

存储域特征
堆内存用来存放由new创建的对象数组
jvm只有一个堆区(heap)被所有线程共享。
栈中存用数组或对象在堆内存中的首地址(32位4字节,64位8字节)、函数中定义的一些基本类型的变量数据
每个线程包含一个栈区,每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问
方法区方法区用于存储虚拟机加载的类信息、静态变量、即时编译器编译后的代码等数据。
方法区跟堆一样,被所有的线程共享。
常量池常量池指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。
包含代码中所定义的各种基本类型(如int、long等等)和对象型(如String及数组)的常量值(final)

Java匿名内部类

匿名类就是没有使用变量保存起来,使用一次以后就不再使用的类

包括普通匿名类匿名内部类

内部类创建方法:外部类对象.new 内部类()

package com.star.demo07;

public class User {
	private String name = "UserName";
	String sex = "男";
	protected int age = 20;
	public String address = "地球";
	
	//内部类
	class Inner{
		private String name = "InnerName";
		String sex1 = "女";
		protected int age = 30;
		public String address = "月球";
		
		public void show() {
			System.out.println(name);
			System.out.println(sex);
			System.out.println(sex1);
			System.out.println(age);
			System.out.println(address);
		}
	}
	public void show() {
		System.out.println(name);
		System.out.println(sex);
		//System.out.println(sex1);
		System.out.println(age);
		System.out.println(address);
	}
}

----------------------------------------------------------------------------

package com.star.demo07;

import com.star.demo02.User.Inner;

public class Main {
	public static void main(String[] args) {
		User user = new User();
		user.show();
		Inner inner = user.new Inner();
		inner.show();
	}
}

JAVA面向接口

接口是一种新类型,有别于类,但是又和类类似

接口相当于非常特殊的抽象类,只要public****抽象函数**常量****

接口没有构造方法,因此接口不能被实例化,只能被实现,故子类使用【*implements*】关键词来实现接口

一个子类可以实现多个接口(多实现)

接口特性:

  • 接口中每一个方法也是隐式抽象的,会被隐式的指定为 public abstract(也只能是 public abstract,其他修饰符都会报错)。
  • 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)。
  • 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。

default关键字用于实现默认的方法

default void bite() {
        System.out.println("默认实现的方法");
}
package com.star.demo14;

public interface Mather {
	//只能是public static final,且必须赋值
	public static final String firstname = "陶";
	public static final String lastname = "琪";
	public static final String sex = "女";
	// 默认为public
	void beautify();
	default void bite() {
        System.out.println("默认实现的方法");
    }
}

----------------------------------------------------------------------------

package com.star.demo14;

public interface Father {
	//只能是public static final,且必须赋值
	public static final String firstname = "太";
	public static final String lastname = "史慈";
	public static final String sex = "男";
	// 默认为public
	void strong();
}


package com.star.demo14;

public class Son implements Father, Mather {

	public String firstname;
	public String lastname;
	public String sex;

	public Son() {
		this.firstname = Father.firstname + Mather.firstname;
		this.lastname = "气";
		this.sex = Math.random() + 1 > 0 ? "男" : "女";
	}

	@Override
	public void beautify() {
		System.out.println("漂亮");
	}

	@Override
	public void strong() {
		System.out.println("强壮");
	}

}

----------------------------------------------------------------------------

package com.star.demo14;

public class Main {

	public static void main(String[] args) {
		Mather mather = new Son();
		Father father = new Son();
		Son son = new Son();
		
		mather.beautify();//只有Mather的beautify方法
		father.strong();//只有Father的strong方法
		son.beautify();//不仅有beautify方法
		son.strong();//还有strong方法
	}

}
练习:

1、 学生成绩统计,有一个班级学生10人,循环录入10学生的分数,统计并显示

提示:创建学生类(学生姓名+成绩)

​ 1.显示学生姓名 + 成绩

​ 2.统计班级的总分、平均分、及格率

​ 3.显示不及格的学生姓名 + 成绩

2、 模拟一扑扑克牌,54张牌,
花色有:红桃,梅花,黑桃,方块,
牌面值有:A,1-10,J,Q,K
分析有哪些类,并创建出54张牌对象。

提示:每张牌:Card(颜色(数值,文字)),Value(值(数字,文字))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值