1.this的使用
使用场合:从一个构造方法调用到另一个构造方法
作用:缩短程序代码,减少开发程序时间
规则:通过关键字this来调用
this必须写在构造方法的第一行位置
在圆柱体类Cylinder里,用一个构造方法调用另一个构造方法
class Cylinder{
private double radius;
private int height;
private double pi = 3.14;
String color;
public Cylinder(){
this(2.5,5,"红色");
System.out.println("无参构造方法被调用了");
}
public Cylinder(double r,int h,String str){
System.out.println("有参构造函数被调用了");
radius = r;height = h;color = str;
}
double area(){
return pi*radius*radius;
}
double volume(){
return area()*height;
}
}
public class This_text {
public static void main(String[] args) {
Cylinder volu = new Cylinder();
System.out.println("底面积="+volu.area());
System.out.println("体积="+volu.volume());
}
}
2.公共构造方法与私有构造方法
一般情况:构造方法是public,创建对象时,在类的外部被系统自动调用。
特殊情况:若被声明为private,则无法在所在类外的地方被调用,但在该类内部可以调用
class Cylinder{
private double radius;
private int height;
private double pi = 3.14;
String color;
private Cylinder(){
System.out.println("无参构造方法被调用了");
}
public Cylinder(double r,int h,String str){
this();
radius = r;height = h;color = str;
}
double area(){
return pi*radius*radius;
}
double volume(){
return area()*height;
}
}
public class This_text {
public static void main(String[] args) {
Cylinder volu = new Cylinder(2.5,5,"红色");
System.out.println("底面积="+volu.area());
System.out.println("体积="+volu.volume());
}
}
3.对象的赋值
对象是引用变量,对象名中保存的是对象在内存中首地址。
对象被赋值,意味着首地址相同
对象的比较亦然
class Cylinder {
private double radius;
private int height;
private static double pi = 3.14;
public Cylinder(double r, int h) {
radius = r;
height = h;
}
public void setCylinder(double r, int h) {
radius = r;
height = h;
}//这里展示了构造方法和set方法这两种对private的两种赋值方式
double volume() {
return pi * radius * radius * height;
}
}
public class This_text {
public static void main(String[] args) {
Cylinder volu1, volu2;
volu1 = new Cylinder(2.5, 5);
System.out.println("圆柱体1的体积=" + volu1.volume());
volu2 = volu1;
volu2.setCylinder(1.0, 2);
System.out.println("圆柱体1的体积=" + volu1.volume());
}
}
这里会发现圆柱体1的体积发生了变化
Cylinder volu1, volu2;
volu1 = new Cylinder(2.5, 5);
System.out.println("圆柱体1的体积=" + volu1.volume());
volu2 = volu1;
volu2.setCylinder(1.0, 2);
System.out.println("圆柱体1的体积=" + volu1.volume());
所以当volu2=volu1时,其实volu2和volu1是指向同一个地址所以在volu2.setCylinder(1.0, 2)后再输出volu1d的体积时结果发生了改变
4.关于main方法
main方法的访问权限为何必须为public,static?
–JVM需要在类外调用main方法,所以访问权限必须是public
–由于JVM需要在类外调用main方法,而且JVM运行在系统开始执行的一个程序前,并没有创建main方法所在的类的实例,所以只能通过类名来调用main方法作为程序的吐口,因而该方法必须是static。
public class Text {
public static void main(String[] args) {
System.out.println("是静态方法不需要创建实例就能输出");
}
public inferior(){
System.out.println("不是静态方法得创建实例才能输出");
}
}
例:普通调用方法得必须对方法创建实例Text ex = new Text();
再ex.infetior()
才能调用方法,而静态的方法直接Text.main()就可以直接调用了。而JVM并没有创建main方法所在的类的实例,所以main方法必须是静态
5.statict拓展
错误原因:静态方法只能访问static成员变量,或static方法(静态成员不能访问实例成员)
修改:将myString改为类变量
class Student{
String name;
String number;
double sum;
//实例变量:定义在类中但在任何方法之外。
double total(){
sum = 40;
return sum;
//这里能引用是因为total是实例方法所以可以访问实例变量
}
}
类成员(静态成员)不能访问实例成员
public class StaticTest {
//主类中可以添加成员变量
public static void main(String[] args) {
int 100;//这里可以引用是因为i是方法的局部变量,非成员变量
System.out.println(i);
}
}
6.编程拓展
1.哪些变量需要定义为静态的呢?
具有唯一性的变量,独立于任何具体的实例
如pi,论坛在线人数,考试及格人数,点赞人数等
依托对象,强调个体性的变量,为实例变量
如每个Student对象有各自的属性(实例变量)
姓名,年龄,考试成绩等
2.变量汇总与分析,根据变成需求,恰当地定义变量
3.面向对象三大特征:封装,继承,多态
什么是封装
将对象的状态信息隐藏在对象内部,不允许外部程序直接访问,而是通过该类所提供的方法来实现对内部信息的操作和访问
封装的实现:访问控制符 例:private,public
**要求:**学会编写封装良好的类
该暴露的暴露该隐藏的隐藏