1.private,protected,public三者的比较
访问包位置 | private | protected | public |
---|---|---|---|
本类 | 可见 | 可见 | 可见 |
同包其他类或子类 | 不可见 | 可见 | 可见 |
其他包的类或子类 | 不可见 | 不可见 | 可见 |
2.构造方法(无参和有参)
例:创建Student类
public class Student {
private String name;
private int age;
//构造方法
public Student() {
}
//重载构造方法,通过参数赋值
public Student(String name, int age) {
this.name = name;
this.age = age;
}
//传值
public void setName(String name) {
this.name = name;
}
//获取值
public String getName() {
return name;
}
//传值
public void setAge(int age) {
this.age = age;
}
//获取值
public int getAge() {
return age;
}
//show方法
public void show() {
System.out.println(name + "---" + age);
}
}
<1>通过上述的Student类无参数创建对象:
public class Test {
public static void main(String[] args) {
//无参数创建对象
Student s = new Student();
System.out.println(s.getName());
System.out.println(s.getAge());
s.setName("小强");
s.setAge(20);
System.out.println(s.getName());
System.out.println(s.getAge());
}
}
运行结果为:
分析:
对象s的name初值为null,age的初值为0,通过set方法给name和age 分别赋值小强和20。
内存图为:
<2>通过上述的Student类有参数创建对象:
public class Test {
public static void main(String[] args) {
//有参数创建对象
Student s1 = new Student("小丽", 18);
Student s2 = new Student("小明", 20);
s1.show();
s2.show();
s1.setAge(21);
s2.setName("小亮");
s1.show();
s2.show();
}
}
运行结果为:
分析:
给对象s1,s2赋初值后将s1的age赋值为21,将s2的name赋值为小亮。
内存图为:
<3>内存共用问题
public class Test {
public static void main(String[] args) {
//有参数创建对象
Student s1 = new Student("小丽", 18);
Student s2 = new Student("小明", 20);
Student s3 = s1;
s3.setAge(20);
s1.show();
s2.show();
s3.show();
}
}
运行结果为:
分析:
s1和s3内存共用,故改变s3.age的值就是改变s1.age的值。
内存图为:
3.随机数(猜数游戏)
例:猜1~100之间的数
public class GuessNumber {
public static void main(String[] args) {
int m = (int) (Math.random() * 100 + 1);
System.out.println("请输入1~100之间的数:");
GuessNumber test = new GuessNumber();
test.randomNumber(m);
}
public void randomNumber(int m) {
Scanner sc = new Scanner(System.in);
while (true) {
int n = sc.nextInt();
if (n == m) {
System.out.println("你猜对了!");
break;
} else if (n > m) {
System.out.println("你猜大了!");
} else {
System.out.println("你猜小了!");
}
}
}
}
Math.random() 表示大于等于0.0且小于1.0的随机数,(int) (Math.random() * 100 + 1)表示大于等于1小于等于100的随机数。
4.代码块的执行顺序
例:
class TestDemo {
static {
System.out.println("TestDemo的静态代码块");
}
{
System.out.println("TestDemo的构造代码块");
}
public TestDemo() {
System.out.println("TestDemo的构造方法");
}
}
public class Test {
static {
System.out.println("Test的静态代码块");
}
public static void main(String[] args) {
System.out.println("main方法");
TestDemo testDemo1 = new TestDemo();
TestDemo testDemo2 = new TestDemo();
}
}
运行结果为:
由运行结果可以看出静态代码块先执行,其次是构造代码块,最后是构造方法。
5.this和super关键字的区别
this代表的是本类对象的引用
super代表的是父类存储空间的标识(可以理解成父类的引用,可以操作父类的成员)
例:
父类:
class Father {
int num = 10;
Father() {
System.out.println("父类");
}
}
子类:
class Son extends Father {
int num = 20;
Son() {
System.out.println("子类");
}
void show() {
int num = 30;
System.out.println(num);
System.out.println(this.num);
System.out.println(super.num);
}
}
Test类:
public class Test {
public static void main(String[] args) {
Son son = new Son();
son.show();
}
}
运行结果为:
num表示show方法中的num,this.num表示子类中的num,super.num表示父类中的num。