class A{
private B b=null;
public void fun(){
this.b=new B(this);
this.b.fun();
}
public void print(){
System.out.println("Hellow word!!");
}
}
class B{
private A a =null;
public B(A a){
this.a =a;
}
public void fun(){
this.a.print();
}
}
public class Text1{
public static void main(String[]args){
new A().fun();
}
}
NO |
比较点 |
this |
Super |
1 |
属性 |
This属性表示的是本类中的属性,如果在子类中找不到属性则会从父类中继续查找 |
Super 属性,表示直接找到父类中的属性 |
2 |
方法 |
This 方法()表示调用本类中的方法 |
表示从子类中调用找到被子类覆写过的方法 |
3 |
构造 |
可以调用本类中的其他构造方法,但是要求至少有一个没有this() 调用构造时this()放在构造方法之前 |
从子类中调用副类的构造方法,字类不管如何写代码,都要先调用父类中的构造方法 调用构造时this()放在构造方法之前 |
4 |
特殊 |
This 表示当前的对象 |
无次概念 |
|
|
|
|
|
/*
完成一个简单的登陆系统,
输入用户名 密码
*/
package dom;
public class Text1{
public static void main(String[]args){
String name =args[0];
String password =args[1];
if(name.equals("wangqi")&& password.equals("123")){
System.out.println("登陆成功..");
}
else {
System.out.println("灯笼失败..");
}
}
}
为程序加入验证、
package dom;
public class Text1{
public static void main(String[]args){
if (args.length!=2){
System.out.println("参数输入不够");
System.exit(1);
}
String name =args[0];
String password =args[1];
if(name.equals("wangqi")&& password.equals("123")){
System.out.println("登陆成功..");
}
else {
System.out.println("灯笼失败..");
}
}
}
第一次封装
package dom;
class Check{
private String args[];
public Check(String []args){
this.args=args;
}
public boolean valuable (){
String name =this.args[0];
String password =this.args[1];
if(name.equals("wangqi")&& password.equals("123")){
System.out.println("登陆成功..");
return true;
}
else {
System.out.println("灯笼失败..");
return false ;
}
}
}
public class Text1{
public static void main(String[]args){
if (args.length!=2){
System.out.println("参数输入不够");
System.exit(1);
}
new Check(args).valuable();
}
}
第二次封状
/*
完成一个简单的登陆系统,
输入用户名 密码
*/
package dom;
class Check{
private String name;
private String password;
public Check(String name,String password){
this.name=name;
this.password=password;
}
public boolean valuable (){
if(name.equals("wangqi")&& password.equals("123")){
return true;
}
else {
return false ;
}
}
}
class Before{
private String args[];
public Before(String args[]){
this.args=args;
if (args.length!=2){
System.out.println("参数输入不够");
System.exit(1);
}
}
public String getInfo(){
if (new Check(this.args[0],this.args[1]).valuable()){
return "登陆成功..";
}
else{
return "登陆失败..";
}
}
}
public class Text1{
public static void main(String[]args){
System.out.println(new Before(args).getInfo());
}
}
<2.static
package dom;
class Person{
private String name;
private int age ;
String city=" A 城.";
public Person(String name,int age ){
this.name=name;
this.age =age;
}
public String getInfo(){
return "姓名:"+this.name +",年龄"+this.age+",城市"+city;
}
}
public class Text1{
public static void main(String[]args){
Person per1=new Person("张三",30);
Person per2=new Person("李四",30);
Person per3=new Person("王五",30);
System.out.println(per1.getInfo());
System.out.println(per2.getInfo());
System.out.println(per3.getInfo());
}
}
不足点:
City属性表示的信息都是一样的,所以对各个类对象讲重复了
如果现在假设将A 城市更名为B城市 并且此类产生了5000次要修改5000次,最好的解决办法是 将city修改成属性
会需要Static 关键子
package dom;
class Person{
private String name;
private int age ;
static String city=" A 城.";
public Person(String name,int age ){
this.name=name;
this.age =age;
}
public String getInfo(){
return "姓名:"+this.name +",年龄"+this.age+",城市"+city;
}
}
public class Text1{
public static void main(String[]args){
Person per1=new Person("张三",30);
Person per2=new Person("李四",30);
Person per3=new Person("王五",30);
System.out.println("信息修改之前..");
System.out.println(per1.getInfo());
System.out.println(per2.getInfo());
System.out.println(per3.getInfo());
per1.city=" B 城";
System.out.println(per1.getInfo());
System.out.println(per2.getInfo());
System.out.println(per3.getInfo());
}
}
一般情况下对于使用static 声明的属性都使用类名直接调用
类名程 static 属性
所以,以上的操作代码修改城市属性应该由Person 完成
Person.city=” B城 ”
public class Text1{
public static void main(String[]args){
Person per1=new Person("张三",30);
Person per2=new Person("李四",30);
Person per3=new Person("王五",30);
System.out.println("********信息修改之前******");
System.out.println(per1.getInfo());
System.out.println(per2.getInfo());
System.out.println(per3.getInfo());
Person.city=" B 城";
System.out.println("********信息修改之后******");
System.out.println(per1.getInfo());
System.out.println(per2.getInfo());
System.out.println(per3.getInfo());
}
}
Ststic 除了可以声明属性外还可以定义方法 ,使用Static 定义的方法可以由类名称直接调用
package dom;
class Person{
private String name;
private int age ;
private static String city=" A 城.";
public Person(String name,int age ){
this.name=name;
this.age =age;
}
public static void setCity(String c){
city=c;
}
public String getInfo(){
return "姓名:"+this.name +",年龄"+this.age+",城市"+city;
}
}
public class Text1{
public static void main(String[]args){
Person per1=new Person("张三",30);
Person per2=new Person("李四",30);
Person per3=new Person("王五",30);
System.out.println("********信息修改之前******");
System.out.println(per1.getInfo());
System.out.println(per2.getInfo());
System.out.println(per3.getInfo());
Person.setCity(" B 城");
System.out.println("********信息修改之后******");
System.out.println(per1.getInfo());
System.out.println(per2.getInfo());
System.out.println(per3.getInfo());
}
}
在使用静态方法的时候需要注意以下的几个方面
静态属性和方法可以在没有实例化的时候调用
而类中的普通方法和普通属性,肯定只有在对象的实例后才有可能调用。
public static void setCity(String c){
city=c;
this.name=name;
this.age =age;
}
在之前我门讲过想在主方法里直接调用方法
package dom;
public class Text1{
public static void main(String[]args){
fun();
}
public static void fun(){
System.out.println("Hello Word !!");
}
}
package dom;
public class Text1{
public static void main(String[]args){
new Text1.fun();
}
public void fun(){
System.out.println("Hello Word !!");
}
}
关于主方法:
Public static void main(){}
Public :表示最大的访问权限
Static :因为执行的时候执行的就是类名,表示雷鸣可以直接调用
Void : 因为主方法是一个起点,所以表示没有返回值得类型
Main :系统的内建方法名称
String []args 表示字符串,有系统参数
package dom;
public class Text1{
public static void main(String[]args){
for(int i=0 ;i<args.length ;i++ ){
System.out.println(args[i]);
}
}
}
/*
java Text1 jhgjk sdfds dsf dsf
:\java>java ddfg fdfg dfgdfg
hiuwhi
erfer
rw
用"hello word "表示一个参数
*/
堆内存:对象名称
栈内存:属性
全局代码区:保存所有操作方法
全局数据区:保存所有Static 属性